private void test(byte[] content, FSDataOutputStream out) throws Exception {
    // minus 15 so the second entry is incomplete
    // 15 is a magic number here, we want the reader parse the first cell but not the second cell,
    // especially not the qualifier of the second cell. The value of the second cell is 'vvv', which
    // is 3 bytes, plus 8 bytes timestamp, and also qualifier, family and row(which should have been
    // compressed), so 15 is a proper value, of course 14 or 16 could also work here.
    out.write(content, 0, END_OFFSET_OF_WAL_ENTRIES - 15);
    out.hflush();
    WAL_LENGTH = END_OFFSET_OF_WAL_ENTRIES - 15;
    READER.start();
    List<WAL.Entry> entries = new ArrayList<>();
    for (;;) {
      WALEntryBatch batch = READER.poll(1000);
      if (batch == null) {
        break;
      }
      entries.addAll(batch.getWalEntries());
    }
    // should return all the entries except the last one
    assertEquals(Byte.MAX_VALUE, entries.size());
    for (int i = 0; i < Byte.MAX_VALUE; i++) {
      WAL.Entry entry = entries.get(i);
      assertEquals(1, entry.getEdit().size());
      Cell cell = entry.getEdit().getCells().get(0);
      assertEquals(i, Bytes.toInt(cell.getRowArray(), cell.getRowOffset()));
      assertEquals(Bytes.toString(FAMILY),
        Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()));
      assertEquals("qualifier-" + i, Bytes.toString(cell.getQualifierArray(),
        cell.getQualifierOffset(), cell.getQualifierLength()));
      assertEquals("v-" + i,
        Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
    }

    // confirm that we can not get the last one since it is incomplete
    assertNull(READER.poll(1000));
    // write the last byte out
    out.write(content, END_OFFSET_OF_WAL_ENTRIES - 15, 15);
    out.hflush();
    WAL_LENGTH = END_OFFSET_OF_WAL_ENTRIES;

    // should get the last entry
    WALEntryBatch batch = READER.poll(10000);
    assertEquals(1, batch.getNbEntries());
    WAL.Entry entry = batch.getWalEntries().get(0);
    assertEquals(2, entry.getEdit().size());
    Cell cell2 = entry.getEdit().getCells().get(0);
    assertEquals(-1, Bytes.toInt(cell2.getRowArray(), cell2.getRowOffset()));
    assertEquals(Bytes.toString(FAMILY),
      Bytes.toString(cell2.getFamilyArray(), cell2.getFamilyOffset(), cell2.getFamilyLength()));
    assertEquals("qualifier", Bytes.toString(cell2.getQualifierArray(), cell2.getQualifierOffset(),
      cell2.getQualifierLength()));
    assertEquals("vv",
      Bytes.toString(cell2.getValueArray(), cell2.getValueOffset(), cell2.getValueLength()));

    Cell cell3 = entry.getEdit().getCells().get(1);
    assertEquals(-1, Bytes.toInt(cell3.getRowArray(), cell3.getRowOffset()));
    assertEquals(Bytes.toString(FAMILY),
      Bytes.toString(cell3.getFamilyArray(), cell3.getFamilyOffset(), cell3.getFamilyLength()));
    assertEquals("qualifier-1", Bytes.toString(cell3.getQualifierArray(),
      cell3.getQualifierOffset(), cell3.getQualifierLength()));
    assertEquals("vvv",
      Bytes.toString(cell3.getValueArray(), cell3.getValueOffset(), cell3.getValueLength()));
  }
Enable compression and reset the WALEntryStream while reading in ReplicationSourceWALReader.
<p/>
This is used to confirm that we can work well when hitting EOFException in the middle when
reading a WAL entry, when compression is enabled. See HBASE-27621 for more details.
hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStreamCompressionReset.java