From 3f00727b700e5591218934d7a8df164cd572be65 Mon Sep 17 00:00:00 2001 From: dslomov Date: Mon, 3 Apr 2017 18:54:48 +0000 Subject: Add "--build_manual_tests" options that forces manual tests to be built. This is useful for IDEs and other tools utilizing command-line aspects for reflection over build graph. RELNOTES: None. PiperOrigin-RevId: 152038248 --- .../build/lib/pkgcache/LoadingOptions.java | 9 ++++ .../lib/skyframe/LegacyLoadingPhaseRunner.java | 8 ++-- .../build/lib/skyframe/SkyframeExecutor.java | 1 + .../lib/skyframe/TargetPatternPhaseFunction.java | 6 ++- .../lib/skyframe/TargetPatternPhaseValue.java | 16 ++++++-- .../build/lib/pkgcache/LoadingPhaseRunnerTest.java | 13 ++++++ .../lib/skyframe/TargetPatternPhaseKeyTest.java | 31 ++++++++++---- src/test/shell/integration/ide_info_generation.sh | 48 ++++++++++++++++++++++ 8 files changed, 116 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingOptions.java b/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingOptions.java index 63938e9677..b67eceea1e 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingOptions.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingOptions.java @@ -105,6 +105,15 @@ public class LoadingOptions extends OptionsBase { ) public List testLangFilterList; + @Option(name = "build_manual_tests", + defaultValue = "false", + category = "what", + help = "Forces test targets tagged 'manual' to be built. " + + "'manual' tests are excluded from processing. This option forces " + + "them to be built (but not executed)." + ) + public boolean buildManualTests; + // If this option is set, the value of experimental_interleave_loading_and_analysis is completely // ignored. This enables a different LoadingPhaseRunner implementation which doesn't implement // the loading phase at all, and therefore can't currently support the other flag. If we roll this diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/LegacyLoadingPhaseRunner.java b/src/main/java/com/google/devtools/build/lib/skyframe/LegacyLoadingPhaseRunner.java index b2e4b5efb3..1fd16b1989 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/LegacyLoadingPhaseRunner.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/LegacyLoadingPhaseRunner.java @@ -134,7 +134,7 @@ public final class LegacyLoadingPhaseRunner extends LoadingPhaseRunner { ResolvedTargets targets = getTargetsToBuild( parseFailureListener, targetPatterns, options.compileOneDependency, - options.buildTagFilterList, keepGoing); + options.buildTagFilterList, options.buildManualTests, keepGoing); ImmutableSet filteredTargets = targets.getFilteredTargets(); @@ -268,6 +268,7 @@ public final class LegacyLoadingPhaseRunner extends LoadingPhaseRunner { * @param targetPatterns the list of command-line target patterns specified by the user * @param compileOneDependency if true, enables alternative interpretation of targetPatterns; see * {@link LoadingOptions#compileOneDependency} + * @param buildManualTests * @throws TargetParsingException if parsing failed and !keepGoing */ private ResolvedTargets getTargetsToBuild( @@ -275,11 +276,12 @@ public final class LegacyLoadingPhaseRunner extends LoadingPhaseRunner { List targetPatterns, boolean compileOneDependency, List buildTagFilterList, - boolean keepGoing) + boolean buildManualTests, boolean keepGoing) throws TargetParsingException, InterruptedException { ResolvedTargets evaluated = targetPatternEvaluator.parseTargetPatternList(eventHandler, targetPatterns, - FilteringPolicies.FILTER_MANUAL, keepGoing); + buildManualTests ? FilteringPolicies.NO_FILTER : FilteringPolicies.FILTER_MANUAL, + keepGoing); ResolvedTargets result = ResolvedTargets.builder() .merge(evaluated) diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 8734f3b34b..fa7fccc86c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -1908,6 +1908,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { relativeWorkingDirectory.getPathString(), options.compileOneDependency, options.buildTestsOnly, determineTests, ImmutableList.copyOf(options.buildTagFilterList), + options.buildManualTests, TestFilter.forOptions(options, eventHandler, ruleClassNames)); EvaluationResult evalResult; eventHandler.post(new LoadingPhaseStartedEvent(packageProgress)); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java index 7a87ba202b..444fd4258a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java @@ -189,7 +189,11 @@ final class TargetPatternPhaseFunction implements SkyFunction { Environment env, TargetPatternList options) throws InterruptedException { List patternSkyKeys = new ArrayList<>(); for (TargetPatternSkyKeyOrException keyOrException : - TargetPatternValue.keys(options.getTargetPatterns(), FilteringPolicies.FILTER_MANUAL, + TargetPatternValue.keys( + options.getTargetPatterns(), + options.getBuildManualTests() + ? FilteringPolicies.NO_FILTER + : FilteringPolicies.FILTER_MANUAL, options.getOffset())) { try { patternSkyKeys.add(keyOrException.getSkyKey()); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java index 7238ddbb94..085eacdc31 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java @@ -130,7 +130,7 @@ public final class TargetPatternPhaseValue implements SkyValue { public static SkyKey key(ImmutableList targetPatterns, String offset, boolean compileOneDependency, boolean buildTestsOnly, boolean determineTests, ImmutableList buildTargetFilter, - @Nullable TestFilter testFilter) { + boolean buildManualTests, @Nullable TestFilter testFilter) { return SkyKey.create( SkyFunctions.TARGET_PATTERN_PHASE, new TargetPatternList( @@ -140,7 +140,7 @@ public final class TargetPatternPhaseValue implements SkyValue { buildTestsOnly, determineTests, buildTargetFilter, - testFilter)); + buildManualTests, testFilter)); } /** @@ -155,17 +155,20 @@ public final class TargetPatternPhaseValue implements SkyValue { private final boolean buildTestsOnly; private final boolean determineTests; private final ImmutableList buildTargetFilter; + private final boolean buildManualTests; @Nullable private final TestFilter testFilter; public TargetPatternList(ImmutableList targetPatterns, String offset, boolean compileOneDependency, boolean buildTestsOnly, boolean determineTests, - ImmutableList buildTargetFilter, @Nullable TestFilter testFilter) { + ImmutableList buildTargetFilter, boolean buildManualTests, + @Nullable TestFilter testFilter) { this.targetPatterns = Preconditions.checkNotNull(targetPatterns); this.offset = Preconditions.checkNotNull(offset); this.compileOneDependency = compileOneDependency; this.buildTestsOnly = buildTestsOnly; this.determineTests = determineTests; this.buildTargetFilter = Preconditions.checkNotNull(buildTargetFilter); + this.buildManualTests = buildManualTests; this.testFilter = testFilter; if (buildTestsOnly || determineTests) { Preconditions.checkNotNull(testFilter); @@ -196,6 +199,10 @@ public final class TargetPatternPhaseValue implements SkyValue { return buildTargetFilter; } + public boolean getBuildManualTests() { + return buildManualTests; + } + public TestFilter getTestFilter() { return testFilter; } @@ -217,7 +224,7 @@ public final class TargetPatternPhaseValue implements SkyValue { @Override public int hashCode() { return Objects.hash(targetPatterns, offset, compileOneDependency, buildTestsOnly, - determineTests, testFilter); + determineTests, buildManualTests, testFilter); } @Override @@ -235,6 +242,7 @@ public final class TargetPatternPhaseValue implements SkyValue { && other.buildTestsOnly == buildTestsOnly && other.determineTests == determineTests && other.buildTargetFilter.equals(buildTargetFilter) + && other.buildManualTests == buildManualTests && Objects.equals(other.testFilter, testFilter); } } diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java index 9b1b4dc214..9cf3254d92 100644 --- a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java +++ b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java @@ -230,6 +230,19 @@ public class LoadingPhaseRunnerTest { assertThat(tester.getTestFilteredTargets()).containsExactlyElementsIn(getTargets()); } + @Test + public void testTestFilteringIncludingManual() throws Exception { + writeBuildFilesForTestFiltering(); + tester.useLoadingOptions("--build_manual_tests"); + LoadingResult loadingResult = assertNoErrors(tester.loadTests("//tests:all")); + assertThat(loadingResult.getTargets()) + .containsExactlyElementsIn(getTargets("//tests:t1", "//tests:t2", "//tests:t3")); + assertThat(loadingResult.getTestsToRun()) + .containsExactlyElementsIn(getTargets("//tests:t1", "//tests:t2")); + assertThat(tester.getFilteredTargets()).containsExactlyElementsIn(getTargets()); + assertThat(tester.getTestFilteredTargets()).containsExactlyElementsIn(getTargets()); + } + @Test public void testTestFilteringBuildTestsOnly() throws Exception { writeBuildFilesForTestFiltering(); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseKeyTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseKeyTest.java index 3ac4ac9f31..a56466c01d 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseKeyTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseKeyTest.java @@ -51,32 +51,47 @@ public class TargetPatternPhaseKeyTest { .addEqualityGroup(of(ImmutableList.of("c"), "")) .addEqualityGroup(of(ImmutableList.of(), "")) .addEqualityGroup(of( - ImmutableList.of(), "", ImmutableList.of(), null, + ImmutableList.of(), "", ImmutableList.of(), false, null, COMPILE_ONE_DEPENDENCY)) .addEqualityGroup(of( - ImmutableList.of(), "", ImmutableList.of(), emptyTestFilter(), + ImmutableList.of(), "", ImmutableList.of(), true, null, + COMPILE_ONE_DEPENDENCY)) + .addEqualityGroup(of( + ImmutableList.of(), "", ImmutableList.of(), false, + emptyTestFilter(), + BUILD_TESTS_ONLY)) + .addEqualityGroup(of( + ImmutableList.of(), "", ImmutableList.of(), true, + emptyTestFilter(), BUILD_TESTS_ONLY)) .addEqualityGroup(of( - ImmutableList.of(), "", ImmutableList.of(), emptyTestFilter(), + ImmutableList.of(), "", ImmutableList.of(), false, + emptyTestFilter(), DETERMINE_TESTS)) - .addEqualityGroup(of( - ImmutableList.of(), "", ImmutableList.of("a"), null)) + .addEqualityGroup(of( + ImmutableList.of(), "", ImmutableList.of(), true, + emptyTestFilter(), + DETERMINE_TESTS)) + .addEqualityGroup(of( + ImmutableList.of(), "", ImmutableList.of("a"), false, null)) + .addEqualityGroup(of( + ImmutableList.of(), "", ImmutableList.of("a"), true, null)) .testEquals(); } private TargetPatternList of(ImmutableList targetPatterns, String offset, ImmutableList buildTagFilter, - @Nullable TestFilter testFilter, Flag... flags) { + boolean includeManualTests, @Nullable TestFilter testFilter, Flag... flags) { ImmutableSet set = ImmutableSet.copyOf(flags); boolean compileOneDependency = set.contains(Flag.COMPILE_ONE_DEPENDENCY); boolean buildTestsOnly = set.contains(Flag.BUILD_TESTS_ONLY); boolean determineTests = set.contains(Flag.DETERMINE_TESTS); return new TargetPatternList(targetPatterns, offset, compileOneDependency, buildTestsOnly, - determineTests, buildTagFilter, testFilter); + determineTests, buildTagFilter, includeManualTests, testFilter); } private TargetPatternList of(ImmutableList targetPatterns, String offset) { - return of(targetPatterns, offset, ImmutableList.of(), null); + return of(targetPatterns, offset, ImmutableList.of(), false, null); } private TestFilter emptyTestFilter() { diff --git a/src/test/shell/integration/ide_info_generation.sh b/src/test/shell/integration/ide_info_generation.sh index b860f42320..e2c116078b 100755 --- a/src/test/shell/integration/ide_info_generation.sh +++ b/src/test/shell/integration/ide_info_generation.sh @@ -268,4 +268,52 @@ EOF [ -e $COMPLEX_BUILD ] || fail "$COMPLEX_BUILD not found" } +function test_manual_tests() { + mkdir -p com/google/example/simple + cat > com/google/example/simple/Simple.java < com/google/example/complex/Complex.java < com/google/example/BUILD <