Declare TestConfiguration as a required fragment in the Java rules.

TestConfiguration is required to check in the Java rules implementation if the persistent test runner is enabled. The check avoids creating new data structures when the persistent test runner is disabled.

Requiring TestConfiguration in the Java rules is unfortunate, but it seems like a safe option. Moving the option --experimental_persistent_test_runner under JavaConfiguration is not possible because the option is used by the TestAction, which has to remain language-agnostic. An alternative is moving the option under CoreOptions, but that isn't accurate and pollutes the current curated set of core options.

PiperOrigin-RevId: 294923678
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
index 41762bf..105ce38 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
@@ -16,6 +16,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.RuleSet;
+import com.google.devtools.build.lib.analysis.test.TestConfiguration;
 import com.google.devtools.build.lib.bazel.rules.java.BazelJavaBinaryRule;
 import com.google.devtools.build.lib.bazel.rules.java.BazelJavaBuildInfoFactory;
 import com.google.devtools.build.lib.bazel.rules.java.BazelJavaImportRule;
@@ -63,6 +64,9 @@
   public void init(ConfiguredRuleClassProvider.Builder builder) {
     builder.addConfigurationOptions(JavaOptions.class);
     builder.addConfigurationFragment(new JavaConfigurationLoader());
+    // TestConfiguration is only required by the java rules to know when the persistent test runner
+    // is enabled.
+    builder.addConfigurationFragment(new TestConfiguration.Loader());
 
     builder.addBuildInfoFactory(new BazelJavaBuildInfoFactory());
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaBinaryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaBinaryRule.java
index 65c452c..60a5353 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaBinaryRule.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.analysis.test.TestConfiguration;
 import com.google.devtools.build.lib.bazel.rules.java.BazelJavaRuleClasses.BaseJavaBinaryRule;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.AttributeMap;
@@ -43,7 +44,12 @@
     <code>Main.java</code>, then your name could be <code>Main</code>.
     <!-- #END_BLAZE_RULE.NAME --> */
     return builder
-        .requiresConfigurationFragments(JavaConfiguration.class, CppConfiguration.class)
+        .requiresConfigurationFragments(
+            JavaConfiguration.class,
+            CppConfiguration.class,
+            // TestConfiguration is only required by the java rules to know when the persistent
+            // test runner is enabled.
+            TestConfiguration.class)
         /* <!-- #BLAZE_RULE(java_binary).IMPLICIT_OUTPUTS -->
         <ul>
           <li><code><var>name</var>.jar</code>: A Java archive, containing the class files and other
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
index cd6dab2..7faeaa6 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.analysis.config.ConfigAwareRuleClassBuilder;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
+import com.google.devtools.build.lib.analysis.test.TestConfiguration;
 import com.google.devtools.build.lib.bazel.rules.java.BazelJavaRuleClasses.JavaRule;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
@@ -43,7 +44,12 @@
         // For getting the host Java executable.
         .requiresHostConfigurationFragments(JavaConfiguration.class)
         .originalBuilder()
-        .requiresConfigurationFragments(JavaConfiguration.class, CppConfiguration.class)
+        .requiresConfigurationFragments(
+            JavaConfiguration.class,
+            CppConfiguration.class,
+            // TestConfiguration is only required by the java rules to know when the persistent test
+            // runner is enabled.
+            TestConfiguration.class)
         /* <!-- #BLAZE_RULE(java_library).IMPLICIT_OUTPUTS -->
         <ul>
           <li><code>lib<var>name</var>.jar</code>: A Java archive containing the class files.</li>
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
index 23d4872..9a7f068 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.analysis.test.TestConfiguration;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
 import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
@@ -35,7 +36,12 @@
   @Override
   public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
     return builder
-        .requiresConfigurationFragments(JavaConfiguration.class, CppConfiguration.class)
+        .requiresConfigurationFragments(
+            JavaConfiguration.class,
+            CppConfiguration.class,
+            // TestConfiguration is only required by the java rules to know when the persistent test
+            // runner is enabled.
+            TestConfiguration.class)
         /* <!-- #BLAZE_RULE($java_import_base).ATTRIBUTE(jars) -->
         The list of JAR files provided to Java targets that depend on this target.
         <!-- #END_BLAZE_RULE.ATTRIBUTE --> */