Author: bodewig Date: Fri Feb 20 16:18:00 2015 New Revision: 1661151 URL: http://svn.apache.org/r1661151 Log: return 0 from read when asked to read 0 bytes - COMPRESS-309
Modified: commons/proper/compress/trunk/src/changes/changes.xml commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java Modified: commons/proper/compress/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1661151&r1=1661150&r2=1661151&view=diff ============================================================================== --- commons/proper/compress/trunk/src/changes/changes.xml (original) +++ commons/proper/compress/trunk/src/changes/changes.xml Fri Feb 20 16:18:00 2015 @@ -54,6 +54,11 @@ breaks backwards compatibility for code This also changes the superclass of ZCompressorInputStream. "> + <action issue="COMPRESS-309" type="fix" + date="2015-02-20"> + BZip2CompressorInputStream#read would return -1 when asked to + read 0 bytes. + </action> <action issue="COMPRESS-306" type="fix"> ArchiveStreamFactory fails to pass on the encoding when creating some streams. * ArjArchiveInputStream Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java?rev=1661151&r1=1661150&r2=1661151&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java Fri Feb 20 16:18:00 2015 @@ -165,6 +165,9 @@ public class BZip2CompressorInputStream if (this.in == null) { throw new IOException("stream closed"); } + if (len == 0) { + return 0; + } final int hi = offs + len; int destOffs = offs; Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java?rev=1661151&r1=1661150&r2=1661151&view=diff ============================================================================== --- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java (original) +++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStreamTest.java Fri Feb 20 16:18:00 2015 @@ -20,8 +20,11 @@ package org.apache.commons.compress.comp import static org.apache.commons.compress.AbstractTestCase.getFile; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; +import org.junit.Assert; import org.junit.Test; public class BZip2CompressorInputStreamTest { @@ -36,4 +39,34 @@ public class BZip2CompressorInputStreamT } } + /** + * @see "https://issues.apache.org/jira/browse/COMPRESS-309" + */ + @Test + public void readOfLength0ShouldReturn0() throws Exception { + // Create a big random piece of data + byte[] rawData = new byte[1048576]; + for (int i=0; i < rawData.length; ++i) { + rawData[i] = (byte) Math.floor(Math.random()*256); + } + + // Compress it + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BZip2CompressorOutputStream bzipOut = new BZip2CompressorOutputStream(baos); + bzipOut.write(rawData); + bzipOut.flush(); + bzipOut.close(); + baos.flush(); + baos.close(); + + // Try to read it back in + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + BZip2CompressorInputStream bzipIn = new BZip2CompressorInputStream(bais); + byte[] buffer = new byte[1024]; + Assert.assertEquals(1024, bzipIn.read(buffer, 0, 1024)); + Assert.assertEquals(0, bzipIn.read(buffer, 1024, 0)); + Assert.assertEquals(1024, bzipIn.read(buffer, 0, 1024)); + bzipIn.close(); + } + }