SyntheticUnboundedSource extends UnboundedSource<KV<byte[], byte[]>, SyntheticRecordsCheckpoint> { @Override public Coder<SyntheticRecordsCheckpoint> getCheckpointMarkCoder() { return SyntheticRecordsCheckpoint.CODER; } SyntheticUnboundedSource(SyntheticSourceOptions sourceOptions); private  SyntheticUnboundedSource(
      long startOffset, long endOffset, SyntheticSourceOptions sourceOptions); @Override Coder<KV<byte[], byte[]>> getOutputCoder(); @Override void validate(); @Override Coder<SyntheticRecordsCheckpoint> getCheckpointMarkCoder(); @Override UnboundedReader<KV<byte[], byte[]>> createReader(
      PipelineOptions options, @Nullable SyntheticRecordsCheckpoint checkpoint); @Override List<SyntheticUnboundedSource> split(int desiredNumSplits, PipelineOptions options);  }
@Test public void checkpointCoderShouldBeSane() { CoderProperties.coderSerializable(source.getCheckpointMarkCoder()); }