diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java b/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java index 503cc825913a5f..73260031d8a9a6 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java @@ -54,6 +54,7 @@ public InstrumentedFilesInfoApi instrumentedFilesInfo( Object supportFiles, // Depset or Sequence of Dict environment, // Object extensions, + Sequence metadataFiles, // Sequence StarlarkThread thread) throws EvalException, TypeException { List extensionsList = @@ -81,7 +82,8 @@ public InstrumentedFilesInfoApi instrumentedFilesInfo( Sequence.cast(dependencyAttributes, String.class, "dependency_attributes"), supportFilesBuilder.build(), NestedSetBuilder.wrap(Order.COMPILE_ORDER, environmentPairs), - extensionsList); + extensionsList, + Sequence.cast(metadataFiles, Artifact.class, "metadata_files")); } /** @@ -109,7 +111,8 @@ public static InstrumentedFilesInfo createInstrumentedFilesInfo( dependencyAttributes, NestedSetBuilder.emptySet(Order.STABLE_ORDER), NestedSetBuilder.emptySet(Order.STABLE_ORDER), - extensions); + extensions, + null); } private static InstrumentedFilesInfo createInstrumentedFilesInfo( @@ -118,7 +121,8 @@ private static InstrumentedFilesInfo createInstrumentedFilesInfo( List dependencyAttributes, NestedSet supportFiles, NestedSet> environment, - @Nullable List extensions) { + @Nullable List extensions, + @Nullable List metadataFiles) { FileTypeSet fileTypeSet = FileTypeSet.ANY_FILE; if (extensions != null) { if (extensions.isEmpty()) { @@ -137,11 +141,12 @@ private static InstrumentedFilesInfo createInstrumentedFilesInfo( ruleContext, instrumentationSpec, InstrumentedFilesCollector.NO_METADATA_COLLECTOR, - /* rootFiles = */ ImmutableList.of(), - /* coverageSupportFiles = */ supportFiles, - /* coverageEnvironment = */ environment, - /* withBaselineCoverage = */ !TargetUtils.isTestRule(ruleContext.getTarget()), - /* reportedToActualSources= */ NestedSetBuilder.create(Order.STABLE_ORDER)); + /* rootFiles= */ ImmutableList.of(), + /* coverageSupportFiles= */ supportFiles, + /* coverageEnvironment= */ environment, + /* withBaselineCoverage= */ !TargetUtils.isTestRule(ruleContext.getTarget()), + /* reportedToActualSources= */ NestedSetBuilder.create(Order.STABLE_ORDER), + /* additionalMetadata= */ metadataFiles); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java index a129285d3778b9..b66d3527d25130 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java @@ -93,6 +93,17 @@ public interface CoverageCommonApi< positional = false, named = true, defaultValue = "None"), + @Param( + name = "metadata_files", + doc = + "Additional files required to generate coverage LCOV files after code execution." + + " e.g. .gcno files for C++.", + named = true, + positional = false, + defaultValue = "[]", + allowedTypes = { + @ParamType(type = Sequence.class, generic1 = FileApi.class), + }) }, useStarlarkThread = true) InstrumentedFilesInfoApi instrumentedFilesInfo( @@ -102,6 +113,7 @@ InstrumentedFilesInfoApi instrumentedFilesInfo( Object supportFiles, // Sequence or Depset of expected Dict environment, // Object extensions, + Sequence metadataFiles, StarlarkThread thread) throws EvalException, TypeException; } diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java index 49eef9661a1cad..3c3c8493863db6 100644 --- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java +++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java @@ -947,6 +947,8 @@ public void testInstrumentedFilesInfo_coverageEnabled() throws Exception { "load('//myinfo:myinfo.bzl', 'MyInfo')", "", "def custom_rule_impl(ctx):", + " metadata = ctx.actions.declare_file(ctx.label.name + '.metadata')", + " ctx.actions.write(metadata, '')", " return [", " coverage_common.instrumented_files_info(", " ctx,", @@ -966,6 +968,7 @@ public void testInstrumentedFilesInfo_coverageEnabled() throws Exception { // Missing attrs are ignored " 'missing_dep_attr',", " ],", + " metadata_files = [metadata],", " ),", " ]", "", @@ -1032,7 +1035,7 @@ public void testInstrumentedFilesInfo_coverageEnabled() throws Exception { assertThat( ActionsTestUtil.baseArtifactNames( ((Depset) myInfo.getValue("metadata_files")).getSet(Artifact.class))) - .containsExactly("label_dep.gcno", "label_list_dep.gcno", "dict_dep.gcno"); + .containsExactly("label_dep.gcno", "label_list_dep.gcno", "dict_dep.gcno", "cr.metadata"); ConfiguredTarget customRule = getConfiguredTarget("//test/starlark:cr"); assertThat( ActionsTestUtil.baseArtifactNames(