SimplePushbackSideInputDoFnRunner implements PushbackSideInputDoFnRunner<InputT, OutputT> { @Override public void finishBundle() { notReadyWindows = null; underlying.finishBundle(); } private  SimplePushbackSideInputDoFnRunner(
      DoFnRunner<InputT, OutputT> underlying,
      Collection<PCollectionView<?>> views,
      ReadyCheckingSideInputReader sideInputReader); static SimplePushbackSideInputDoFnRunner<InputT, OutputT> create(
      DoFnRunner<InputT, OutputT> underlying,
      Collection<PCollectionView<?>> views,
      ReadyCheckingSideInputReader sideInputReader); @Override DoFn<InputT, OutputT> getFn(); @Override void startBundle(); @Override Iterable<WindowedValue<InputT>> processElementInReadyWindows(WindowedValue<InputT> elem); @Override void onTimer(
      String timerId,
      String timerFamilyId,
      KeyT key,
      BoundedWindow window,
      Instant timestamp,
      Instant outputTimestamp,
      TimeDomain timeDomain); @Override void finishBundle();  }
@Test public void startFinishBundleDelegates() { PushbackSideInputDoFnRunner runner = createRunner(ImmutableList.of(singletonView)); assertThat(underlying.started, is(true)); assertThat(underlying.finished, is(false)); runner.finishBundle(); assertThat(underlying.finished, is(true)); }