WatermarkManager { public TransformWatermarks getWatermarks(ExecutableT executable) { return transformToWatermarks.get(executable); } private  WatermarkManager(
      Clock clock,
      ExecutableGraph<ExecutableT, CollectionT> graph,
      Function<ExecutableT, String> getName); static WatermarkManager<ExecutableT, ? super CollectionT> create(
          Clock clock,
          ExecutableGraph<ExecutableT, ? super CollectionT> graph,
          Function<ExecutableT, String> getName); TransformWatermarks getWatermarks(ExecutableT executable); void initialize(
      Map<ExecutableT, ? extends Iterable<Bundle<?, CollectionT>>> initialBundles); void updateWatermarks(
      @Nullable Bundle<?, ? extends CollectionT> completed,
      TimerUpdate timerUpdate,
      ExecutableT executable,
      @Nullable Bundle<?, ? extends CollectionT> unprocessedInputs,
      Iterable<? extends Bundle<?, ? extends CollectionT>> outputs,
      Instant earliestHold); synchronized void refreshAll(); Collection<FiredTimers<ExecutableT>> extractFiredTimers(
      Collection<ExecutableT> ignoredExecutables);  }
@Test public void getWatermarkForUntouchedTransform() { TransformWatermarks watermarks = manager.getWatermarks(graph.getProducer(impulse)); assertThat(watermarks.getInputWatermark(), equalTo(BoundedWindow.TIMESTAMP_MIN_VALUE)); assertThat(watermarks.getOutputWatermark(), equalTo(BoundedWindow.TIMESTAMP_MIN_VALUE)); }