Pass through the clock to the ExperimentalStateTracker

In this way, the ExperimentalStateTracker has access to all the information needed
to provide information about the run-time of currently running actions.

--
Change-Id: I0f4e48f39e9ebe63555e4bb1d70df2a6dbb65430
Reviewed-on: https://bazel-review.googlesource.com/#/c/3204
MOS_MIGRATED_REVID=118929758
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
index cddb96c..d3d00b4 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -635,7 +635,7 @@
     EventHandler eventHandler;
     if (eventOptions.experimentalUi) {
       // The experimental event handler is not to be rate limited.
-      return new ExperimentalEventHandler(outErr, eventOptions);
+      return new ExperimentalEventHandler(outErr, eventOptions, runtime.getClock());
     } else if ((eventOptions.useColor() || eventOptions.useCursorControl())) {
       eventHandler = new FancyTerminalEventHandler(outErr, eventOptions);
     } else {
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 a67dc2a..0073c24 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
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventKind;
 import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent;
+import com.google.devtools.build.lib.util.Clock;
 import com.google.devtools.build.lib.util.io.AnsiTerminal;
 import com.google.devtools.build.lib.util.io.LineCountingAnsiTerminalWriter;
 import com.google.devtools.build.lib.util.io.LineWrappingAnsiTerminalWriter;
@@ -49,12 +50,13 @@
 
   public final int terminalWidth;
 
-  public ExperimentalEventHandler(OutErr outErr, BlazeCommandEventHandler.Options options) {
+  public ExperimentalEventHandler(
+      OutErr outErr, BlazeCommandEventHandler.Options options, Clock clock) {
     super(outErr, options);
     this.terminal = new AnsiTerminal(outErr.getErrorStream());
     this.terminalWidth = (options.terminalColumns > 0 ? options.terminalColumns : 80);
     this.debugAllEvents = options.experimentalUiDebugAllEvents;
-    this.stateTracker = new ExperimentalStateTracker();
+    this.stateTracker = new ExperimentalStateTracker(clock);
     this.numLinesProgressBar = 0;
   }
 
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 02086ba..7c0acb7 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
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent;
 import com.google.devtools.build.lib.buildtool.buildevent.ExecutionProgressReceiverAvailableEvent;
 import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent;
+import com.google.devtools.build.lib.util.Clock;
 import com.google.devtools.build.lib.util.io.AnsiTerminalWriter;
 
 import java.io.IOException;
@@ -40,6 +41,8 @@
   private String status;
   private String additionalMessage;
 
+  private final Clock clock;
+
   // currently running actions, using the path of the primary
   // output as unique identifier.
   private final Deque<String> runningActions;
@@ -50,10 +53,11 @@
 
   private ExecutionProgressReceiver executionProgressReceiver;
 
-  ExperimentalStateTracker() {
+  ExperimentalStateTracker(Clock clock) {
     this.runningActions = new ArrayDeque<>();
     this.actions = new TreeMap<>();
     this.ok = true;
+    this.clock = clock;
   }
 
   void buildStarted(BuildStartingEvent event) {
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 973b13a..0f833d1 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
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Root;
 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;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -94,8 +95,10 @@
     // somewhere in the progress bar.
 
     String message = "Building foo";
+    ManualClock clock = new ManualClock();
+    clock.advanceMillis(120000);
 
-    ExperimentalStateTracker stateTracker = new ExperimentalStateTracker();
+    ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock);
     stateTracker.actionStarted(new ActionStartedEvent(mockAction(message, "bar/foo"), 123456789));
     LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter();
     stateTracker.writeProgressBar(terminalWriter);
@@ -113,9 +116,11 @@
     String messageFast = "Running quick action";
     String messageSlow = "Running slow action";
 
+    ManualClock clock = new ManualClock();
+    clock.advanceMillis(120000);
     Action fastAction = mockAction(messageFast, "foo/fast");
     Action slowAction = mockAction(messageSlow, "bar/slow");
-    ExperimentalStateTracker stateTracker = new ExperimentalStateTracker();
+    ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock);
     stateTracker.actionStarted(new ActionStartedEvent(fastAction, 123456789));
     stateTracker.actionStarted(new ActionStartedEvent(slowAction, 123456999));
     stateTracker.actionCompletion(new ActionCompletionEvent(20, fastAction));
@@ -138,7 +143,9 @@
 
     String messageOld = "Running the first-started action";
 
-    ExperimentalStateTracker stateTracker = new ExperimentalStateTracker();
+    ManualClock clock = new ManualClock();
+    clock.advanceMillis(120000);
+    ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock);
     stateTracker.actionStarted(
         new ActionStartedEvent(mockAction(messageOld, "bar/foo"), 123456789));
     for (int i = 0; i < 30; i++) {