Prevent users from using the WorkerTestStrategy unless they're running with the ExperimentalTestRunner.

--
PiperOrigin-RevId: 149636903
MOS_MIGRATED_REVID=149636903
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestActionBuilder.java
index b84be69..547d5ba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestActionBuilder.java
@@ -250,6 +250,16 @@
     List<Artifact> results = Lists.newArrayListWithCapacity(runsPerTest * shardRuns);
     ImmutableList.Builder<Artifact> coverageArtifacts = ImmutableList.builder();
 
+    boolean useExperimentalTestRunner = false;
+    if (ruleContext.attributes().has("use_testrunner", Type.BOOLEAN)) {
+      useExperimentalTestRunner =
+          ruleContext.attributes().get("use_testrunner", Type.BOOLEAN)
+              && ruleContext
+                  .attributes()
+                  .get("tags", Type.STRING_LIST)
+                  .contains("experimental_testrunner");
+    }
+
     for (int run = 0; run < runsPerTest; run++) {
       // Use a 1-based index for user friendliness.
       String testRunDir =
@@ -283,17 +293,13 @@
               targetName.getRelative(shardRunDir + "coverage.micro.dat"), root);
         }
 
-        boolean useTestRunner = false;
-        if (ruleContext.attributes().has("use_testrunner", Type.BOOLEAN)) {
-          useTestRunner = ruleContext.attributes().get("use_testrunner", Type.BOOLEAN);
-        }
         env.registerAction(new TestRunnerAction(
             ruleContext.getActionOwner(), inputs, testRuntime,
             testLog, cacheStatus,
             coverageArtifact, microCoverageArtifact,
             testProperties, testEnv, executionSettings,
             shard, run, config, ruleContext.getWorkspaceName(),
-            useTestRunner));
+            useExperimentalTestRunner));
         results.add(cacheStatus);
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java
index 4003cd1..a2eadfc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java
@@ -92,7 +92,7 @@
   private final int shardNum;
   private final int runNumber;
   private final String workspaceName;
-  private final boolean useTestRunner;
+  private final boolean useExperimentalTestRunner;
 
   // Mutable state related to test caching.
   private boolean checkedCaching = false;
@@ -132,7 +132,7 @@
       int runNumber,
       BuildConfiguration configuration,
       String workspaceName,
-      boolean useTestRunner) {
+      boolean useExperimentalTestRunner) {
     super(owner, inputs,
         // Note that this action only cares about the runfiles, not the mapping.
         new RunfilesSupplierImpl(new PathFragment("runfiles"), executionSettings.getRunfiles()),
@@ -172,7 +172,7 @@
     this.undeclaredOutputsAnnotationsPath = undeclaredOutputsAnnotationsDir.getChild("ANNOTATIONS");
     this.testInfrastructureFailure = baseDir.getChild("test.infrastructure_failure");
     this.workspaceName = workspaceName;
-    this.useTestRunner = useTestRunner;
+    this.useExperimentalTestRunner = useExperimentalTestRunner;
 
     Map<String, String> mergedTestEnv = new HashMap<>(configuration.getTestEnv());
     mergedTestEnv.putAll(extraTestEnv);
@@ -612,8 +612,8 @@
     return executionSettings;
   }
 
-  public boolean useTestRunner() {
-    return useTestRunner;
+  public boolean useExperimentalTestRunner() {
+    return useExperimentalTestRunner;
   }
 
   public boolean isSharded() {
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerTestStrategy.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerTestStrategy.java
index a3b8dff..82634a5 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerTestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerTestStrategy.java
@@ -83,9 +83,10 @@
       Spawn spawn,
       ActionExecutionContext actionExecutionContext)
       throws ExecException, InterruptedException, IOException {
-    if (!action.useTestRunner()) {
-      throw new UserExecException("Tests that do not use the default test runner are incompatible"
-          + " with the persistent worker test strategy. Please use another test strategy");
+    if (!action.useExperimentalTestRunner()) {
+      throw new UserExecException(
+          "Tests that do not use the experimental test runner are incompatible with the persistent"
+              + " worker test strategy. Please use another test strategy");
     }
     if (action.isCoverageMode()) {
       throw new UserExecException("Coverage is currently incompatible"
diff --git a/src/test/shell/bazel/persistent_test_runner_test.sh b/src/test/shell/bazel/persistent_test_runner_test.sh
index db7a15b..a6d5d6d 100755
--- a/src/test/shell/bazel/persistent_test_runner_test.sh
+++ b/src/test/shell/bazel/persistent_test_runner_test.sh
@@ -154,6 +154,7 @@
 java_test(name = "TestWithoutRunner",
           srcs = ['TestWithoutRunner.java'],
           use_testrunner = 0,
+          tags = ["experimental_testrunner"],
           main_class = "testrunners.TestWithoutRunner"
 )
 EOF
@@ -167,7 +168,46 @@
       || true
 
   expect_log \
-      "Tests that do not use the default test runner are incompatible with the persistent worker"
+      "Tests that do not use the experimental test runner are incompatible with the persistent worker"
+}
+
+function test_fail_without_experimental_testrunner() {
+  mkdir -p java/testrunners || fail "mkdir failed"
+
+  cat > java/testrunners/Tests.java <<EOF
+package testrunners;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.junit.Test;
+
+@RunWith(JUnit4.class)
+public class Tests {
+
+  @Test
+  public void testPass() {
+    // This passes
+  }
+}
+EOF
+
+  cat > java/testrunners/BUILD <<EOF
+java_test(name = "Tests",
+          srcs = ['Tests.java'],
+          deps = ['@bazel_tools//tools/jdk:TestRunner_deploy.jar'],
+)
+EOF
+
+  bazel test --no_cache_test_results //java/testrunners:Tests >& $TEST_log \
+      || fail "Normal test execution should pass."
+
+  bazel test --no_cache_test_results --test_strategy=experimental_worker >& $TEST_log \
+      //java/testrunners:Tests \
+      && fail "Test should have failed when running with an experimental runner." \
+      || true
+
+  expect_log \
+      "Tests that do not use the experimental test runner are incompatible with the persistent worker"
 }
 
 run_suite "Persistent Test Runner tests"