aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java26
-rw-r--r--src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java29
3 files changed, 68 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java
index d092d68c7b..f158adcc84 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java
@@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.NoBuildEvent;
import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent;
import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent;
import com.google.devtools.build.lib.buildtool.buildevent.ExecutionProgressReceiverAvailableEvent;
+import com.google.devtools.build.lib.buildtool.buildevent.TestFilteringCompleteEvent;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventKind;
import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent;
@@ -227,6 +228,18 @@ public class ExperimentalEventHandler extends BlazeCommandEventHandler {
refresh();
}
+ @Subscribe
+ public void testFilteringComplete(TestFilteringCompleteEvent event) {
+ stateTracker.testFilteringComplete(event);
+ refresh();
+ }
+
+ @Subscribe
+ public void testSummary(TestSummary event) {
+ stateTracker.testSummary(event);
+ refresh();
+ }
+
private void refresh() {
progressBarNeedsRefresh = true;
doRefresh();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java
index ef0afe2f7b..3085456ebf 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java
@@ -21,11 +21,13 @@ import com.google.devtools.build.lib.buildtool.ExecutionProgressReceiver;
import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent;
import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent;
import com.google.devtools.build.lib.buildtool.buildevent.ExecutionProgressReceiverAvailableEvent;
+import com.google.devtools.build.lib.buildtool.buildevent.TestFilteringCompleteEvent;
import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent;
import com.google.devtools.build.lib.skyframe.LoadingPhaseStartedEvent;
import com.google.devtools.build.lib.skyframe.LoadingProgressReceiver;
import com.google.devtools.build.lib.util.Clock;
import com.google.devtools.build.lib.util.io.AnsiTerminalWriter;
+import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus;
import java.io.IOException;
import java.util.ArrayDeque;
@@ -53,6 +55,9 @@ class ExperimentalStateTracker {
private final Map<String, Long> actionNanoStartTimes;
private int actionsCompleted;
+ private int totalTests;
+ private int completedTests;
+ private int failedTests;
private boolean ok;
private ExecutionProgressReceiver executionProgressReceiver;
@@ -156,6 +161,20 @@ class ExperimentalStateTracker {
}
}
+ public void testFilteringComplete(TestFilteringCompleteEvent event) {
+ if (event.getTestTargets() != null) {
+ totalTests = event.getTestTargets().size();
+ }
+ }
+
+ public synchronized void testSummary(TestSummary summary) {
+ completedTests++;
+ if (summary.getStatus() != BlazeTestStatus.PASSED) {
+ failedTests++;
+ }
+ }
+
+
/***
* Predicate indicating whether the contents of the progress bar can change, if the
* only thing that happens is that time passes; this is the case, e.g., if the progress
@@ -201,6 +220,13 @@ class ExperimentalStateTracker {
} else {
terminalWriter.okStatus().append("Building:");
}
+ if (completedTests > 0) {
+ terminalWriter.normal().append(" " + completedTests + " / " + totalTests + " tests");
+ if (failedTests > 0) {
+ terminalWriter.append(", ").failStatus().append("" + failedTests + " failed").normal();
+ }
+ terminalWriter.append(";");
+ }
if (runningActions.size() == 0) {
terminalWriter.normal().append(" no actions running");
} else if (runningActions.size() == 1) {
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
index eaf4a50904..bf53b692f1 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
@@ -17,11 +17,14 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
+import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.ActionCompletionEvent;
import com.google.devtools.build.lib.actions.ActionStartedEvent;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.Root;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.buildtool.buildevent.TestFilteringCompleteEvent;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.testutil.ManualClock;
import com.google.devtools.build.lib.util.io.AnsiTerminalWriter;
@@ -246,4 +249,30 @@ public class ExperimentalStateTrackerTest extends FoundationTestCase {
"Progress bar showing a running action should be time dependent",
stateTracker.progressBarTimeDependent());
}
+
+ @Test
+ public void testCountVisible() throws IOException {
+ // The test count should be visible in the status bar, as well as the short status bar
+ ManualClock clock = new ManualClock();
+ ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock);
+ TestFilteringCompleteEvent filteringComplete = Mockito.mock(TestFilteringCompleteEvent.class);
+ ConfiguredTarget targetA = Mockito.mock(ConfiguredTarget.class);
+ ConfiguredTarget targetB = Mockito.mock(ConfiguredTarget.class);
+ when(filteringComplete.getTestTargets()).thenReturn(ImmutableSet.of(targetA, targetB));
+ TestSummary testSummary = Mockito.mock(TestSummary.class);
+ stateTracker.testFilteringComplete(filteringComplete);
+ stateTracker.testSummary(testSummary);
+
+ LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter();
+ stateTracker.writeProgressBar(terminalWriter);
+ String output = terminalWriter.getWritten();
+ assertTrue(
+ "Test count should be visible in output: " + output, output.contains(" 1 / 2 tests"));
+
+ terminalWriter = new LoggingTerminalWriter();
+ stateTracker.writeProgressBar(terminalWriter, /* shortVersion=*/ true);
+ output = terminalWriter.getWritten();
+ assertTrue(
+ "Test count should be visible in short output: " + output, output.contains(" 1 / 2 tests"));
+ }
}