diff options
Diffstat (limited to 'src')
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")); + } } |