In TestsInSuiteValue, replace Target member with Label. This makes
TestsInSuiteValue serializable.
PiperOrigin-RevId: 196831698
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TestsInSuiteFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TestsInSuiteFunction.java
index 3e68de0..099ef64 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TestsInSuiteFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TestsInSuiteFunction.java
@@ -42,6 +42,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
import javax.annotation.Nullable;
/**
@@ -59,31 +60,35 @@
return null;
}
Rule testSuite = pkg.getPackage().getRule(expansion.getTestSuiteLabel().getName());
- ResolvedTargets<Target> result = computeTestsInSuite(env, testSuite, expansion.isStrict());
+ ResolvedTargets<Label> result = computeTestsInSuite(env, testSuite, expansion.isStrict());
if (env.valuesMissing()) {
return null;
}
return new TestsInSuiteValue(result);
}
+ private static Set<Label> toLabels(Set<Target> targets) {
+ return targets.stream().map(Target::getLabel).collect(Collectors.toSet());
+ }
+
/**
* Populates 'result' with all the tests associated with the specified 'testSuite'. Throws an
* exception if any target is missing.
*
* <p>CAUTION! Keep this logic consistent with {@code TestSuite}!
*/
- private static ResolvedTargets<Target> computeTestsInSuite(
+ private static ResolvedTargets<Label> computeTestsInSuite(
Environment env, Rule testSuite, boolean strict) throws InterruptedException {
- ResolvedTargets.Builder<Target> builder = ResolvedTargets.builder();
+ ResolvedTargets.Builder<Target> targetsBuilder = ResolvedTargets.builder();
List<Target> testsAndSuites = new ArrayList<>();
// Note that testsAndSuites can contain input file targets; the test_suite rule does not
// restrict the set of targets that can appear in tests or suites.
- builder.mergeError(getPrerequisites(env, testSuite, "tests", testsAndSuites));
+ targetsBuilder.mergeError(getPrerequisites(env, testSuite, "tests", testsAndSuites));
// 1. Add all tests
for (Target test : testsAndSuites) {
if (TargetUtils.isTestRule(test)) {
- builder.add(test);
+ targetsBuilder.add(test);
} else if (strict && !TargetUtils.isTestSuiteRule(test)) {
// If strict mode is enabled, then give an error for any non-test, non-test-suite targets.
// TODO(ulfjack): We need to throw to end the process if we happen to be in --nokeep_going,
@@ -92,25 +97,33 @@
"in test_suite rule '" + testSuite.getLabel()
+ "': expecting a test or a test_suite rule but '" + test.getLabel()
+ "' is not one."));
- builder.setError();
+ targetsBuilder.setError();
}
}
// 2. Add implicit dependencies on tests in same package, if any.
List<Target> implicitTests = new ArrayList<>();
- builder.mergeError(getPrerequisites(env, testSuite, "$implicit_tests", implicitTests));
+ targetsBuilder.mergeError(getPrerequisites(env, testSuite, "$implicit_tests", implicitTests));
for (Target target : implicitTests) {
// The Package construction of $implicit_tests ensures that this check never fails, but we
// add it here anyway for compatibility with future code.
if (TargetUtils.isTestRule(target)) {
- builder.add(target);
+ targetsBuilder.add(target);
}
}
// 3. Filter based on tags, size, env.
- filterTests(testSuite, builder);
+ filterTests(testSuite, targetsBuilder);
- // 4. Expand all suites recursively.
+ // 4. Expand all suites recursively, collecting labels.
+ ResolvedTargets<Target> targets = targetsBuilder.build();
+ ResolvedTargets.Builder<Label> labelsBuilder = ResolvedTargets.builder();
+ labelsBuilder.merge(
+ new ResolvedTargets<>(
+ toLabels(targets.getTargets()),
+ toLabels(targets.getFilteredTargets()),
+ targets.hasError()));
+
for (Target suite : testsAndSuites) {
if (TargetUtils.isTestSuiteRule(suite)) {
TestsInSuiteValue value =
@@ -118,11 +131,11 @@
if (value == null) {
continue;
}
- builder.merge(value.getTargets());
+ labelsBuilder.merge(value.getLabels());
}
}
- return builder.build();
+ return labelsBuilder.build();
}
/**