Loosen visibility of NodeEntrySubject and make ChainedFunction take an arbitrary Runnable for its notifying parts, rather than a CountDownLatch.

PiperOrigin-RevId: 229187454
diff --git a/src/test/java/com/google/devtools/build/skyframe/ChainedFunction.java b/src/test/java/com/google/devtools/build/skyframe/ChainedFunction.java
index 477d63f..37233f0 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ChainedFunction.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ChainedFunction.java
@@ -26,9 +26,9 @@
  */
 public final class ChainedFunction implements SkyFunction {
   @Nullable private final SkyValue value;
-  @Nullable private final CountDownLatch notifyStart;
+  private final Runnable notifyStart;
   @Nullable private final CountDownLatch waitToFinish;
-  @Nullable private final CountDownLatch notifyFinish;
+  private final Runnable notifyFinish;
   private final boolean waitForException;
   private final Iterable<SkyKey> deps;
 
@@ -40,6 +40,22 @@
       boolean waitForException,
       @Nullable SkyValue value,
       Iterable<SkyKey> deps) {
+    this(
+        makeRunnable(notifyStart),
+        waitToFinish,
+        makeRunnable(notifyFinish),
+        waitForException,
+        value,
+        deps);
+  }
+
+  private ChainedFunction(
+      Runnable notifyStart,
+      @Nullable CountDownLatch waitToFinish,
+      Runnable notifyFinish,
+      boolean waitForException,
+      @Nullable SkyValue value,
+      Iterable<SkyKey> deps) {
     this.notifyStart = notifyStart;
     this.waitToFinish = waitToFinish;
     this.notifyFinish = notifyFinish;
@@ -53,9 +69,7 @@
   public SkyValue compute(SkyKey key, SkyFunction.Environment env) throws GenericFunctionException,
       InterruptedException {
     try {
-      if (notifyStart != null) {
-        notifyStart.countDown();
-      }
+      notifyStart.run();
       if (waitToFinish != null) {
         TrackingAwaiter.INSTANCE.awaitLatchAndTrackExceptions(
             waitToFinish, key + " timed out waiting to finish");
@@ -77,18 +91,20 @@
       }
       return value;
     } finally {
-      if (notifyFinish != null) {
-        notifyFinish.countDown();
-      }
+      notifyFinish.run();
     }
   }
 
+  private static Runnable makeRunnable(@Nullable CountDownLatch latch) {
+    return latch != null ? latch::countDown : () -> {};
+  }
+
   /** Builder for {@link ChainedFunction} objects. */
   public static class Builder {
     @Nullable private SkyValue value;
-    @Nullable private CountDownLatch notifyStart;
+    Runnable notifyStart = makeRunnable(null);
     @Nullable private CountDownLatch waitToFinish;
-    @Nullable private CountDownLatch notifyFinish;
+    private Runnable notifyFinish = makeRunnable(null);
     private boolean waitForException;
     private Iterable<SkyKey> deps = ImmutableList.of();
 
@@ -97,7 +113,7 @@
       return this;
     }
 
-    public Builder setNotifyStart(CountDownLatch notifyStart) {
+    public Builder setNotifyStart(Runnable notifyStart) {
       this.notifyStart = notifyStart;
       return this;
     }
@@ -107,7 +123,7 @@
       return this;
     }
 
-    public Builder setNotifyFinish(CountDownLatch notifyFinish) {
+    public Builder setNotifyFinish(Runnable notifyFinish) {
       this.notifyFinish = notifyFinish;
       return this;
     }