/** Tests {@link BasePayloadReader#getKey} to read data at offset 0. */
  @Test
  public void getKeyAndValueZeroOffsetTest() throws Exception {
    int offset = mTestWriter.insert(KEY1, VALUE1);
    Assert.assertEquals(0, offset);
    mTestWriter.close();

    ByteBuffer buf = ByteBuffer.wrap(mTestOutStream.toByteArray());
    mTestReader = new BasePayloadReader(buf);
    Assert.assertEquals(ByteBuffer.wrap(KEY1), mTestReader.getKey(0));
    Assert.assertEquals(ByteBuffer.wrap(VALUE1), mTestReader.getValue(0));
  }
  /** Tests {@link BasePayloadReader#getKey} to read data at non-zero offset. */
  @Test
  public void getKeyAndValueNonZeroOffsetTest() throws Exception {
    mTestOutStream.write("meaningless padding".getBytes());
    int offset = mTestWriter.insert(KEY1, VALUE1);
    mTestWriter.close();

    ByteBuffer buf = ByteBuffer.wrap(mTestOutStream.toByteArray());
    mTestReader = new BasePayloadReader(buf);
    Assert.assertEquals(ByteBuffer.wrap(KEY1), mTestReader.getKey(offset));
    Assert.assertEquals(ByteBuffer.wrap(VALUE1), mTestReader.getValue(offset));
  }
  /** Tests {@link BasePayloadWriter#insert} by adding multiple key-value pairs. */
  @Test
  public void addMultipleKeyAndValuePairsTest() throws Exception {
    int offset;
    int expectedLength = 0;

    offset = mTestWriter.insert(KEY1, VALUE1);
    Assert.assertEquals(expectedLength, offset);

    mTestWriter.flush();
    expectedLength += 8 + KEY1.length + VALUE1.length;
    Assert.assertEquals(expectedLength, mTestOutStream.getBytesWritten());

    offset = mTestWriter.insert(KEY2, VALUE2);
    Assert.assertEquals(expectedLength, offset);

    mTestWriter.flush();
    expectedLength += 8 + KEY2.length + VALUE2.length;
    Assert.assertEquals(expectedLength, mTestOutStream.getBytesWritten());
  }
  /** Tests {@link BasePayloadWriter#insert} by adding zero-byte key or value. */
  @Test
  public void addZeroLengthKeyOrValueTest() throws Exception {
    int offset;
    int expectedLength = 0;

    // Both key and value are empty, expect only 8 bytes of two integer length values
    offset = mTestWriter.insert("".getBytes(), "".getBytes());
    Assert.assertEquals(expectedLength, offset);

    mTestWriter.flush();
    expectedLength += 8;
    Assert.assertEquals(expectedLength, mTestOutStream.getBytesWritten());

    offset = mTestWriter.insert(KEY1, "".getBytes());
    Assert.assertEquals(expectedLength, offset);

    mTestWriter.flush();
    expectedLength += 8 + KEY1.length;
    Assert.assertEquals(expectedLength, mTestOutStream.getBytesWritten());

    offset = mTestWriter.insert("".getBytes(), VALUE1);
    Assert.assertEquals(expectedLength, offset);

    mTestWriter.flush();
    expectedLength += 8 + VALUE1.length;
    Assert.assertEquals(expectedLength, mTestOutStream.getBytesWritten());
  }