/** This tests a simple GET request with a key as the value. */
  @Test
  public void shouldDecodeRequestWithSimpleValue() {
    ByteBuf incoming = Unpooled.buffer();
    incoming.writeBytes(GET_REQUEST);
    channel.writeInbound(incoming);

    BinaryMemcacheRequest request = (BinaryMemcacheRequest) channel.readInbound();

    assertThat(request, notNullValue());
    assertThat(request.getHeader(), notNullValue());
    assertThat(request.getKey(), notNullValue());
    assertThat(request.getExtras(), nullValue());

    BinaryMemcacheRequestHeader header = request.getHeader();
    assertThat(header.getKeyLength(), is((short) 3));
    assertThat(header.getExtrasLength(), is((byte) 0));
    assertThat(header.getTotalBodyLength(), is(3));

    request.release();
    assertThat(channel.readInbound(), instanceOf(LastMemcacheContent.class));
  }
  /** This test makes sure that large content is emitted in chunks. */
  @Test
  public void shouldDecodeRequestWithChunkedContent() {
    int smallBatchSize = 2;
    channel = new EmbeddedChannel(new BinaryMemcacheRequestDecoder(smallBatchSize));

    ByteBuf incoming = Unpooled.buffer();
    incoming.writeBytes(SET_REQUEST_WITH_CONTENT);
    channel.writeInbound(incoming);

    BinaryMemcacheRequest request = (BinaryMemcacheRequest) channel.readInbound();

    assertThat(request, notNullValue());
    assertThat(request.getHeader(), notNullValue());
    assertThat(request.getKey(), notNullValue());
    assertThat(request.getExtras(), nullValue());

    BinaryMemcacheRequestHeader header = request.getHeader();
    assertThat(header.getKeyLength(), is((short) 3));
    assertThat(header.getExtrasLength(), is((byte) 0));
    assertThat(header.getTotalBodyLength(), is(11));

    request.release();

    int expectedContentChunks = 4;
    for (int i = 1; i <= expectedContentChunks; i++) {
      MemcacheContent content = (MemcacheContent) channel.readInbound();
      if (i < expectedContentChunks) {
        assertThat(content, instanceOf(MemcacheContent.class));
      } else {
        assertThat(content, instanceOf(LastMemcacheContent.class));
      }
      assertThat(content.content().readableBytes(), is(2));
      content.release();
    }
    assertThat(channel.readInbound(), nullValue());
  }