private void assertIncoming(byte[] raw, String... expectedTextDatas) {
    WebSocketPolicy policy = WebSocketPolicy.newClientPolicy();

    DeflateFrameExtension ext = new DeflateFrameExtension();
    ext.setBufferPool(bufferPool);
    ext.setPolicy(policy);

    ExtensionConfig config = ExtensionConfig.parse("deflate-frame");
    ext.setConfig(config);

    // Setup capture of incoming frames
    IncomingFramesCapture capture = new IncomingFramesCapture();

    // Wire up stack
    ext.setNextIncomingFrames(capture);

    Parser parser = new UnitParser(policy);
    parser.configureFromExtensions(Collections.singletonList(ext));
    parser.setIncomingFramesHandler(ext);

    parser.parse(ByteBuffer.wrap(raw));

    int len = expectedTextDatas.length;
    capture.assertFrameCount(len);
    capture.assertHasFrame(OpCode.TEXT, len);

    int i = 0;
    for (WebSocketFrame actual : capture.getFrames()) {
      String prefix = "Frame[" + i + "]";
      Assert.assertThat(prefix + ".opcode", actual.getOpCode(), is(OpCode.TEXT));
      Assert.assertThat(prefix + ".fin", actual.isFin(), is(true));
      Assert.assertThat(
          prefix + ".rsv1", actual.isRsv1(), is(false)); // RSV1 should be unset at this point
      Assert.assertThat(prefix + ".rsv2", actual.isRsv2(), is(false));
      Assert.assertThat(prefix + ".rsv3", actual.isRsv3(), is(false));

      ByteBuffer expected = BufferUtil.toBuffer(expectedTextDatas[i], StandardCharsets.UTF_8);
      Assert.assertThat(
          prefix + ".payloadLength", actual.getPayloadLength(), is(expected.remaining()));
      ByteBufferAssert.assertEquals(prefix + ".payload", expected, actual.getPayload().slice());
      i++;
    }
  }
  @Test
  public void testCompress_TimeTimeTime() {
    // What pywebsocket produces for "time:", "time:", "time:"
    String expected[] = new String[] {"2AC9CC4DB50200", "2A01110000", "02130000"};

    // Lets see what we produce
    CapturedHexPayloads capture = new CapturedHexPayloads();
    DeflateFrameExtension ext = new DeflateFrameExtension();
    init(ext);
    ext.setNextOutgoingFrames(capture);

    ext.outgoingFrame(new TextFrame().setPayload("time:"), null);
    ext.outgoingFrame(new TextFrame().setPayload("time:"), null);
    ext.outgoingFrame(new TextFrame().setPayload("time:"), null);

    List<String> actual = capture.getCaptured();

    Assert.assertThat("Compressed Payloads", actual, contains(expected));
  }
  @Test
  public void testGeneratedTwoFrames() throws IOException {
    WebSocketPolicy policy = WebSocketPolicy.newClientPolicy();

    DeflateFrameExtension ext = new DeflateFrameExtension();
    ext.setBufferPool(bufferPool);
    ext.setPolicy(policy);
    ext.setConfig(new ExtensionConfig(ext.getName()));

    boolean validating = true;
    Generator generator = new Generator(policy, bufferPool, validating);
    generator.configureFromExtensions(Collections.singletonList(ext));

    OutgoingNetworkBytesCapture capture = new OutgoingNetworkBytesCapture(generator);
    ext.setNextOutgoingFrames(capture);

    ext.outgoingFrame(new TextFrame().setPayload("Hello"), null);
    ext.outgoingFrame(new TextFrame().setPayload("There"), null);

    capture.assertBytes(0, "c107f248cdc9c90700");
  }
  private void assertOutgoing(String text, String expectedHex) throws IOException {
    WebSocketPolicy policy = WebSocketPolicy.newClientPolicy();

    DeflateFrameExtension ext = new DeflateFrameExtension();
    ext.setBufferPool(bufferPool);
    ext.setPolicy(policy);

    ExtensionConfig config = ExtensionConfig.parse("deflate-frame");
    ext.setConfig(config);

    boolean validating = true;
    Generator generator = new Generator(policy, bufferPool, validating);
    generator.configureFromExtensions(Collections.singletonList(ext));

    OutgoingNetworkBytesCapture capture = new OutgoingNetworkBytesCapture(generator);
    ext.setNextOutgoingFrames(capture);

    Frame frame = new TextFrame().setPayload(text);
    ext.outgoingFrame(frame, null);

    capture.assertBytes(0, expectedHex);
  }
 private void init(DeflateFrameExtension ext) {
   ext.setConfig(new ExtensionConfig(ext.getName()));
   ext.setBufferPool(bufferPool);
 }