Repository: commons-compress
Updated Branches:
  refs/heads/master 792da6735 -> 0fe6ae319


verify the compressor streams really mean EOF when they say so


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/0fe6ae31
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/0fe6ae31
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/0fe6ae31

Branch: refs/heads/master
Commit: 0fe6ae319d50edd1389b6ecb5a6fd12f8091aea0
Parents: 792da67
Author: Stefan Bodewig <bode...@apache.org>
Authored: Thu Aug 9 18:12:52 2018 +0200
Committer: Stefan Bodewig <bode...@apache.org>
Committed: Thu Aug 9 18:12:52 2018 +0200

----------------------------------------------------------------------
 .../compress/compressors/GZipTestCase.java      | 27 ++++++++++
 .../compress/compressors/LZMATestCase.java      | 27 ++++++++++
 .../compress/compressors/Pack200TestCase.java   | 42 ++++++++++++++++
 .../brotli/BrotliCompressorInputStreamTest.java | 17 ++++++-
 .../bzip2/BZip2CompressorInputStreamTest.java   | 30 +++++++++++
 .../DeflateCompressorInputStreamTest.java       | 17 ++++++-
 .../Deflate64CompressorInputStreamTest.java     | 24 +++++++++
 .../lz4/BlockLZ4CompressorInputStreamTest.java  | 27 ++++++++++
 .../lz4/FramedLZ4CompressorInputStreamTest.java | 27 ++++++++++
 .../FramedSnappyCompressorInputStreamTest.java  | 27 ++++++++++
 .../xz/XZCompressorInputStreamTest.java         | 53 ++++++++++++++++++++
 .../z/ZCompressorInputStreamTest.java           | 32 ++++++++++++
 .../ZstdCompressorInputStreamTest.java          | 17 ++++++-
 13 files changed, 364 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/GZipTestCase.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/GZipTestCase.java 
b/src/test/java/org/apache/commons/compress/compressors/GZipTestCase.java
index 02fda3e..9faa874 100644
--- a/src/test/java/org/apache/commons/compress/compressors/GZipTestCase.java
+++ b/src/test/java/org/apache/commons/compress/compressors/GZipTestCase.java
@@ -279,4 +279,31 @@ public final class GZipTestCase extends AbstractTestCase {
         assertEquals("test3.xml", readParams.getFilename());
         assertEquals("Umlaute möglich?", readParams.getComment());
     }
+
+    @Test
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tgz");
+        try (InputStream is = new FileInputStream(input)) {
+            final GzipCompressorInputStream in =
+                    new GzipCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tgz");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final GzipCompressorInputStream in =
+                    new GzipCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/LZMATestCase.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/LZMATestCase.java 
b/src/test/java/org/apache/commons/compress/compressors/LZMATestCase.java
index 622449d..3d2ab02 100644
--- a/src/test/java/org/apache/commons/compress/compressors/LZMATestCase.java
+++ b/src/test/java/org/apache/commons/compress/compressors/LZMATestCase.java
@@ -77,6 +77,33 @@ public final class LZMATestCase extends AbstractTestCase {
         }
     }
 
+    @Test
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.lzma");
+        try (InputStream is = new FileInputStream(input)) {
+            final LZMACompressorInputStream in =
+                    new LZMACompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.lzma");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final LZMACompressorInputStream in =
+                    new LZMACompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
+
     private void copy(final InputStream in, final File output) throws 
IOException {
         FileOutputStream out = null;
         try {

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/Pack200TestCase.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/Pack200TestCase.java 
b/src/test/java/org/apache/commons/compress/compressors/Pack200TestCase.java
index 1896d10..d346185 100644
--- a/src/test/java/org/apache/commons/compress/compressors/Pack200TestCase.java
+++ b/src/test/java/org/apache/commons/compress/compressors/Pack200TestCase.java
@@ -198,4 +198,46 @@ public final class Pack200TestCase extends 
AbstractTestCase {
             os.close();
         }
     }
+
+    @Test
+    public void singleByteReadFromMemoryConsistentlyReturnsMinusOneAtEof() 
throws Exception {
+        
singleByteReadConsistentlyReturnsMinusOneAtEof(Pack200Strategy.IN_MEMORY);
+    }
+
+    @Test
+    public void singleByteReadFromTempFileConsistentlyReturnsMinusOneAtEof() 
throws Exception {
+        
singleByteReadConsistentlyReturnsMinusOneAtEof(Pack200Strategy.TEMP_FILE);
+    }
+
+    private void 
singleByteReadConsistentlyReturnsMinusOneAtEof(Pack200Strategy s) throws 
Exception {
+        final File input = getFile("bla.pack");
+        try (final Pack200CompressorInputStream in = new 
Pack200CompressorInputStream(input, s)) {
+            IOUtils.toByteArray(in);
+            assertEquals(-1, in.read());
+            assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadFromMemoryConsistentlyReturnsMinusOneAtEof() 
throws Exception {
+        
multiByteReadConsistentlyReturnsMinusOneAtEof(Pack200Strategy.IN_MEMORY);
+    }
+
+    @Test
+    public void multiByteReadFromTempFileConsistentlyReturnsMinusOneAtEof() 
throws Exception {
+        
multiByteReadConsistentlyReturnsMinusOneAtEof(Pack200Strategy.TEMP_FILE);
+    }
+
+    private void multiByteReadConsistentlyReturnsMinusOneAtEof(Pack200Strategy 
s) throws Exception {
+        final File input = getFile("bla.pack");
+        byte[] buf = new byte[2];
+        try (final Pack200CompressorInputStream in = new 
Pack200CompressorInputStream(input, s)) {
+            IOUtils.toByteArray(in);
+            assertEquals(-1, in.read(buf));
+            assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStreamTest.java
index e26b637..721ab33 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/brotli/BrotliCompressorInputStreamTest.java
@@ -123,13 +123,28 @@ public class BrotliCompressorInputStreamTest extends 
AbstractTestCase {
     }
 
     @Test
-    public void singleByteReadReturnsMinusOneAtEof() throws IOException {
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
         final File input = getFile("brotli.testdata.compressed");
         try (InputStream is = new FileInputStream(input)) {
             final BrotliCompressorInputStream in =
                     new BrotliCompressorInputStream(is);
             IOUtils.toByteArray(in);
             Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("brotli.testdata.compressed");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final BrotliCompressorInputStream in =
+                    new BrotliCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
             in.close();
         }
     }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java
index 1d49102..7130d92 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java
@@ -22,8 +22,11 @@ import static 
org.apache.commons.compress.AbstractTestCase.getFile;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import org.apache.commons.compress.utils.IOUtils;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -67,4 +70,31 @@ public class BZip2CompressorInputStreamTest {
         bzipIn.close();
     }
 
+    @Test
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.txt.bz2");
+        try (InputStream is = new FileInputStream(input)) {
+            final BZip2CompressorInputStream in =
+                    new BZip2CompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.txt.bz2");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final BZip2CompressorInputStream in =
+                    new BZip2CompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStreamTest.java
index 1d8261e..97a010f 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStreamTest.java
@@ -65,13 +65,28 @@ public class DeflateCompressorInputStreamTest {
     }
 
     @Test
-    public void singleByteReadReturnsMinusOneAtEof() throws IOException {
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
         final File input = AbstractTestCase.getFile("bla.tar.deflatez");
         try (InputStream is = new FileInputStream(input)) {
             final DeflateCompressorInputStream in =
                     new DeflateCompressorInputStream(is);
             IOUtils.toByteArray(in);
             Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = AbstractTestCase.getFile("bla.tar.deflatez");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final DeflateCompressorInputStream in =
+                    new DeflateCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
             in.close();
         }
     }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStreamTest.java
index 3526224..531a14f 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStreamTest.java
@@ -18,6 +18,7 @@
 package org.apache.commons.compress.compressors.deflate64;
 
 import org.apache.commons.compress.compressors.CompressorStreamFactory;
+import org.apache.commons.compress.utils.IOUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -152,4 +153,27 @@ public class Deflate64CompressorInputStreamTest {
         }
     }
 
+    @Test
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
Exception {
+        try (final Deflate64CompressorInputStream in =
+                    new Deflate64CompressorInputStream(nullDecoder)) {
+            IOUtils.toByteArray(in);
+            assertEquals(-1, in.read());
+            assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
Exception {
+        byte[] buf = new byte[2];
+        try (final Deflate64CompressorInputStream in =
+                    new Deflate64CompressorInputStream(nullDecoder)) {
+            IOUtils.toByteArray(in);
+            assertEquals(-1, in.read(buf));
+            assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStreamTest.java
index 801630e..13331dd 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStreamTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.commons.compress.compressors.lz4;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -38,4 +39,30 @@ public class BlockLZ4CompressorInputStreamTest extends 
AbstractTestCase {
         }
     }
 
+    @Test
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.block_lz4");
+        try (InputStream is = new FileInputStream(input)) {
+            final BlockLZ4CompressorInputStream in =
+                    new BlockLZ4CompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.block_lz4");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final BlockLZ4CompressorInputStream in =
+                    new BlockLZ4CompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStreamTest.java
index e3211fa..2fd564b 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStreamTest.java
@@ -592,6 +592,33 @@ public final class FramedLZ4CompressorInputStreamTest
         }
     }
 
+    @Test
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.lz4");
+        try (InputStream is = new FileInputStream(input)) {
+            final FramedLZ4CompressorInputStream in =
+                    new FramedLZ4CompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            assertEquals(-1, in.read());
+            assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.lz4");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final FramedLZ4CompressorInputStream in =
+                    new FramedLZ4CompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            assertEquals(-1, in.read(buf));
+            assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
+
     interface StreamWrapper {
         InputStream wrap(InputStream in) throws Exception;
     }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStreamTest.java
index cac4b2c..879456e 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStreamTest.java
@@ -189,6 +189,33 @@ public final class FramedSnappyCompressorInputStreamTest
         }
     }
 
+    @Test
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.sz");
+        try (InputStream is = new FileInputStream(input)) {
+            final FramedSnappyCompressorInputStream in =
+                    new FramedSnappyCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            assertEquals(-1, in.read());
+            assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.sz");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final FramedSnappyCompressorInputStream in =
+                    new FramedSnappyCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            assertEquals(-1, in.read(buf));
+            assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
+
     private void testChecksumUnmasking(final long x) {
         assertEquals(Long.toHexString(x),
                      Long.toHexString(FramedSnappyCompressorInputStream

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStreamTest.java
index 6b8ab13..a43dca3 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStreamTest.java
@@ -18,6 +18,13 @@
  */
 package org.apache.commons.compress.compressors.xz;
 
+import static org.apache.commons.compress.AbstractTestCase.getFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import org.apache.commons.compress.utils.IOUtils;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -33,4 +40,50 @@ public class XZCompressorInputStreamTest {
         data[5] = '0';
         Assert.assertFalse(XZCompressorInputStream.matches(data, 6));
     }
+
+    @Test
+    public void 
singleByteReadConsistentlyReturnsMinusOneAtEofNoDecompressConcatenated() throws 
IOException {
+        singleByteReadConsistentlyReturnsMinusOneAtEof(false);
+    }
+
+    @Test
+    public void 
singleByteReadConsistentlyReturnsMinusOneAtEofDecompressConcatenated() throws 
IOException {
+        singleByteReadConsistentlyReturnsMinusOneAtEof(true);
+    }
+
+    private void singleByteReadConsistentlyReturnsMinusOneAtEof(boolean 
decompressConcatenated) throws IOException {
+        final File input = getFile("bla.tar.xz");
+        try (InputStream is = new FileInputStream(input)) {
+            final XZCompressorInputStream in =
+                new XZCompressorInputStream(is, decompressConcatenated);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void 
multiByteReadConsistentlyReturnsMinusOneAtEofNoDecompressConcatenated() throws 
IOException {
+        multiByteReadConsistentlyReturnsMinusOneAtEof(false);
+    }
+
+    @Test
+    public void 
multiByteReadConsistentlyReturnsMinusOneAtEofDecompressConcatenated() throws 
IOException {
+        multiByteReadConsistentlyReturnsMinusOneAtEof(true);
+    }
+
+    private void multiByteReadConsistentlyReturnsMinusOneAtEof(boolean 
decompressConcatenated) throws IOException {
+        final File input = getFile("bla.tar.xz");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final XZCompressorInputStream in =
+                new XZCompressorInputStream(is, decompressConcatenated);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/z/ZCompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/z/ZCompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/z/ZCompressorInputStreamTest.java
index 8f62c9b..9e7786b 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/z/ZCompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/z/ZCompressorInputStreamTest.java
@@ -18,12 +18,18 @@
  */
 package org.apache.commons.compress.compressors.z;
 
+import org.junit.Assert;
 import org.junit.Test;
 
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.SequenceInputStream;
 import java.util.Enumeration;
+import org.apache.commons.compress.utils.IOUtils;
 
+import static org.apache.commons.compress.AbstractTestCase.getFile;
 import static org.mockito.Mockito.mock;
 import static org.powermock.api.mockito.PowerMockito.doReturn;
 
@@ -58,5 +64,31 @@ public class ZCompressorInputStreamTest {
 
     }
 
+    @Test
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.Z");
+        try (InputStream is = new FileInputStream(input)) {
+            final ZCompressorInputStream in =
+                    new ZCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("bla.tar.Z");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final ZCompressorInputStream in =
+                    new ZCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
+            in.close();
+        }
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0fe6ae31/src/test/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStreamTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStreamTest.java
index cadf198..1d5f066 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStreamTest.java
@@ -124,13 +124,28 @@ public class ZstdCompressorInputStreamTest extends 
AbstractTestCase {
     }
 
     @Test
-    public void singleByteReadReturnsMinusOneAtEof() throws IOException {
+    public void singleByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
         final File input = getFile("zstandard.testdata.zst");
         try (InputStream is = new FileInputStream(input)) {
             final ZstdCompressorInputStream in =
                     new ZstdCompressorInputStream(is);
             IOUtils.toByteArray(in);
             Assert.assertEquals(-1, in.read());
+            Assert.assertEquals(-1, in.read());
+            in.close();
+        }
+    }
+
+    @Test
+    public void multiByteReadConsistentlyReturnsMinusOneAtEof() throws 
IOException {
+        final File input = getFile("zstandard.testdata.zst");
+        byte[] buf = new byte[2];
+        try (InputStream is = new FileInputStream(input)) {
+            final ZstdCompressorInputStream in =
+                    new ZstdCompressorInputStream(is);
+            IOUtils.toByteArray(in);
+            Assert.assertEquals(-1, in.read(buf));
+            Assert.assertEquals(-1, in.read(buf));
             in.close();
         }
     }

Reply via email to