@Test
  public void testMultipleChunkStreamBuffer() throws IOException {
    ArrayList<byte[]> chunks = new ArrayList<>();
    int size = 0;
    for (int i = 1; i <= 40; i++) {
      byte[] chunk = new byte[i];
      chunks.add(chunk);
      for (int j = 0; j < chunk.length; j++) {
        chunk[j] = (byte) size++;
      }
    }
    ChunkedInputStream cis = new ChunkedInputStream(chunks, -1);
    assertTrue(cis.length() == size);

    byte[] buffer = new byte[4];
    int total = 0;
    int val;
    for (; ; ) {
      val = cis.read(buffer, 1, 2);
      if (val <= 0) {
        break;
      }
      assertTrue(val <= 2);
      assertTrue((buffer[1] & 0xFF) == (total & 0xFF));
      total++;
      if (val > 1) {
        assertTrue((buffer[2] & 0xFF) == (total & 0xFF));
        total++;
      }
    }
    assertTrue(val == -1);
    assertTrue(total == size);
    assertTrue(cis.read(buffer, 1, 2) == -1);
  }
 @Test
 public void testOneChunkStreamSingle() throws IOException {
   byte[] chunk = new byte[255];
   for (int i = 0; i < chunk.length; i++) chunk[i] = (byte) (255 - i);
   ChunkedInputStream cis = new ChunkedInputStream(Arrays.asList(chunk), -1);
   assertTrue(cis.length() == chunk.length);
   for (byte aChunk : chunk) {
     int val = cis.read();
     assertTrue(val >= 0);
     assertTrue(val == (aChunk & 0xFF));
   }
   assertTrue(cis.read() == -1);
 }
 @Test
 public void testStreamOfUnknownSize() {
   ChunkedInputStream cis1 = new ChunkedInputStream(null, 0);
   assertTrue(cis1.length() == 0);
   ChunkedInputStream cis2 = new ChunkedInputStream(Collections.emptyList(), -1);
   assertTrue(cis2.length() == 0);
   ChunkedInputStream cis3 = new ChunkedInputStream(Arrays.asList(null, new byte[0]), -1);
   assertTrue(cis3.length() == 0);
   ChunkedInputStream cis4 = new ChunkedInputStream(Arrays.asList(new byte[2]), -1);
   assertTrue(cis4.length() == 2);
   ChunkedInputStream cis5 =
       new ChunkedInputStream(Arrays.asList(new byte[2], new byte[3], new byte[4]), -1);
   assertTrue(cis5.length() == 9);
 }
 @Test
 public void testMultipleChunkStreamSingle() throws IOException {
   ArrayList<byte[]> chunks = new ArrayList<>();
   int size = 0;
   for (int i = 1; i <= 40; i++) {
     byte[] chunk = new byte[i];
     chunks.add(chunk);
     for (int j = 0; j < chunk.length; j++) {
       chunk[j] = (byte) size++;
     }
   }
   ChunkedInputStream cis = new ChunkedInputStream(chunks, -1);
   assertTrue(cis.length() == size);
   int total = 0;
   while (total < size) {
     int val = cis.read();
     assertTrue(val >= 0);
     assertTrue(val == (total & 0xFF));
     total++;
   }
   assertTrue(cis.read() == -1);
 }
 @Test
 public void testOneChunkStreamBuffer() throws IOException {
   byte[] chunk = new byte[255];
   for (int i = 0; i < chunk.length; i++) chunk[i] = (byte) (255 - i);
   ChunkedInputStream cis = new ChunkedInputStream(Arrays.asList(chunk), -1);
   assertTrue(cis.length() == chunk.length);
   byte[] buffer = new byte[4];
   int total = 0;
   int val;
   for (; ; ) {
     val = cis.read(buffer, 1, 2);
     if (val <= 0) {
       break;
     }
     assertTrue(val <= 2);
     assertTrue(buffer[1] == chunk[total++]);
     if (val > 1) assertTrue(buffer[2] == chunk[total++]);
   }
   assertTrue(val == -1);
   assertTrue(total == chunk.length);
   assertTrue(total == cis.length());
   assertTrue(cis.read(buffer, 1, 2) == -1);
 }
 @Test
 public void testEmptyStreamSingle() throws IOException {
   ChunkedInputStream cis1 = new ChunkedInputStream(null, 0);
   assertTrue(cis1.read() == -1);
   assertTrue(cis1.read() == -1); // repetitive read is no problem
   ChunkedInputStream cis2 = new ChunkedInputStream(Collections.emptyList(), -1);
   assertTrue(cis2.read() == -1);
   assertTrue(cis2.read() == -1); // repetitive read is no problem
   ChunkedInputStream cis3 = new ChunkedInputStream(Arrays.asList(null, new byte[0]), -1);
   assertTrue(cis3.read() == -1);
   assertTrue(cis3.read() == -1); // repetitive read is no problem
 }
 @Test
 public void testEmptyStreamBuffer() throws IOException {
   byte[] buffer = new byte[10];
   try (ChunkedInputStream cis1 = new ChunkedInputStream(null, 0)) {
     assertTrue(cis1.read(buffer, 0, 10) == -1);
     assertTrue(cis1.read(buffer, 0, 10) == -1); // repetitive read is no problem
   }
   try (ChunkedInputStream cis2 = new ChunkedInputStream(Collections.emptyList(), -1)) {
     assertTrue(cis2.read(buffer, 0, 10) == -1);
     assertTrue(cis2.read(buffer, 0, 10) == -1); // repetitive read is no problem
   }
   try (ChunkedInputStream cis3 = new ChunkedInputStream(Arrays.asList(null, new byte[0]), -1)) {
     assertTrue(cis3.read(buffer, 0, 10) == -1);
     assertTrue(cis3.read(buffer, 0, 10) == -1); // repetitive read is no problem
   }
 }