diff --git a/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/tags.html b/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/tags.html index c4877759a029c8..47bfb59e7a4714 100644 --- a/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/tags.html +++ b/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/tags.html @@ -62,6 +62,14 @@ is enabled. +
requires-test-xml-generation marks test actions as requiring
+ Bazel to ensure that they produce test XML. With
+ --experimental_test_xml_missing_behavior=workaround and split
+ XML generation enabled, Bazel supervises these test actions and generates
+ missing XML in the test spawn, as it does when
+ --noexperimental_split_xml_generation is set.
+ block-network keyword blocks access to the external
network from inside the sandbox. In this case, only communication
with localhost is allowed. This tag only has an effect if sandboxing is
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ExecutionRequirements.java b/src/main/java/com/google/devtools/build/lib/actions/ExecutionRequirements.java
index 94576c64fa41c6..b13462b7e1a276 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ExecutionRequirements.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ExecutionRequirements.java
@@ -261,6 +261,9 @@ public enum WorkerProtocolFormat {
*/
public static final String REQUIRES_NETWORK = "requires-network";
+ /** Indicates that test actions need Bazel to ensure that they produce test XML. */
+ public static final String REQUIRES_TEST_XML_GENERATION = "requires-test-xml-generation";
+
/**
* Disables networking for a spawn if possible (only if sandboxing is enabled and if the sandbox
* supports it).
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
index c027d232af66a7..fd9e153e7eabac 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
@@ -27,6 +27,7 @@
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ArtifactRoot;
+import com.google.devtools.build.lib.actions.ExecutionRequirements;
import com.google.devtools.build.lib.analysis.Allowlist;
import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
@@ -305,7 +306,8 @@ private TestParams createTestAction()
inputsBuilder.add(testXmlGeneratorExecutable);
Artifact ensureXmlExecutable = null;
if (testConfiguration.getTestXmlMissingBehavior()
- == TestConfiguration.TestXmlMissingBehavior.WORKAROUND) {
+ == TestConfiguration.TestXmlMissingBehavior.WORKAROUND
+ && testProperties.getTags().contains(ExecutionRequirements.REQUIRES_TEST_XML_GENERATION)) {
ensureXmlExecutable = getEnsureXmlExecutable(actionOwner);
if (ensureXmlExecutable != null) {
inputsBuilder.add(ensureXmlExecutable);
diff --git a/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java b/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
index 0f7963bc965767..908a435f089747 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
@@ -885,6 +885,12 @@ private TestAttemptResult runTestAttempt(
String.format(
"Test action %s failed to produce test.xml", testAction.getOwner().getLabel());
TestXmlMissingBehavior missingBehavior = testAction.getTestXmlMissingBehavior();
+ if (missingBehavior == TestXmlMissingBehavior.WORKAROUND) {
+ missingXmlMessage +=
+ String.format(
+ "; add '%s' to the test target's tags attribute",
+ ExecutionRequirements.REQUIRES_TEST_XML_GENERATION);
+ }
if (missingBehavior == TestXmlMissingBehavior.FAIL
|| missingBehavior == TestXmlMissingBehavior.WORKAROUND) {
throw createTestExecException(TestAction.Code.MISSING_XML_OUTPUT, missingXmlMessage);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/test/TestActionBuilderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/test/TestActionBuilderTest.java
index dfdf56476004f9..242a42c9494c10 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/test/TestActionBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/test/TestActionBuilderTest.java
@@ -25,6 +25,7 @@
import com.google.common.eventbus.EventBus;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.actions.ExecutionRequirements;
import com.google.devtools.build.lib.actions.MiddlemanAction;
import com.google.devtools.build.lib.actions.RunfilesTree;
import com.google.devtools.build.lib.analysis.AnalysisResult;
@@ -774,6 +775,7 @@ public void testEnsureXmlWrapsRunUnderAndTest() throws Exception {
"foo_test(",
" name = 'test',",
" srcs = ['test.sh'],",
+ " tags = ['requires-test-xml-generation'],",
")");
scratch.file("xml_wrapper/test.sh", "#!/bin/sh", "exit 0");
useConfiguration(
@@ -786,6 +788,8 @@ public void testEnsureXmlWrapsRunUnderAndTest() throws Exception {
Artifact ensureXml = testAction.getEnsureXmlExecutable();
assertThat(ensureXml).isNotNull();
assertThat(testAction.getInputs().toList()).contains(ensureXml);
+ assertThat(testAction.getExecutionInfo())
+ .containsKey(ExecutionRequirements.REQUIRES_TEST_XML_GENERATION);
ImmutableList