Add a flag to print the effective (Spawn)ActionContexts for debugging. By specifying the flag "--debug_print_action_contexts", Bazel will print the contents of the internal SpawnActionContext and ContextMap maps, which allows developers to see which kind of actions are run using which strategy. Example output of Bazel at HEAD: $ ./output/bazel build --debug_print_action_contexts INFO: SpawnActionContextMap: "" = LinuxSandboxedStrategy INFO: SpawnActionContextMap: "Closure" = WorkerSpawnStrategy INFO: SpawnActionContextMap: "Javac" = WorkerSpawnStrategy INFO: ContextMap: Context = BazelWorkspaceStatusActionContext INFO: ContextMap: CppCompileActionContext = SpawnGccStrategy INFO: ContextMap: CppLinkActionContext = SpawnLinkStrategy INFO: ContextMap: FileWriteActionContext = FileWriteStrategy INFO: ContextMap: FilesetActionContext = FilesetActionContextImpl INFO: ContextMap: IncludeScanningContext = DummyIncludeScanningContext INFO: ContextMap: SpawnActionContext = LinuxSandboxedStrategy INFO: ContextMap: SymlinkTreeActionContext = SymlinkTreeStrategy INFO: ContextMap: TestActionContext = ExclusiveTestStrategy (Can you spot the bug found by this feature here? The default TestActionContext is ExclusiveTestStrategy, which is probably not what we want.) -- PiperOrigin-RevId: 146233390 MOS_MIGRATED_REVID=146233390
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 1bcbec9..445140d 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -1162,13 +1162,16 @@ ":testutil", "//src/main/java/com/google/devtools/build/lib:bazel-rules", "//src/main/java/com/google/devtools/build/lib:build-base", + "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:inmemoryfs", "//src/main/java/com/google/devtools/build/lib:util", "//src/main/java/com/google/devtools/build/lib:vfs", "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/common/options", "//third_party:guava", "//third_party:junit4", + "//third_party:mockito", "//third_party:truth", "//third_party/protobuf", ],
diff --git a/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java new file mode 100644 index 0000000..105829a --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java
@@ -0,0 +1,85 @@ +// Copyright 2016 The Bazel Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.exec; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.actions.SpawnActionContext; +import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.analysis.config.BinTools; +import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.events.Reporter; +import com.google.devtools.build.lib.events.StoredEventHandler; +import com.google.devtools.build.lib.exec.util.TestExecutorBuilder; +import com.google.devtools.build.lib.testutil.Suite; +import com.google.devtools.build.lib.testutil.TestSpec; +import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem; +import com.google.devtools.common.options.OptionsParser; +import javax.annotation.Nullable; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mockito; + +/** Tests for {@link BlazeExecutor}. */ +@RunWith(JUnit4.class) +@TestSpec(size = Suite.SMALL_TESTS) +public class BlazeExecutorTest { + private BlazeDirectories directories; + private BinTools binTools; + + @Before + public final void setUpDirectoriesAndTools() throws Exception { + InMemoryFileSystem fs = new InMemoryFileSystem(); + directories = + new BlazeDirectories( + fs.getPath("/install"), + fs.getPath("/base"), + fs.getPath("/workspace"), + "mock-product-name"); + binTools = BinTools.empty(directories); + } + + @Test + public void testDebugPrintActionContexts() throws Exception { + TestExecutorBuilder builder = new TestExecutorBuilder(directories, binTools); + OptionsParser parser = OptionsParser.newOptionsParser(TestExecutorBuilder.DEFAULT_OPTIONS); + parser.parse("--debug_print_action_contexts"); + + Reporter reporter = new Reporter(); + StoredEventHandler storedEventHandler = new StoredEventHandler(); + reporter.addHandler(storedEventHandler); + + SpawnActionContext mockStrategy = Mockito.mock(SpawnActionContext.class); + + builder.setReporter(reporter).setOptionsParser(parser).setExecution("mock", mockStrategy); + builder.build(); + + Event event = + Iterables.find( + storedEventHandler.getEvents(), + new Predicate<Event>() { + @Override + public boolean apply(@Nullable Event event) { + return event.getMessage().contains("SpawnActionContextMap: \"mock\" = "); + } + }); + assertThat(event).isNotNull(); + assertThat(event.getMessage()) + .contains("\"mock\" = " + mockStrategy.getClass().getSimpleName()); + } +}
diff --git a/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java b/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java index 1459eb0..972fd9e 100644 --- a/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java +++ b/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java
@@ -95,11 +95,14 @@ } public BlazeExecutor build() throws ExecutorInitException { - return new BlazeExecutor(directories.getExecRoot(), reporter, bus, - BlazeClock.instance(), optionsParser, - optionsParser.getOptions(ExecutionOptions.class).verboseFailures, - optionsParser.getOptions(ExecutionOptions.class).showSubcommands, + return new BlazeExecutor( + directories.getExecRoot(), + reporter, + bus, + BlazeClock.instance(), + optionsParser, strategies, - ImmutableMap.copyOf(spawnStrategyMap), ImmutableList.<ActionContextProvider>of()); + ImmutableMap.copyOf(spawnStrategyMap), + ImmutableList.<ActionContextProvider>of()); } }
diff --git a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java index a456e06..d05a44e 100644 --- a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java +++ b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
@@ -102,8 +102,6 @@ bus, BlazeClock.instance(), optionsParser, - /* verboseFailures */ false, - /* showSubcommands */ false, ImmutableList.<ActionContext>of(), ImmutableMap.<String, SpawnActionContext>of( "",