Update StandaloneTestStrategy to use SpawnStrategyResolver.

Part of the roll-forward of https://github.com/bazelbuild/bazel/commit/37aeabcd39fe326d1c4e55693d8d207f9f7ac6c4.

PiperOrigin-RevId: 307109475
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 067f30b..4881a46 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
@@ -31,7 +31,6 @@
 import com.google.devtools.build.lib.actions.Spawn;
 import com.google.devtools.build.lib.actions.SpawnContinuation;
 import com.google.devtools.build.lib.actions.SpawnResult;
-import com.google.devtools.build.lib.actions.SpawnStrategy;
 import com.google.devtools.build.lib.actions.TestExecException;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
 import com.google.devtools.build.lib.analysis.test.TestAttempt;
@@ -304,10 +303,9 @@
               Reporter.outErrForReporter(actionExecutionContext.getEventHandler()), out);
     }
     long startTimeMillis = actionExecutionContext.getClock().currentTimeMillis();
+    SpawnStrategyResolver resolver = actionExecutionContext.getContext(SpawnStrategyResolver.class);
     SpawnContinuation spawnContinuation =
-        actionExecutionContext
-            .getContext(SpawnStrategy.class)
-            .beginExecution(spawn, actionExecutionContext.withFileOutErr(testOutErr));
+        resolver.beginExecution(spawn, actionExecutionContext.withFileOutErr(testOutErr));
     return new BazelTestAttemptContinuation(
         testAction,
         actionExecutionContext,
@@ -605,13 +603,14 @@
           && fileOutErr.getOutputPath().exists()
           && !xmlOutputPath.exists()) {
         Spawn xmlGeneratingSpawn = createXmlGeneratingSpawn(testAction, primaryResult);
-        SpawnStrategy strategy = actionExecutionContext.getContext(SpawnStrategy.class);
+        SpawnStrategyResolver spawnStrategyResolver =
+            actionExecutionContext.getContext(SpawnStrategyResolver.class);
         // We treat all failures to generate the test.xml here as catastrophic, and won't rerun
         // the test if this fails. We redirect the output to a temporary file.
         FileOutErr xmlSpawnOutErr = actionExecutionContext.getFileOutErr().childOutErr();
         try {
           SpawnContinuation xmlContinuation =
-              strategy.beginExecution(
+              spawnStrategyResolver.beginExecution(
                   xmlGeneratingSpawn, actionExecutionContext.withFileOutErr(xmlSpawnOutErr));
           return new BazelXmlCreationContinuation(
               resolvedPaths, xmlSpawnOutErr, builder, spawnResults, xmlContinuation);
diff --git a/src/test/java/com/google/devtools/build/lib/exec/StandaloneTestStrategyTest.java b/src/test/java/com/google/devtools/build/lib/exec/StandaloneTestStrategyTest.java
index f4c10df..2c5db86 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/StandaloneTestStrategyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/StandaloneTestStrategyTest.java
@@ -32,11 +32,13 @@
 import com.google.devtools.build.lib.actions.ActionInputPrefetcher;
 import com.google.devtools.build.lib.actions.ActionKeyContext;
 import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.actions.ExecutorInitException;
 import com.google.devtools.build.lib.actions.Spawn;
 import com.google.devtools.build.lib.actions.SpawnContinuation;
 import com.google.devtools.build.lib.actions.SpawnResult;
 import com.google.devtools.build.lib.actions.SpawnResult.Status;
 import com.google.devtools.build.lib.actions.SpawnStrategy;
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.test.TestActionContext;
 import com.google.devtools.build.lib.analysis.test.TestAttempt;
@@ -53,8 +55,10 @@
 import com.google.devtools.build.lib.events.EventKind;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.events.StoredEventHandler;
+import com.google.devtools.build.lib.exec.util.TestExecutorBuilder;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.util.io.FileOutErr;
+import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus;
@@ -92,10 +96,31 @@
     }
   }
 
-  private class FakeActionExecutionContext extends ActionExecutionContext {
-    private final SpawnStrategy spawnActionContext;
+  private static ActionContext.ActionContextRegistry toContextRegistry(
+      SpawnStrategy spawnStrategy,
+      BinTools binTools,
+      FileSystem fileSystem,
+      BlazeDirectories directories) {
+    try {
+      return new TestExecutorBuilder(fileSystem, directories, binTools)
+          .addStrategy(spawnStrategy, "mock")
+          .setDefaultStrategies("mock")
+          .build();
+    } catch (ExecutorInitException e) {
+      throw new AssertionError(e);
+    }
+  }
 
-    public FakeActionExecutionContext(FileOutErr fileOutErr, SpawnStrategy spawnActionContext) {
+  private class FakeActionExecutionContext extends ActionExecutionContext {
+    private final ActionContext.ActionContextRegistry actionContextRegistry;
+
+    public FakeActionExecutionContext(
+        FileOutErr fileOutErr, SpawnStrategy spawnStrategy, BinTools binTools) {
+      this(fileOutErr, toContextRegistry(spawnStrategy, binTools, fileSystem, directories));
+    }
+
+    public FakeActionExecutionContext(
+        FileOutErr fileOutErr, ActionContext.ActionContextRegistry actionContextRegistry) {
       super(
           /*executor=*/ null,
           /*actionInputFileCache=*/ null,
@@ -111,7 +136,7 @@
           /*actionFileSystem=*/ null,
           /*skyframeDepsResult=*/ null,
           NestedSetExpander.DEFAULT);
-      this.spawnActionContext = spawnActionContext;
+      this.actionContextRegistry = actionContextRegistry;
     }
 
     @Override
@@ -122,7 +147,7 @@
     @Override
     @Nullable
     public <T extends ActionContext> T getContext(Class<T> type) {
-      return SpawnStrategy.class.equals(type) ? type.cast(spawnActionContext) : null;
+      return actionContextRegistry.getContext(type);
     }
 
     @Override
@@ -137,17 +162,18 @@
 
     @Override
     public ActionExecutionContext withFileOutErr(FileOutErr fileOutErr) {
-      return new FakeActionExecutionContext(fileOutErr, spawnActionContext);
+      return new FakeActionExecutionContext(fileOutErr, actionContextRegistry);
     }
   }
 
-  @Mock private SpawnStrategy spawnActionContext;
+  @Mock private SpawnStrategy spawnStrategy;
 
   private StoredEventHandler storedEvents = new StoredEventHandler();
 
   @Before
   public final void setUp() throws Exception {
     MockitoAnnotations.initMocks(this);
+    when(spawnStrategy.canExec(any(), any())).thenReturn(true);
   }
 
   private FileOutErr createTempOutErr(Path tmpDirRoot) {
@@ -237,11 +263,11 @@
             .setWallTime(Duration.ofMillis(10))
             .setRunnerName("test")
             .build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .thenReturn(SpawnContinuation.immediate(expectedSpawnResult));
 
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnActionContext);
+        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnStrategy, binTools);
 
     // actual StandaloneTestStrategy execution
     List<SpawnResult> spawnResults =
@@ -304,14 +330,14 @@
             .setWallTime(Duration.ofMillis(15))
             .setRunnerName("test")
             .build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .thenReturn(
             SpawnContinuation.failedWithExecException(
                 new SpawnExecException("test failed", failSpawnResult, false)))
         .thenReturn(SpawnContinuation.immediate(passSpawnResult));
 
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnActionContext);
+        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnStrategy, binTools);
 
     // actual StandaloneTestStrategy execution
     List<SpawnResult> spawnResults =
@@ -374,11 +400,11 @@
             .setRunnerName("remote")
             .setExecutorHostname("a-remote-host")
             .build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .thenReturn(SpawnContinuation.immediate(expectedSpawnResult));
 
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnActionContext);
+        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnStrategy, binTools);
 
     // actual StandaloneTestStrategy execution
     List<SpawnResult> spawnResults =
@@ -433,11 +459,11 @@
             .setWallTime(Duration.ofMillis(10))
             .setRunnerName("remote cache")
             .build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .thenReturn(SpawnContinuation.immediate(expectedSpawnResult));
 
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnActionContext);
+        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnStrategy, binTools);
 
     // actual StandaloneTestStrategy execution
     List<SpawnResult> spawnResults =
@@ -492,7 +518,7 @@
             .setExitCode(1)
             .setRunnerName("test")
             .build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .thenAnswer(
             (invocation) -> {
               Spawn spawn = invocation.getArgument(0);
@@ -521,7 +547,7 @@
 
     FileOutErr outErr = createTempOutErr(tmpDirRoot);
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(outErr, spawnActionContext);
+        new FakeActionExecutionContext(outErr, spawnStrategy, binTools);
 
     // actual StandaloneTestStrategy execution
     List<SpawnResult> spawnResults =
@@ -590,7 +616,7 @@
             .setRunnerName("test")
             .build();
     List<FileOutErr> called = new ArrayList<>();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .thenAnswer(
             (invocation) -> {
               Spawn spawn = invocation.getArgument(0);
@@ -623,7 +649,7 @@
 
     FileOutErr outErr = createTempOutErr(tmpDirRoot);
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(outErr, spawnActionContext);
+        new FakeActionExecutionContext(outErr, spawnStrategy, binTools);
 
     // actual StandaloneTestStrategy execution
     List<SpawnResult> spawnResults =
@@ -674,12 +700,12 @@
 
     SpawnResult expectedSpawnResult =
         new SpawnResult.Builder().setStatus(Status.SUCCESS).setRunnerName("test").build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .thenReturn(SpawnContinuation.immediate(expectedSpawnResult));
 
     FileOutErr outErr = createTempOutErr(tmpDirRoot);
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(outErr, spawnActionContext);
+        new FakeActionExecutionContext(outErr, spawnStrategy, binTools);
 
     // actual StandaloneTestStrategy execution
     List<SpawnResult> spawnResults =
@@ -730,7 +756,7 @@
 
     SpawnResult expectedSpawnResult =
         new SpawnResult.Builder().setStatus(Status.SUCCESS).setRunnerName("test").build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .then(
             (invocation) -> {
               ((ActionExecutionContext) invocation.getArgument(1)).getFileOutErr().printErr("Foo");
@@ -739,7 +765,7 @@
 
     FileOutErr outErr = createTempOutErr(tmpDirRoot);
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(outErr, spawnActionContext);
+        new FakeActionExecutionContext(outErr, spawnStrategy, binTools);
 
     // actual StandaloneTestStrategy execution
     execute(testRunnerAction, actionExecutionContext, standaloneTestStrategy);
@@ -786,7 +812,7 @@
 
     SpawnResult expectedSpawnResult =
         new SpawnResult.Builder().setStatus(Status.SUCCESS).setRunnerName("test").build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .then(
             (invocation) -> {
               // Avoid triggering split XML generation by creating an empty XML file.
@@ -795,10 +821,10 @@
             });
 
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnActionContext);
+        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnStrategy, binTools);
     List<SpawnResult> resultA = execute(actionA, actionExecutionContext, standaloneTestStrategy);
     assertThat(cancelFuture.isCancelled()).isTrue();
-    verify(spawnActionContext).beginExecution(any(), any());
+    verify(spawnStrategy).beginExecution(any(), any());
     assertThat(resultA).hasSize(1);
     assertThat(standaloneTestStrategy.postedResult).isNotNull();
     assertThat(standaloneTestStrategy.postedResult.getData().getStatus())
@@ -808,7 +834,7 @@
     // Reset postedResult.
     standaloneTestStrategy.postedResult = null;
 
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .thenThrow(new AssertionError("failure: this should not have been called"));
     List<SpawnResult> resultB = execute(actionB, actionExecutionContext, standaloneTestStrategy);
     assertThat(resultB).isEmpty();
@@ -863,7 +889,7 @@
             .setExitCode(1)
             .setRunnerName("test")
             .build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .then(
             (invocation) -> {
               // Avoid triggering split XML generation by creating an empty XML file.
@@ -873,10 +899,10 @@
             });
 
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnActionContext);
+        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnStrategy, binTools);
     List<SpawnResult> resultA = execute(actionA, actionExecutionContext, standaloneTestStrategy);
     assertThat(cancelFuture.isCancelled()).isFalse();
-    verify(spawnActionContext).beginExecution(any(), any());
+    verify(spawnStrategy).beginExecution(any(), any());
     assertThat(resultA).hasSize(1);
     assertThat(standaloneTestStrategy.postedResult).isNotNull();
     assertThat(standaloneTestStrategy.postedResult.getData().getStatus())
@@ -889,7 +915,7 @@
 
     SpawnResult expectedSpawnResultB =
         new SpawnResult.Builder().setStatus(Status.SUCCESS).setRunnerName("test").build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .then(
             (invocation) -> {
               // Avoid triggering split XML generation by creating an empty XML file.
@@ -953,7 +979,7 @@
             .setExitCode(1)
             .setRunnerName("test")
             .build();
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .then(
             (invocation) -> {
               // Avoid triggering split XML generation by creating an empty XML file.
@@ -963,10 +989,10 @@
             });
 
     ActionExecutionContext actionExecutionContext =
-        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnActionContext);
+        new FakeActionExecutionContext(createTempOutErr(tmpDirRoot), spawnStrategy, binTools);
     List<SpawnResult> resultA = execute(actionA, actionExecutionContext, standaloneTestStrategy);
     assertThat(cancelFuture.isCancelled()).isFalse();
-    verify(spawnActionContext).beginExecution(any(), any());
+    verify(spawnStrategy).beginExecution(any(), any());
     assertThat(resultA).hasSize(1);
     assertThat(standaloneTestStrategy.postedResult).isNotNull();
     assertThat(standaloneTestStrategy.postedResult.getData().getStatus())
@@ -977,7 +1003,7 @@
     // Reset postedResult.
     standaloneTestStrategy.postedResult = null;
 
-    when(spawnActionContext.beginExecution(any(), any()))
+    when(spawnStrategy.beginExecution(any(), any()))
         .then(
             (invocation) -> {
               // Avoid triggering split XML generation by creating an empty XML file.