Provide more reporting options to SkyFunctions 

With more specific information to be reported by Skyfunctions, e.g.,
to inform the build-event protocol on missing files, the EventHandler
interface is no longer enough. Therefore, provide an enriched context
for reporting events.

--
Change-Id: I2d06166fe4d5b9054e24ad8c752fafc039e3f9f8
Reviewed-on: https://cr.bazel.build/8794
PiperOrigin-RevId: 148463437
MOS_MIGRATED_REVID=148463437
diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
index d11392e..92eeedf 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
@@ -23,6 +23,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.actions.AbstractAction;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
@@ -45,6 +46,8 @@
 import com.google.devtools.build.lib.analysis.actions.SpawnActionTemplate.OutputPathMapper;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
+import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.exec.SingleBuildFileCache;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.util.FileType;
@@ -149,8 +152,12 @@
       EvaluationResult<SkyValue> evaluationResult;
       Map<SkyKey, ValueOrUntypedException> result = new HashMap<>();
       try {
-        evaluationResult = driver.evaluate(depKeys, /*keepGoing=*/false,
-            ResourceUsage.getAvailableProcessors(), eventHandler);
+        evaluationResult =
+            driver.evaluate(
+                depKeys, /*keepGoing=*/
+                false,
+                ResourceUsage.getAvailableProcessors(),
+                new Reporter(new EventBus(), eventHandler));
       } catch (InterruptedException e) {
         Thread.currentThread().interrupt();
         for (SkyKey key : depKeys) {
@@ -175,7 +182,7 @@
     }
 
     @Override
-    public EventHandler getListener() {
+    public ExtendedEventHandler getListener() {
       return null;
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 0312811..98a91b8 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -280,8 +280,8 @@
     BuildConfiguration targetConfig =
         Iterables.getOnlyElement(masterConfig.getTargetConfigurations());
     if (useDynamicVersionIfEnabled && targetConfig.useDynamicConfigurations()) {
-      return skyframeExecutor.getConfigurationForTesting(eventCollector,
-          targetConfig.fragmentClasses(), targetConfig.getOptions());
+      return skyframeExecutor.getConfigurationForTesting(
+          reporter, targetConfig.fragmentClasses(), targetConfig.getOptions());
     } else {
       return targetConfig;
     }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index 50e591b..8291d8e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -47,7 +47,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -109,7 +109,7 @@
     }
 
     @Override
-    public EventHandler getEventHandler() {
+    public ExtendedEventHandler getEventHandler() {
       return original.getEventHandler();
     }
 
@@ -321,7 +321,7 @@
     }
 
     @Override
-    public EventHandler getEventHandler() {
+    public ExtendedEventHandler getEventHandler() {
       return null;
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 0e68cfa..5d475a2 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -89,7 +89,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
 import com.google.devtools.build.lib.flags.InvocationPolicyEnforcer;
@@ -1640,7 +1640,7 @@
     }
 
     @Override
-    public EventHandler getEventHandler() {
+    public ExtendedEventHandler getEventHandler() {
       return reporter;
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/events/EventSensorTest.java b/src/test/java/com/google/devtools/build/lib/events/EventSensorTest.java
index ff19a68..d765f23 100644
--- a/src/test/java/com/google/devtools/build/lib/events/EventSensorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/EventSensorTest.java
@@ -17,6 +17,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import com.google.common.eventbus.EventBus;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -37,7 +38,7 @@
   @Test
   public void sensorNoticesEventsInItsMask() {
     EventSensor sensor = new EventSensor(EventKind.ERRORS);
-    Reporter reporter = new Reporter(sensor);
+    Reporter reporter = new Reporter(new EventBus(), sensor);
     reporter.handle(Event.error(location, "An ERROR event."));
     assertTrue(sensor.wasTriggered());
   }
@@ -45,7 +46,7 @@
   @Test
   public void sensorNoticesEventsInItsMask2() {
     EventSensor sensor = new EventSensor(EventKind.ALL_EVENTS);
-    Reporter reporter = new Reporter(sensor);
+    Reporter reporter = new Reporter(new EventBus(), sensor);
     reporter.handle(Event.error(location, "An ERROR event."));
     reporter.handle(Event.warn(location, "A warning event."));
     assertTrue(sensor.wasTriggered());
@@ -54,7 +55,7 @@
   @Test
   public void sensorIgnoresEventsNotInItsMask() {
     EventSensor sensor = new EventSensor(EventKind.ERRORS_AND_WARNINGS);
-    Reporter reporter = new Reporter(sensor);
+    Reporter reporter = new Reporter(new EventBus(), sensor);
     reporter.handle(Event.info(location, "An INFO event."));
     assertFalse(sensor.wasTriggered());
   }
@@ -62,7 +63,7 @@
   @Test
   public void sensorCanCount() {
     EventSensor sensor = new EventSensor(EventKind.ERRORS_AND_WARNINGS);
-    Reporter reporter = new Reporter(sensor);
+    Reporter reporter = new Reporter(new EventBus(), sensor);
     reporter.handle(Event.error(location, "An ERROR event."));
     reporter.handle(Event.error(location, "Another ERROR event."));
     reporter.handle(Event.warn(location, "A warning event."));
diff --git a/src/test/java/com/google/devtools/build/lib/events/ReporterStreamTest.java b/src/test/java/com/google/devtools/build/lib/events/ReporterStreamTest.java
index 786a4de..6c0777a 100644
--- a/src/test/java/com/google/devtools/build/lib/events/ReporterStreamTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/ReporterStreamTest.java
@@ -15,15 +15,14 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
-
+import java.io.PrintWriter;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.PrintWriter;
-
 @RunWith(JUnit4.class)
 public class ReporterStreamTest {
 
@@ -33,7 +32,7 @@
 
   @Before
   public final void createOutputAppender() throws Exception  {
-    reporter = new Reporter();
+    reporter = new Reporter(new EventBus());
     out = new StringBuilder();
     outAppender = new EventHandler() {
       @Override
diff --git a/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java b/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
index d385a5d..27617cb 100644
--- a/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
@@ -17,7 +17,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.google.common.collect.ImmutableList;
-
+import com.google.common.eventbus.EventBus;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,7 +35,7 @@
 
   @Before
   public final void initializeOutput() throws Exception  {
-    reporter = new Reporter();
+    reporter = new Reporter(new EventBus());
     out = new StringBuilder();
     outAppender = new AbstractEventHandler(EventKind.ERRORS) {
       @Override
diff --git a/src/test/java/com/google/devtools/build/lib/events/SimpleReportersTest.java b/src/test/java/com/google/devtools/build/lib/events/SimpleReportersTest.java
index f7939ea..f99df10 100644
--- a/src/test/java/com/google/devtools/build/lib/events/SimpleReportersTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/SimpleReportersTest.java
@@ -15,6 +15,7 @@
 
 import static org.junit.Assert.assertEquals;
 
+import com.google.common.eventbus.EventBus;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -36,7 +37,7 @@
       }
     };
 
-    Reporter reporter = new Reporter(handler);
+    Reporter reporter = new Reporter(new EventBus(), handler);
     reporter.handle(Event.info(location, "Add to handlerCount."));
     reporter.handle(Event.info(location, "Add to handlerCount."));
     reporter.handle(Event.info(location, "Add to handlerCount."));
diff --git a/src/test/java/com/google/devtools/build/lib/events/util/EventCollectionApparatus.java b/src/test/java/com/google/devtools/build/lib/events/util/EventCollectionApparatus.java
index 05a5826..8d10452 100644
--- a/src/test/java/com/google/devtools/build/lib/events/util/EventCollectionApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/events/util/EventCollectionApparatus.java
@@ -13,6 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.events.util;
 
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventCollector;
 import com.google.devtools.build.lib.events.EventHandler;
@@ -22,7 +23,6 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.util.io.OutErr;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -45,7 +45,7 @@
   public EventCollectionApparatus(Set<EventKind> mask) {
     eventCollector = new EventCollector(mask);
     printingEventHandler = new PrintingEventHandler(EventKind.ERRORS_AND_WARNINGS_AND_OUTPUT);
-    reporter = new Reporter(eventCollector, printingEventHandler);
+    reporter = new Reporter(new EventBus(), eventCollector, printingEventHandler);
     this.setFailFast(true);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java
index 105829a..05c65a7 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/BlazeExecutorTest.java
@@ -17,6 +17,7 @@
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.actions.SpawnActionContext;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.config.BinTools;
@@ -60,7 +61,7 @@
     OptionsParser parser = OptionsParser.newOptionsParser(TestExecutorBuilder.DEFAULT_OPTIONS);
     parser.parse("--debug_print_action_contexts");
 
-    Reporter reporter = new Reporter();
+    Reporter reporter = new Reporter(new EventBus());
     StoredEventHandler storedEventHandler = new StoredEventHandler();
     reporter.addHandler(storedEventHandler);
 
diff --git a/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java b/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java
index 972fd9e..d18e004 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/util/TestExecutorBuilder.java
@@ -45,8 +45,8 @@
   public static final List<Class<? extends OptionsBase>> DEFAULT_OPTIONS = ImmutableList.of(
       ExecutionOptions.class, CommonCommandOptions.class);
   private final BlazeDirectories directories;
-  private Reporter reporter = new Reporter();
   private EventBus bus = new EventBus();
+  private Reporter reporter = new Reporter(bus);
   private OptionsParser optionsParser = OptionsParser.newOptionsParser(DEFAULT_OPTIONS);
   private List<ActionContext> strategies = new ArrayList<>();
   private Map<String, SpawnActionContext> spawnStrategyMap =
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
index 972b2fe..836ed6c 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
@@ -26,6 +26,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.events.Reporter;
@@ -70,7 +71,7 @@
 
     final Semaphore beforeError = new Semaphore(0);
     final Semaphore afterError = new Semaphore(0);
-    Reporter reporter = new Reporter();
+    Reporter reporter = new Reporter(new EventBus());
     ParsingTracker parser = new ParsingTracker(beforeError, afterError, reporter);
     final Logger log = Logger.getLogger(PackageFactory.class.getName());
     log.addHandler(parser);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
index 95d3c45..a2d34f3 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
@@ -22,6 +22,7 @@
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
@@ -32,14 +33,12 @@
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.Path;
-
+import java.util.HashMap;
+import java.util.Map;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.HashMap;
-import java.util.Map;
-
 @RunWith(JUnit4.class)
 public class RuleFactoryTest extends PackageLoadingTestCase {
 
@@ -67,7 +66,7 @@
             pkgBuilder,
             ruleClass,
             new BuildLangTypedAttributeValuesMap(attributeValues),
-            new Reporter(),
+            new Reporter(new EventBus()),
             /*ast=*/ null,
             LOCATION_42,
             /*env=*/ null,
@@ -128,7 +127,7 @@
             pkgBuilder,
             ruleClass,
             new BuildLangTypedAttributeValuesMap(attributeValues),
-            new Reporter(),
+            new Reporter(new EventBus()),
             /*ast=*/ null,
             Location.fromFileAndOffsets(myPkgPath.asFragment(), 42, 42),
             /*env=*/ null,
@@ -154,7 +153,7 @@
           pkgBuilder,
           ruleClass,
           new BuildLangTypedAttributeValuesMap(attributeValues),
-          new Reporter(),
+          new Reporter(new EventBus()),
           /*ast=*/ null,
           LOCATION_42,
           /*env=*/ null,
@@ -183,7 +182,7 @@
           pkgBuilder,
           ruleClass,
           new BuildLangTypedAttributeValuesMap(attributeValues),
-          new Reporter(),
+          new Reporter(new EventBus()),
           /*ast=*/ null,
           Location.fromFileAndOffsets(myPkgPath.asFragment(), 42, 42),
           /*env=*/ null,
@@ -223,7 +222,7 @@
           pkgBuilder,
           ruleClass,
           new BuildLangTypedAttributeValuesMap(attributeValues),
-          new Reporter(),
+          new Reporter(new EventBus()),
           /*ast=*/ null,
           Location.fromFileAndOffsets(myPkgPath.asFragment(), 42, 42),
           /*env=*/ null,
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
index 53f21bb..0258d52 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.ResolvedTargets;
 import com.google.devtools.build.lib.cmdline.TargetParsingException;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import com.google.devtools.build.lib.pkgcache.TargetProvider;
 import com.google.devtools.build.lib.skyframe.TestSuiteExpansionValue;
@@ -198,7 +198,7 @@
       TestTargetUtils.expandTestSuites(
           new TargetProvider() {
             @Override
-            public Target getTarget(EventHandler eventHandler, Label label)
+            public Target getTarget(ExtendedEventHandler eventHandler, Label label)
                 throws InterruptedException {
               throw new InterruptedException();
             }
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
index 8464cef..904a97f 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
@@ -20,20 +20,18 @@
 import com.google.devtools.build.lib.cmdline.ResolvedTargets;
 import com.google.devtools.build.lib.cmdline.TargetParsingException;
 import com.google.devtools.build.lib.events.DelegatingEventHandler;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import com.google.devtools.build.lib.util.Pair;
-
-import org.junit.Before;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
+import org.junit.Before;
 
 /**
  * Abstract framework for target pattern evaluation tests. The {@link TargetPatternEvaluatorTest}
@@ -45,17 +43,22 @@
   protected RecordingParsingListener parsingListener;
 
   protected static ResolvedTargets<Target> parseTargetPatternList(
-      TargetPatternEvaluator parser, EventHandler eventHandler,
-      List<String> targetPatterns, boolean keepGoing)
-          throws TargetParsingException, InterruptedException {
+      TargetPatternEvaluator parser,
+      ExtendedEventHandler eventHandler,
+      List<String> targetPatterns,
+      boolean keepGoing)
+      throws TargetParsingException, InterruptedException {
     return parseTargetPatternList(
         parser, eventHandler, targetPatterns, FilteringPolicies.NO_FILTER, keepGoing);
   }
 
   protected static ResolvedTargets<Target> parseTargetPatternList(
-      TargetPatternEvaluator parser, EventHandler eventHandler,
-      List<String> targetPatterns, FilteringPolicy policy,
-      boolean keepGoing) throws TargetParsingException, InterruptedException {
+      TargetPatternEvaluator parser,
+      ExtendedEventHandler eventHandler,
+      List<String> targetPatterns,
+      FilteringPolicy policy,
+      boolean keepGoing)
+      throws TargetParsingException, InterruptedException {
     return parser.parseTargetPatternList(eventHandler, targetPatterns, policy, keepGoing);
   }
 
@@ -98,7 +101,7 @@
       implements ParseFailureListener {
     protected final List<Pair<String, String>> events = new ArrayList<>();
 
-    private RecordingParsingListener(EventHandler delegate) {
+    private RecordingParsingListener(ExtendedEventHandler delegate) {
       super(delegate);
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
index 7527f88..de78d51 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
@@ -23,6 +23,7 @@
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Reporter;
@@ -449,7 +450,7 @@
     private final ManualClock clock;
     private final Path workspace;
     private final Path outputBase;
-    private final Reporter reporter = new Reporter();
+    private final Reporter reporter = new Reporter(new EventBus());
     private final SkyframeExecutor skyframeExecutor;
     private final List<Path> changes = new ArrayList<>();
     private boolean everythingModified = false;
@@ -588,8 +589,8 @@
           ImmutableMap.<String, String>of(),
           new TimestampGranularityMonitor(BlazeClock.instance()));
       skyframeExecutor.invalidateFilesUnderPathForTesting(
-          new Reporter(), modifiedFileSet, workspace);
-      ((SequencedSkyframeExecutor) skyframeExecutor).handleDiffs(new Reporter());
+          new Reporter(new EventBus()), modifiedFileSet, workspace);
+      ((SequencedSkyframeExecutor) skyframeExecutor).handleDiffs(new Reporter(new EventBus()));
 
       changes.clear();
     }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index 466e061..f25c425 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -547,7 +547,7 @@
         "    path = '/foo')");
     getSkyframeExecutor()
         .invalidateFilesUnderPathForTesting(
-            eventCollector,
+            reporter,
             new ModifiedFileSet.Builder().modify(new PathFragment("WORKSPACE")).build(),
             rootDirectory);
     FileSystemUtils.createDirectoryAndParents(scratch.resolve("/foo/bar"));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
index dbbcf49..50c3a2c 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
@@ -19,9 +19,11 @@
 import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.EvaluationResult;
@@ -139,7 +141,11 @@
     EvaluationResult<SkyValue> evaluationResult =
         getSkyframeExecutor()
             .getDriverForTesting()
-            .evaluate(singletonTargetPattern, keepGoing, LOADING_PHASE_THREADS, eventCollector);
+            .evaluate(
+                singletonTargetPattern,
+                keepGoing,
+                LOADING_PHASE_THREADS,
+                new Reporter(new EventBus(), eventCollector));
     // The evaluation has no errors if success was expected.
     assertThat(evaluationResult.hasError()).isNotEqualTo(successExpected);
     return Preconditions.checkNotNull(evaluationResult.getWalkableGraph());
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
index cda7fbc..0afcbed 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
@@ -22,8 +22,10 @@
 import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
 import com.google.devtools.build.lib.util.Preconditions;
@@ -208,7 +210,11 @@
     EvaluationResult<SkyValue> evaluationResult =
         getSkyframeExecutor()
             .getDriverForTesting()
-            .evaluate(singletonTargetPattern, keepGoing, LOADING_PHASE_THREADS, eventCollector);
+            .evaluate(
+                singletonTargetPattern,
+                keepGoing,
+                LOADING_PHASE_THREADS,
+                new Reporter(new EventBus(), eventCollector));
     // Currently all callers either expect success or pass keepGoing=true, which implies success,
     // since PrepareDepsOfPatternsFunction swallows all errors. Will need to be changed if a test
     // that evaluates with keepGoing=false and expects errors is added.
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/util/SkyframeExecutorTestUtils.java b/src/test/java/com/google/devtools/build/lib/skyframe/util/SkyframeExecutorTestUtils.java
index f0a81f1..21ba998 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/util/SkyframeExecutorTestUtils.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/util/SkyframeExecutorTestUtils.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetValue;
@@ -62,13 +62,13 @@
     return skyframeExecutor.getEvaluatorForTesting().getExistingErrorForTesting(key);
   }
 
-  /**
-   * Calls {@link MemoizingEvaluator#evaluate} on the given {@link SkyframeExecutor}'s
-   * graph.
-   */
+  /** Calls {@link MemoizingEvaluator#evaluate} on the given {@link SkyframeExecutor}'s graph. */
   public static <T extends SkyValue> EvaluationResult<T> evaluate(
-      SkyframeExecutor skyframeExecutor, SkyKey key, boolean keepGoing,
-      EventHandler errorEventListener) throws InterruptedException {
+      SkyframeExecutor skyframeExecutor,
+      SkyKey key,
+      boolean keepGoing,
+      ExtendedEventHandler errorEventListener)
+      throws InterruptedException {
     return skyframeExecutor.getDriverForTesting().evaluate(ImmutableList.of(key), keepGoing,
         SkyframeExecutor.DEFAULT_THREAD_COUNT, errorEventListener);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
index d05a44e..c9578bf 100644
--- a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
@@ -60,7 +60,8 @@
 @RunWith(JUnit4.class)
 public class StandaloneSpawnStrategyTest {
 
-  private Reporter reporter = new Reporter(PrintingEventHandler.ERRORS_AND_WARNINGS_TO_STDERR);
+  private Reporter reporter =
+      new Reporter(new EventBus(), PrintingEventHandler.ERRORS_AND_WARNINGS_TO_STDERR);
   private BlazeExecutor executor;
   private FileSystem fileSystem;
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
index 311922e..10da1ad 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
@@ -17,13 +17,13 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.EventKind;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -43,7 +43,7 @@
   private Lexer createLexer(String input) {
     PathFragment somePath = new PathFragment("/some/path.txt");
     ParserInputSource inputSource = ParserInputSource.create(input, somePath);
-    Reporter reporter = new Reporter();
+    Reporter reporter = new Reporter(new EventBus());
     reporter.addHandler(new EventHandler() {
       @Override
       public void handle(Event event) {
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java b/src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java
index 098a4dd..e333784 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/FoundationTestCase.java
@@ -15,6 +15,7 @@
 
 import static org.junit.Assert.fail;
 
+import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventCollector;
 import com.google.devtools.build.lib.events.EventHandler;
@@ -75,7 +76,7 @@
   @Before
   public final void initializeLogging() throws Exception {
     eventCollector = new EventCollector(EventKind.ERRORS_AND_WARNINGS);
-    reporter = new Reporter(eventCollector);
+    reporter = new Reporter(new EventBus(), eventCollector);
     reporter.addHandler(failFastHandler);
   }
 
diff --git a/src/test/java/com/google/devtools/build/skyframe/CyclesReporterTest.java b/src/test/java/com/google/devtools/build/skyframe/CyclesReporterTest.java
index ab17456..e009493 100644
--- a/src/test/java/com/google/devtools/build/skyframe/CyclesReporterTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/CyclesReporterTest.java
@@ -16,16 +16,14 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.events.NullEventHandler;
 import com.google.devtools.build.skyframe.CyclesReporter.SingleCycleReporter;
-
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.concurrent.atomic.AtomicBoolean;
-
 @RunWith(JUnit4.class)
 public class CyclesReporterTest {
 
@@ -44,13 +42,17 @@
 
   @Test
   public void notReportedAssertion() {
-    SingleCycleReporter singleReporter = new SingleCycleReporter() {
-      @Override
-      public boolean maybeReportCycle(SkyKey topLevelKey, CycleInfo cycleInfo,
-          boolean alreadyReported, EventHandler eventHandler) {
-        return false;
-      }
-    };
+    SingleCycleReporter singleReporter =
+        new SingleCycleReporter() {
+          @Override
+          public boolean maybeReportCycle(
+              SkyKey topLevelKey,
+              CycleInfo cycleInfo,
+              boolean alreadyReported,
+              ExtendedEventHandler eventHandler) {
+            return false;
+          }
+        };
 
     CycleInfo cycleInfo = new CycleInfo(ImmutableList.of(DUMMY_KEY));
     CyclesReporter cyclesReporter = new CyclesReporter(singleReporter);
@@ -66,14 +68,18 @@
   @Test
   public void smoke() {
     final AtomicBoolean reported = new AtomicBoolean();
-    SingleCycleReporter singleReporter = new SingleCycleReporter() {
-      @Override
-      public boolean maybeReportCycle(SkyKey topLevelKey, CycleInfo cycleInfo,
-          boolean alreadyReported, EventHandler eventHandler) {
-        reported.set(true);
-        return true;
-      }
-    };
+    SingleCycleReporter singleReporter =
+        new SingleCycleReporter() {
+          @Override
+          public boolean maybeReportCycle(
+              SkyKey topLevelKey,
+              CycleInfo cycleInfo,
+              boolean alreadyReported,
+              ExtendedEventHandler eventHandler) {
+            reported.set(true);
+            return true;
+          }
+        };
 
     CycleInfo cycleInfo = new CycleInfo(ImmutableList.of(DUMMY_KEY));
     CyclesReporter cyclesReporter = new CyclesReporter(singleReporter);
diff --git a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
index 428bff5..cfb656b 100644
--- a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
@@ -27,6 +27,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
+import com.google.common.eventbus.EventBus;
 import com.google.common.testing.GcFinalization;
 import com.google.devtools.build.lib.concurrent.AbstractQueueVisitor;
 import com.google.devtools.build.lib.events.Reporter;
@@ -137,7 +138,7 @@
 
   protected <T extends SkyValue> EvaluationResult<T> eval(boolean keepGoing, SkyKey... keys)
     throws InterruptedException {
-    Reporter reporter = new Reporter();
+    Reporter reporter = new Reporter(new EventBus());
     ParallelEvaluator evaluator =
         new ParallelEvaluator(
             graph,
diff --git a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
index 23200e2..461047d 100644
--- a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
@@ -38,13 +38,15 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.eventbus.EventBus;
 import com.google.common.testing.GcFinalization;
 import com.google.common.util.concurrent.Uninterruptibles;
 import com.google.devtools.build.lib.events.DelegatingEventHandler;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventCollector;
-import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.EventKind;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
+import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.testutil.TestThread;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.Preconditions;
@@ -82,7 +84,7 @@
 
   protected MemoizingEvaluatorTester tester;
   private EventCollector eventCollector;
-  private EventHandler reporter;
+  private ExtendedEventHandler reporter;
   protected MemoizingEvaluator.EmittedEventState emittedEventState;
 
   // Knobs that control the size / duration of larger tests.
@@ -136,7 +138,7 @@
 
   private void initializeReporter() {
     eventCollector = new EventCollector();
-    reporter = eventCollector;
+    reporter = new Reporter(new EventBus(), eventCollector);
     tester.resetPlayedEvents();
   }
 
diff --git a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
index 0aeebc9..2097852 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -35,11 +35,14 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.google.common.eventbus.EventBus;
 import com.google.common.util.concurrent.Uninterruptibles;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventCollector;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.EventKind;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
+import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.testutil.TestThread;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.skyframe.GraphTester.StringValue;
@@ -96,10 +99,11 @@
       EventFilter storedEventFilter) {
     Version oldGraphVersion = graphVersion;
     graphVersion = graphVersion.next();
-    return new ParallelEvaluator(graph,
+    return new ParallelEvaluator(
+        graph,
         oldGraphVersion,
         builders,
-        eventCollector,
+        new Reporter(new EventBus(), eventCollector),
         new MemoizingEvaluator.EmittedEventState(),
         storedEventFilter,
         keepGoing,
@@ -1838,12 +1842,15 @@
       }
     };
 
-    EventHandler reporter = new EventHandler() {
-      @Override
-      public void handle(Event e) {
-        throw new IllegalStateException();
-      }
-    };
+    ExtendedEventHandler reporter =
+        new Reporter(
+            new EventBus(),
+            new EventHandler() {
+              @Override
+              public void handle(Event e) {
+                throw new IllegalStateException();
+              }
+            });
 
     MemoizingEvaluator aug = new InMemoryMemoizingEvaluator(
         ImmutableMap.of(GraphTester.NODE_TYPE, tester.getFunction()), new RecordingDifferencer(),