/** Incoming PING (Control Frame) should pass through extension unmodified */
  @Test
  public void testIncomingPing() {
    IncomingFramesCapture capture = new IncomingFramesCapture();

    FragmentExtension ext = new FragmentExtension();
    ext.setBufferPool(new MappedByteBufferPool());
    ext.setPolicy(WebSocketPolicy.newServerPolicy());
    ExtensionConfig config = ExtensionConfig.parse("fragment;maxLength=4");
    ext.setConfig(config);

    ext.setNextIncomingFrames(capture);

    String payload = "Are you there?";
    Frame ping = WebSocketFrame.ping().setPayload(payload);
    ext.incomingFrame(ping);

    capture.assertFrameCount(1);
    capture.assertHasFrame(OpCode.PING, 1);
    WebSocketFrame actual = capture.getFrames().getFirst();

    Assert.assertThat("Frame.opcode", actual.getOpCode(), is(OpCode.PING));
    Assert.assertThat("Frame.fin", actual.isFin(), is(true));
    Assert.assertThat("Frame.rsv1", actual.isRsv1(), is(false));
    Assert.assertThat("Frame.rsv2", actual.isRsv2(), is(false));
    Assert.assertThat("Frame.rsv3", actual.isRsv3(), is(false));

    ByteBuffer expected = BufferUtil.toBuffer(payload, StringUtil.__UTF8_CHARSET);
    Assert.assertThat("Frame.payloadLength", actual.getPayloadLength(), is(expected.remaining()));
    ByteBufferAssert.assertEquals("Frame.payload", expected, actual.getPayload().slice());
  }
  /** Verify that incoming frames are passed thru without modification */
  @Test
  public void testIncomingFrames() {
    IncomingFramesCapture capture = new IncomingFramesCapture();

    FragmentExtension ext = new FragmentExtension();
    ext.setBufferPool(new MappedByteBufferPool());
    ext.setPolicy(WebSocketPolicy.newClientPolicy());
    ExtensionConfig config = ExtensionConfig.parse("fragment;maxLength=4");
    ext.setConfig(config);

    ext.setNextIncomingFrames(capture);

    // Quote
    List<String> quote = new ArrayList<>();
    quote.add("No amount of experimentation can ever prove me right;");
    quote.add("a single experiment can prove me wrong.");
    quote.add("-- Albert Einstein");

    // Manually create frame and pass into extension
    for (String q : quote) {
      Frame frame = WebSocketFrame.text(q);
      ext.incomingFrame(frame);
    }

    int len = quote.size();
    capture.assertFrameCount(len);
    capture.assertHasFrame(OpCode.TEXT, len);

    String prefix;
    for (int i = 0; i < len; i++) {
      prefix = "Frame[" + i + "]";

      WebSocketFrame actual = capture.getFrames().get(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));
      Assert.assertThat(prefix + ".rsv2", actual.isRsv2(), is(false));
      Assert.assertThat(prefix + ".rsv3", actual.isRsv3(), is(false));

      ByteBuffer expected = BufferUtil.toBuffer(quote.get(i), StringUtil.__UTF8_CHARSET);
      Assert.assertThat(
          prefix + ".payloadLength", actual.getPayloadLength(), is(expected.remaining()));
      ByteBufferAssert.assertEquals(prefix + ".payload", expected, actual.getPayload().slice());
    }
  }