@Test
  public void testGenerateParseOneByteAtATime() {
    DataGenerator generator = new DataGenerator(new HeaderGenerator());

    final List<DataFrame> frames = new ArrayList<>();
    Parser parser =
        new Parser(
            new Parser.Listener.Adapter() {
              @Override
              public void onData(DataFrame frame) {
                frames.add(frame);
              }
            },
            4096,
            8192);

    ByteBuffer data = ByteBuffer.wrap(largeContent);
    List<ByteBuffer> list = generator.generateData(13, data.slice(), true, data.remaining());

    for (ByteBuffer buffer : list) {
      while (buffer.hasRemaining()) {
        parser.parse(ByteBuffer.wrap(new byte[] {buffer.get()}));
      }
    }

    Assert.assertEquals(largeContent.length, frames.size());
  }
  private List<DataFrame> testGenerateParse(ByteBuffer data) {
    DataGenerator generator = new DataGenerator(new HeaderGenerator());

    final List<DataFrame> frames = new ArrayList<>();
    Parser parser =
        new Parser(
            new Parser.Listener.Adapter() {
              @Override
              public void onData(DataFrame frame) {
                frames.add(frame);
              }
            },
            4096,
            8192);

    // Iterate a few times to be sure generator and parser are properly
    // reset.
    for (int i = 0; i < 2; ++i) {
      List<ByteBuffer> list = generator.generateData(13, data.slice(), true, data.remaining());

      frames.clear();
      for (ByteBuffer buffer : list) {
        parser.parse(buffer);
      }
    }

    return frames;
  }