Provide clearer build event proto output for Starlark flags. Context: https://docs.bazel.build/versions/master/build-event-protocol.html. Starlark flags are both options and targets. Current BEP output includes them in "target_configured" and similar messages, which are really intended to track which of a build's requested targets succeed and fail. Even though Starlark flags are technically loaded and processed as targets, log and error reporting should treat them as options. PiperOrigin-RevId: 346330399
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/BUILD b/src/test/java/com/google/devtools/build/lib/starlark/BUILD index b12055a..71a2830 100644 --- a/src/test/java/com/google/devtools/build/lib/starlark/BUILD +++ b/src/test/java/com/google/devtools/build/lib/starlark/BUILD
@@ -52,6 +52,7 @@ "//src/main/java/com/google/devtools/build/lib/collect/nestedset", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/packages", + "//src/main/java/com/google/devtools/build/lib/pkgcache", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation", "//src/main/java/com/google/devtools/build/lib/rules/objc",
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkOptionsParsingTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkOptionsParsingTest.java index 42ef9a8..aba35319 100644 --- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkOptionsParsingTest.java +++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkOptionsParsingTest.java
@@ -18,12 +18,21 @@ import static org.junit.Assert.assertThrows; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.events.ExtendedEventHandler; +import com.google.devtools.build.lib.events.ExtendedEventHandler.Postable; +import com.google.devtools.build.lib.pkgcache.TargetParsingCompleteEvent; import com.google.devtools.build.lib.runtime.StarlarkOptionsParser; import com.google.devtools.build.lib.starlark.util.StarlarkOptionsTestCase; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.common.options.OptionsParsingException; import com.google.devtools.common.options.OptionsParsingResult; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; import net.starlark.java.eval.StarlarkInt; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -32,6 +41,30 @@ @RunWith(JUnit4.class) public class StarlarkOptionsParsingTest extends StarlarkOptionsTestCase { + private List<Postable> postedEvents; + + @Before + public void addPostableEventHandler() { + postedEvents = new ArrayList<>(); + reporter.addHandler( + new ExtendedEventHandler() { + @Override + public void post(Postable obj) { + postedEvents.add(obj); + } + + @Override + public void handle(Event event) {} + }); + } + + /** Returns only the posted events of the given class. */ + private List<Postable> eventsOfType(Class<? extends Postable> clazz) { + return postedEvents.stream() + .filter(event -> event.getClass().equals(clazz)) + .collect(Collectors.toList()); + } + // test --flag=value @Test public void testFlagEqualsValueForm() throws Exception { @@ -331,4 +364,51 @@ assertThat(residueAndStarlarkOptions.getSecond()) .containsExactly("some-random-residue", "--mangled//external/starlark/option"); } + + /** + * When Starlark flags are only set as flags, they shouldn't produce {@link + * TargetParsingCompleteEvent}s. That's intended to communicate (to the build event protocol) + * which of the targets in {@code blaze build //foo:all //bar:all} were built. + */ + @Test + public void testExpectedBuildEventOutput_asFlag() throws Exception { + writeBasicIntFlag(); + scratch.file("blah/BUILD", "cc_library(name = 'mylib')"); + useConfiguration(ImmutableMap.of("//test:my_int_setting", "15")); + update( + ImmutableList.of("//blah:mylib"), + /*keepGoing=*/ false, + /*loadingPhaseThreads=*/ LOADING_PHASE_THREADS, + /*doAnalysis*/ true, + eventBus); + List<Postable> targetParsingCompleteEvents = eventsOfType(TargetParsingCompleteEvent.class); + assertThat(targetParsingCompleteEvents).hasSize(1); + assertThat( + ((TargetParsingCompleteEvent) targetParsingCompleteEvents.get(0)) + .getOriginalTargetPattern()) + .containsExactly("//blah:mylib"); + } + + /** + * But Starlark are also targets. When they're requested as normal build targets they should + * produce {@link TargetParsingCompleteEvent} just like any other target. + */ + @Test + public void testExpectedBuildEventOutput_asTarget() throws Exception { + writeBasicIntFlag(); + scratch.file("blah/BUILD", "cc_library(name = 'mylib')"); + useConfiguration(ImmutableMap.of("//test:my_int_setting", "15")); + update( + ImmutableList.of("//blah:mylib", "//test:my_int_setting"), + /*keepGoing=*/ false, + /*loadingPhaseThreads=*/ LOADING_PHASE_THREADS, + /*doAnalysis*/ true, + eventBus); + List<Postable> targetParsingCompleteEvents = eventsOfType(TargetParsingCompleteEvent.class); + assertThat(targetParsingCompleteEvents).hasSize(1); + assertThat( + ((TargetParsingCompleteEvent) targetParsingCompleteEvents.get(0)) + .getOriginalTargetPattern()) + .containsExactly("//blah:mylib", "//test:my_int_setting"); + } }