aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google
diff options
context:
space:
mode:
authorGravatar Klaus Aehlig <aehlig@google.com>2017-10-16 12:32:20 +0200
committerGravatar Jakob Buchgraber <buchgr@google.com>2017-10-16 17:49:00 +0200
commitdeea6b08efef98ae2ef03d516356ab3438d089c8 (patch)
tree7a94d37a405e2a13c188e2f26bcde8309dfe70a0 /src/test/java/com/google
parent9c7a51e3632cdc54fbc859570ad125f06a6c7c75 (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.java29
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();
+ }
}