diff options
author | Klaus Aehlig <aehlig@google.com> | 2017-10-16 12:32:20 +0200 |
---|---|---|
committer | Jakob Buchgraber <buchgr@google.com> | 2017-10-16 17:49:00 +0200 |
commit | deea6b08efef98ae2ef03d516356ab3438d089c8 (patch) | |
tree | 7a94d37a405e2a13c188e2f26bcde8309dfe70a0 /src/test/java/com/google | |
parent | 9c7a51e3632cdc54fbc859570ad125f06a6c7c75 (diff) |
BuildEventStreamer: clear a pending BuildStarted event first
If we receive an event indicating that the build is over, we first
post that event and then clear up all pending event by stating that
their prerequisite event was aborted (which we can safely assert, as
we know we will not process any further events).
Now, if a build is aborted (e.g., user interruption) before the build
starting event is generated, the streamer can receive a build-finished
event while still having an event (e.g., the raw command line) blocked
on the build-starting event. So the canonical order of clearing the stream
would send a build-finished event before the build-starting event, which
can be confusing to consumers of the stream. Therefore, if have to generate
an artificial aborted build-starting event, do so first (including clearing
the events blocked on the build-starting event) and only afterwards post
the build-finished event in the stream.
Change-Id: Ib33f16f74b7bee7a963df94bbcad7a56db9f07e3
PiperOrigin-RevId: 172305114
Diffstat (limited to 'src/test/java/com/google')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java index 2c5a263fc2..452384de81 100644 --- a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java +++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java @@ -734,4 +734,33 @@ public class BuildEventStreamerTest extends FoundationTestCase { verify(outErr, times(1)).getOut(); verify(outErr, times(1)).getErr(); } + + @Test + public void testEarlyAbort() throws Exception { + // For a build that is aborted before a build-started event is generated, + // we still expect that, if a build-started event is forced by some order + // constraint (e.g., CommandLine wants to come after build started), then + // that gets sorted to the beginning. + RecordingBuildEventTransport transport = new RecordingBuildEventTransport(); + BuildEventStreamer streamer = + new BuildEventStreamer(ImmutableSet.<BuildEventTransport>of(transport), reporter); + + BuildEvent orderEvent = + new GenericOrderEvent( + testId("event depending on start"), + ImmutableList.of(), + ImmutableList.of(BuildEventId.buildStartedId())); + + streamer.buildEvent(orderEvent); + streamer.buildEvent(new BuildCompleteEvent(new BuildResult(0))); + + List<BuildEvent> eventsSeen = transport.getEvents(); + assertThat(eventsSeen).hasSize(4); + assertThat(eventsSeen.get(0).getEventId()).isEqualTo(BuildEventId.buildStartedId()); + assertThat(eventsSeen.get(1).getEventId()).isEqualTo(orderEvent.getEventId()); + assertThat(ImmutableSet.of(eventsSeen.get(2).getEventId(), eventsSeen.get(3).getEventId())) + .isEqualTo( + ImmutableSet.of(BuildEventId.buildFinished(), ProgressEvent.INITIAL_PROGRESS_UPDATE)); + assertThat(transport.getEventProtos().get(3).getLastMessage()).isTrue(); + } } |