@Override
  public SyntheticSourceReader createReader(PipelineOptions pipelineOptions) {
    return new SyntheticSourceReader(this);
  }
@Test
  public void testIncreasingProgress() throws Exception {
    PipelineOptions options = PipelineOptionsFactory.create();
    testSourceOptions.progressShape = ProgressShape.LINEAR;
    SyntheticBoundedSource source = new SyntheticBoundedSource(testSourceOptions);
    BoundedSource.BoundedReader<KV<byte[], byte[]>> reader = source.createReader(options);
    // Reader starts at 0.0 progress.
    assertEquals(0, reader.getFractionConsumed(), 1e-5);
    // Set the lastFractionConsumed < 0.0 so that we can use strict inequality in the below loop.
    double lastFractionConsumed = -1.0;
    for (boolean more = reader.start(); more; more = reader.advance()) {
      assertTrue(reader.getFractionConsumed() > lastFractionConsumed);
      lastFractionConsumed = reader.getFractionConsumed();
    }
    assertEquals(1, reader.getFractionConsumed(), 1e-5);
  }