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.