This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
The following commit(s) were added to refs/heads/master by this push: new eecd6ae FIx leaky test that causes builds to fail (at least on Oracle Java 8 and Windows 10) because many file handles are left open. eecd6ae is described below commit eecd6ae89ada048cea11f8a18bd369e609eae33e Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Wed Dec 25 19:54:42 2019 -0500 FIx leaky test that causes builds to fail (at least on Oracle Java 8 and Windows 10) because many file handles are left open. - Refactor File to byte array code pattern into new IOUtils method. - Use less obtuse names. --- .../archivers/tar/TarArchiveInputStream.java | 30 +-- .../commons/compress/archivers/zip/BinaryTree.java | 6 +- .../compressors/CompressorStreamFactory.java | 14 +- .../lz4/FramedLZ4CompressorInputStream.java | 22 +- .../snappy/FramedSnappyCompressorInputStream.java | 22 +- .../org/apache/commons/compress/utils/IOUtils.java | 35 ++- .../commons/compress/archivers/ZipTestCase.java | 264 ++++++++++----------- .../compress/archivers/zip/ScatterSampleTest.java | 27 ++- .../brotli/BrotliCompressorInputStreamTest.java | 7 +- .../lz4/FramedLZ4CompressorInputStreamTest.java | 5 +- .../FramedSnappyCompressorInputStreamTest.java | 5 +- .../zstandard/ZstdCompressorInputStreamTest.java | 3 +- 12 files changed, 216 insertions(+), 224 deletions(-) diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java index 7ec8ed7..65b7e32 100644 --- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java +++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java @@ -66,7 +66,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { private long entryOffset; /** An input stream to read from */ - private final InputStream is; + private final InputStream inputStream; /** The meta-data about the current entry */ private TarArchiveEntry currEntry; @@ -170,7 +170,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { */ public TarArchiveInputStream(final InputStream is, final int blockSize, final int recordSize, final String encoding, boolean lenient) { - this.is = is; + this.inputStream = is; this.hasHitEOF = false; this.encoding = encoding; this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding); @@ -185,7 +185,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { */ @Override public void close() throws IOException { - is.close(); + inputStream.close(); } /** @@ -244,7 +244,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { } final long available = entrySize - entryOffset; - final long skipped = IOUtils.skip(is, Math.min(n, available)); + final long skipped = IOUtils.skip(inputStream, Math.min(n, available)); count(skipped); entryOffset += skipped; return skipped; @@ -372,7 +372,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { if (!isDirectory() && this.entrySize > 0 && this.entrySize % this.recordSize != 0) { final long numRecords = (this.entrySize / this.recordSize) + 1; final long padding = (numRecords * this.recordSize) - this.entrySize; - final long skipped = IOUtils.skip(is, padding); + final long skipped = IOUtils.skip(inputStream, padding); count(skipped); } } @@ -456,7 +456,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { final byte[] record = new byte[recordSize]; - final int readNow = IOUtils.readFully(is, record); + final int readNow = IOUtils.readFully(inputStream, record); count(readNow); if (readNow != recordSize) { return null; @@ -479,7 +479,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { // NOTE, using a Map here makes it impossible to ever support GNU // sparse files using the PAX Format 0.0, see // https://www.gnu.org/software/tar/manual/html_section/tar_92.html#SEC188 - Map<String, String> parsePaxHeaders(final InputStream i) + Map<String, String> parsePaxHeaders(final InputStream inputStream) throws IOException { final Map<String, String> headers = new HashMap<>(globalPaxHeaders); // Format is "length keyword=value\n"; @@ -487,14 +487,14 @@ public class TarArchiveInputStream extends ArchiveInputStream { int ch; int len = 0; int read = 0; - while((ch = i.read()) != -1) { + while((ch = inputStream.read()) != -1) { read++; if (ch == '\n') { // blank line in header break; } else if (ch == ' '){ // End of length string // Get keyword final ByteArrayOutputStream coll = new ByteArrayOutputStream(); - while((ch = i.read()) != -1) { + while((ch = inputStream.read()) != -1) { read++; if (ch == '='){ // end of keyword final String keyword = coll.toString(CharsetNames.UTF_8); @@ -504,7 +504,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { headers.remove(keyword); } else { final byte[] rest = new byte[restLen]; - final int got = IOUtils.readFully(i, rest); + final int got = IOUtils.readFully(inputStream, rest); if (got != restLen) { throw new IOException("Failed to read " + "Paxheader. Expected " @@ -595,16 +595,16 @@ public class TarArchiveInputStream extends ArchiveInputStream { */ private void tryToConsumeSecondEOFRecord() throws IOException { boolean shouldReset = true; - final boolean marked = is.markSupported(); + final boolean marked = inputStream.markSupported(); if (marked) { - is.mark(recordSize); + inputStream.mark(recordSize); } try { shouldReset = !isEOFRecord(readRecord()); } finally { if (shouldReset && marked) { pushedBackBytes(recordSize); - is.reset(); + inputStream.reset(); } } } @@ -639,7 +639,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { numToRead = Math.min(numToRead, available()); - totalRead = is.read(buf, offset, numToRead); + totalRead = inputStream.read(buf, offset, numToRead); if (totalRead == -1) { if (numToRead > 0) { @@ -697,7 +697,7 @@ public class TarArchiveInputStream extends ArchiveInputStream { private void consumeRemainderOfLastBlock() throws IOException { final long bytesReadOfLastBlock = getBytesRead() % blockSize; if (bytesReadOfLastBlock > 0) { - final long skipped = IOUtils.skip(is, blockSize - bytesReadOfLastBlock); + final long skipped = IOUtils.skip(inputStream, blockSize - bytesReadOfLastBlock); count(skipped); } } diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/BinaryTree.java b/src/main/java/org/apache/commons/compress/archivers/zip/BinaryTree.java index e742175..0a01ad6 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/BinaryTree.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/BinaryTree.java @@ -113,19 +113,19 @@ class BinaryTree { /** * Decodes the packed binary tree from the specified stream. */ - static BinaryTree decode(final InputStream in, final int totalNumberOfValues) throws IOException { + static BinaryTree decode(final InputStream inputStream, final int totalNumberOfValues) throws IOException { if (totalNumberOfValues < 0) { throw new IllegalArgumentException("totalNumberOfValues must be bigger than 0, is " + totalNumberOfValues); } // the first byte contains the size of the structure minus one - final int size = in.read() + 1; + final int size = inputStream.read() + 1; if (size == 0) { throw new IOException("Cannot read the size of the encoded tree, unexpected end of stream"); } final byte[] encodedTree = new byte[size]; - final int read = IOUtils.readFully(in, encodedTree); + final int read = IOUtils.readFully(inputStream, encodedTree); if (read != size) { throw new EOFException(); } diff --git a/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java b/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java index d730b9d..55ade9b 100644 --- a/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java +++ b/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java @@ -455,7 +455,7 @@ public class CompressorStreamFactory implements CompressorStreamProvider { /** * Try to detect the type of compressor stream. * - * @param in input stream + * @param inputStream input stream * @return type of compressor stream detected * @throws CompressorException if no compressor stream type was detected * or if something else went wrong @@ -463,21 +463,21 @@ public class CompressorStreamFactory implements CompressorStreamProvider { * * @since 1.14 */ - public static String detect(final InputStream in) throws CompressorException { - if (in == null) { + public static String detect(final InputStream inputStream) throws CompressorException { + if (inputStream == null) { throw new IllegalArgumentException("Stream must not be null."); } - if (!in.markSupported()) { + if (!inputStream.markSupported()) { throw new IllegalArgumentException("Mark is not supported."); } final byte[] signature = new byte[12]; - in.mark(signature.length); + inputStream.mark(signature.length); int signatureLength = -1; try { - signatureLength = IOUtils.readFully(in, signature); - in.reset(); + signatureLength = IOUtils.readFully(inputStream, signature); + inputStream.reset(); } catch (IOException e) { throw new CompressorException("IOException while reading signature.", e); } diff --git a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java index c316fd3..85f83f8 100644 --- a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java @@ -70,7 +70,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream } }; - private final CountingInputStream in; + private final CountingInputStream inputStream; private final boolean decompressConcatenated; private boolean expectBlockChecksum; @@ -112,7 +112,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream * @throws IOException if reading fails */ public FramedLZ4CompressorInputStream(InputStream in, boolean decompressConcatenated) throws IOException { - this.in = new CountingInputStream(in); + this.inputStream = new CountingInputStream(in); this.decompressConcatenated = decompressConcatenated; init(true); } @@ -132,7 +132,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream currentBlock = null; } } finally { - in.close(); + inputStream.close(); } } @@ -168,7 +168,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream */ @Override public long getCompressedCount() { - return in.getBytesRead(); + return inputStream.getBytesRead(); } private void init(boolean firstFrame) throws IOException { @@ -181,7 +181,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream private boolean readSignature(boolean firstFrame) throws IOException { String garbageMessage = firstFrame ? "Not a LZ4 frame stream" : "LZ4 frame stream followed by garbage"; final byte[] b = new byte[4]; - int read = IOUtils.readFully(in, b); + int read = IOUtils.readFully(inputStream, b); count(read); if (0 == read && !firstFrame) { // good LZ4 frame and nothing after it @@ -231,7 +231,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream contentHash.update(bdByte); if (expectContentSize) { // for now we don't care, contains the uncompressed size byte[] contentSize = new byte[8]; - int skipped = IOUtils.readFully(in, contentSize); + int skipped = IOUtils.readFully(inputStream, contentSize); count(skipped); if (8 != skipped) { throw new IOException("Premature end of stream while reading content size"); @@ -266,7 +266,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream } return; } - InputStream capped = new BoundedInputStream(in, realLen); + InputStream capped = new BoundedInputStream(inputStream, realLen); if (expectBlockChecksum) { capped = new ChecksumCalculatingInputStream(blockHash, capped); } @@ -303,7 +303,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream private void verifyChecksum(XXHash32 hash, String kind) throws IOException { byte[] checksum = new byte[4]; - int read = IOUtils.readFully(in, checksum); + int read = IOUtils.readFully(inputStream, checksum); count(read); if (4 != read) { throw new IOException("Premature end of stream while reading " + kind + " checksum"); @@ -315,7 +315,7 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream } private int readOneByte() throws IOException { - final int b = in.read(); + final int b = inputStream.read(); if (b != -1) { count(1); return b & 0xFF; @@ -363,12 +363,12 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream if (len < 0) { throw new IOException("Found illegal skippable frame with negative size"); } - long skipped = IOUtils.skip(in, len); + long skipped = IOUtils.skip(inputStream, len); count(skipped); if (len != skipped) { throw new IOException("Premature end of stream while skipping frame"); } - read = IOUtils.readFully(in, b); + read = IOUtils.readFully(inputStream, b); count(read); } return read; diff --git a/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java index b2864bc..c1d07b5 100644 --- a/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java @@ -65,7 +65,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream private final CountingInputStream countingStream; /** The underlying stream to read compressed data from */ - private final PushbackInputStream in; + private final PushbackInputStream inputStream; /** The dialect to expect */ private final FramedSnappyDialect dialect; @@ -131,7 +131,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream throw new IllegalArgumentException("blockSize must be bigger than 0"); } countingStream = new CountingInputStream(in); - this.in = new PushbackInputStream(countingStream, 1); + this.inputStream = new PushbackInputStream(countingStream, 1); this.blockSize = blockSize; this.dialect = dialect; if (dialect.hasStreamIdentifier()) { @@ -154,7 +154,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream currentCompressedChunk = null; } } finally { - in.close(); + inputStream.close(); } } @@ -180,7 +180,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream public int available() throws IOException { if (inUncompressedChunk) { return Math.min(uncompressedBytesRemaining, - in.available()); + inputStream.available()); } else if (currentCompressedChunk != null) { return currentCompressedChunk.available(); } @@ -209,7 +209,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream if (amount == 0) { return -1; } - read = in.read(b, off, amount); + read = inputStream.read(b, off, amount); if (read != -1) { uncompressedBytesRemaining -= read; count(read); @@ -237,7 +237,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream if (type == -1) { endReached = true; } else if (type == STREAM_IDENTIFIER_TYPE) { - in.unread(type); + inputStream.unread(type); unreadBytes++; pushedBackBytes(1); readStreamIdentifier(); @@ -269,7 +269,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream expectedChecksum = -1; } currentCompressedChunk = - new SnappyCompressorInputStream(new BoundedInputStream(in, size), blockSize); + new SnappyCompressorInputStream(new BoundedInputStream(inputStream, size), blockSize); // constructor reads uncompressed size count(currentCompressedChunk.getBytesRead()); } else { @@ -281,7 +281,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream private long readCrc() throws IOException { final byte[] b = new byte[4]; - final int read = IOUtils.readFully(in, b); + final int read = IOUtils.readFully(inputStream, b); count(read); if (read != 4) { throw new IOException("Premature end of stream"); @@ -306,7 +306,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream if (size < 0) { throw new IOException("Found illegal chunk with negative size"); } - final long read = IOUtils.skip(in, size); + final long read = IOUtils.skip(inputStream, size); count(read); if (read != size) { throw new IOException("Premature end of stream"); @@ -315,7 +315,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream private void readStreamIdentifier() throws IOException { final byte[] b = new byte[10]; - final int read = IOUtils.readFully(in, b); + final int read = IOUtils.readFully(inputStream, b); count(read); if (10 != read || !matches(b, 10)) { throw new IOException("Not a framed Snappy stream"); @@ -323,7 +323,7 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream } private int readOneByte() throws IOException { - final int b = in.read(); + final int b = inputStream.read(); if (b != -1) { count(1); return b & 0xFF; diff --git a/src/main/java/org/apache/commons/compress/utils/IOUtils.java b/src/main/java/org/apache/commons/compress/utils/IOUtils.java index 0eda0fb..7fa502a 100644 --- a/src/main/java/org/apache/commons/compress/utils/IOUtils.java +++ b/src/main/java/org/apache/commons/compress/utils/IOUtils.java @@ -21,6 +21,8 @@ package org.apache.commons.compress.utils; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -127,6 +129,25 @@ public final class IOUtils { } /** + * Reads as much from the file as possible to fill the given array. + * + * <p>This method may invoke read repeatedly to fill the array and + * only read less bytes than the length of the array if the end of + * the stream has been reached.</p> + * + * @param file file to read + * @param array buffer to fill + * @return the number of bytes actually read + * @throws IOException on error + * @since 1.20 + */ + public static int read(final File file, final byte[] array) throws IOException { + try (FileInputStream inputStream = new FileInputStream(file)) { + return readFully(inputStream, array, 0, array.length); + } + } + + /** * Reads as much from input as possible to fill the given array. * * <p>This method may invoke read repeatedly to fill the array and @@ -134,12 +155,12 @@ public final class IOUtils { * the stream has been reached.</p> * * @param input stream to read from - * @param b buffer to fill + * @param array buffer to fill * @return the number of bytes actually read * @throws IOException on error */ - public static int readFully(final InputStream input, final byte[] b) throws IOException { - return readFully(input, b, 0, b.length); + public static int readFully(final InputStream input, final byte[] array) throws IOException { + return readFully(input, array, 0, array.length); } /** @@ -151,21 +172,21 @@ public final class IOUtils { * the stream has been reached.</p> * * @param input stream to read from - * @param b buffer to fill + * @param array buffer to fill * @param offset offset into the buffer to start filling at * @param len of bytes to read * @return the number of bytes actually read * @throws IOException * if an I/O error has occurred */ - public static int readFully(final InputStream input, final byte[] b, final int offset, final int len) + public static int readFully(final InputStream input, final byte[] array, final int offset, final int len) throws IOException { - if (len < 0 || offset < 0 || len + offset > b.length) { + if (len < 0 || offset < 0 || len + offset > array.length) { throw new IndexOutOfBoundsException(); } int count = 0, x = 0; while (count != len) { - x = input.read(b, offset + count, len - count); + x = input.read(array, offset + count, len - count); if (x == -1) { break; } diff --git a/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java b/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java index 30b5492..c45db11 100644 --- a/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java +++ b/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java @@ -55,6 +55,7 @@ import org.junit.Assert; import org.junit.Test; public final class ZipTestCase extends AbstractTestCase { + /** * Archives 2 files and unarchives it again. If the file length of result * and source is the same, it looks like the operations have worked @@ -67,49 +68,39 @@ public final class ZipTestCase extends AbstractTestCase { final File file1 = getFile("test1.xml"); final File file2 = getFile("test2.xml"); - final OutputStream out = new FileOutputStream(output); - ArchiveOutputStream os = null; - try { - os = new ArchiveStreamFactory() - .createArchiveOutputStream("zip", out); - os.putArchiveEntry(new ZipArchiveEntry("testdata/test1.xml")); - IOUtils.copy(new FileInputStream(file1), os); - os.closeArchiveEntry(); - - os.putArchiveEntry(new ZipArchiveEntry("testdata/test2.xml")); - IOUtils.copy(new FileInputStream(file2), os); - os.closeArchiveEntry(); - } finally { - if (os != null) { - os.close(); + try (final OutputStream out = new FileOutputStream(output)) { + try (ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream("zip", out)) { + os.putArchiveEntry(new ZipArchiveEntry("testdata/test1.xml")); + try (final FileInputStream input = new FileInputStream(file1)) { + IOUtils.copy(input, os); + } + os.closeArchiveEntry(); + + os.putArchiveEntry(new ZipArchiveEntry("testdata/test2.xml")); + try (final FileInputStream input = new FileInputStream(file2)) { + IOUtils.copy(input, os); + } + os.closeArchiveEntry(); } } - out.close(); // Unarchive the same final List<File> results = new ArrayList<>(); - final InputStream is = new FileInputStream(output); - ArchiveInputStream in = null; - try { - in = new ArchiveStreamFactory() - .createArchiveInputStream("zip", is); - - ZipArchiveEntry entry = null; - while((entry = (ZipArchiveEntry)in.getNextEntry()) != null) { - final File outfile = new File(resultDir.getCanonicalPath() + "/result/" + entry.getName()); - outfile.getParentFile().mkdirs(); - try (OutputStream o = new FileOutputStream(outfile)) { - IOUtils.copy(in, o); + try (final InputStream fileInputStream = new FileInputStream(output)) { + try (ArchiveInputStream archiveInputStream = new ArchiveStreamFactory().createArchiveInputStream("zip", + fileInputStream)) { + ZipArchiveEntry entry = null; + while ((entry = (ZipArchiveEntry) archiveInputStream.getNextEntry()) != null) { + final File outfile = new File(resultDir.getCanonicalPath() + "/result/" + entry.getName()); + outfile.getParentFile().mkdirs(); + try (OutputStream o = new FileOutputStream(outfile)) { + IOUtils.copy(archiveInputStream, o); + } + results.add(outfile); } - results.add(outfile); - } - } finally { - if (in != null) { - in.close(); } } - is.close(); assertEquals(results.size(), 2); File result = results.get(0); @@ -129,34 +120,33 @@ public final class ZipTestCase extends AbstractTestCase { final File file2 = getFile("test2.xml"); final byte[] file1Contents = new byte[(int) file1.length()]; final byte[] file2Contents = new byte[(int) file2.length()]; - IOUtils.readFully(new FileInputStream(file1), file1Contents); - IOUtils.readFully(new FileInputStream(file2), file2Contents); + IOUtils.read(file1, file1Contents); + IOUtils.read(file2, file2Contents); + final List<byte[]> results = new ArrayList<>(); - SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(); - try (ZipArchiveOutputStream os = new ZipArchiveOutputStream(channel)) { - os.putArchiveEntry(new ZipArchiveEntry("testdata/test1.xml")); - os.write(file1Contents); - os.closeArchiveEntry(); + try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel()) { + try (ZipArchiveOutputStream os = new ZipArchiveOutputStream(channel)) { + os.putArchiveEntry(new ZipArchiveEntry("testdata/test1.xml")); + os.write(file1Contents); + os.closeArchiveEntry(); - os.putArchiveEntry(new ZipArchiveEntry("testdata/test2.xml")); - os.write(file2Contents); - os.closeArchiveEntry(); - } - - // Unarchive the same - final List<byte[]> results = new ArrayList<>(); + os.putArchiveEntry(new ZipArchiveEntry("testdata/test2.xml")); + os.write(file2Contents); + os.closeArchiveEntry(); + } - try (ArchiveInputStream in = new ArchiveStreamFactory() - .createArchiveInputStream("zip", new ByteArrayInputStream(channel.array()))) { + // Unarchive the same + try (ArchiveInputStream inputStream = new ArchiveStreamFactory().createArchiveInputStream("zip", + new ByteArrayInputStream(channel.array()))) { - ZipArchiveEntry entry; - while((entry = (ZipArchiveEntry)in.getNextEntry()) != null) { - byte[] result = new byte[(int) entry.getSize()]; - IOUtils.readFully(in, result); - results.add(result); + ZipArchiveEntry entry; + while ((entry = (ZipArchiveEntry) inputStream.getNextEntry()) != null) { + byte[] result = new byte[(int) entry.getSize()]; + IOUtils.readFully(inputStream, result); + results.add(result); + } } } - assertArrayEquals(results.get(0), file1Contents); assertArrayEquals(results.get(1), file2Contents); } @@ -188,8 +178,8 @@ public final class ZipTestCase extends AbstractTestCase { final ArrayList<String> al = new ArrayList<>(); al.add("test1.xml"); al.add("test2.xml"); - try (InputStream is = new FileInputStream(input)) { - checkArchiveContent(new ZipArchiveInputStream(is), al); + try (InputStream fis = new FileInputStream(input)) { + checkArchiveContent(new ZipArchiveInputStream(fis), al); } } @@ -200,11 +190,11 @@ public final class ZipTestCase extends AbstractTestCase { */ @Test public void testTokenizationCompressionMethod() throws IOException { - final ZipFile moby = new ZipFile(getFile("moby.zip")); - final ZipArchiveEntry entry = moby.getEntry("README"); - assertEquals("method", ZipMethod.TOKENIZATION.getCode(), entry.getMethod()); - assertFalse(moby.canReadEntryData(entry)); - moby.close(); + try (final ZipFile moby = new ZipFile(getFile("moby.zip"))) { + final ZipArchiveEntry entry = moby.getEntry("README"); + assertEquals("method", ZipMethod.TOKENIZATION.getCode(), entry.getMethod()); + assertFalse(moby.canReadEntryData(entry)); + } } /** @@ -248,10 +238,8 @@ public final class ZipTestCase extends AbstractTestCase { final List<String> results = new ArrayList<>(); final List<ZipException> expectedExceptions = new ArrayList<>(); - final InputStream is = new FileInputStream(input); - ArchiveInputStream in = null; - try { - in = new ArchiveStreamFactory().createArchiveInputStream("zip", is); + try (final InputStream fis = new FileInputStream(input); + ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream("zip", fis)) { ZipArchiveEntry entry = null; while ((entry = (ZipArchiveEntry) in.getNextEntry()) != null) { @@ -269,12 +257,7 @@ public final class ZipTestCase extends AbstractTestCase { } // nested stream must not be closed here } - } finally { - if (in != null) { - in.close(); - } } - is.close(); assertTrue(results.contains("NestedArchiv.zip")); assertTrue(results.contains("test1.xml")); @@ -365,28 +348,28 @@ public final class ZipTestCase extends AbstractTestCase { @Test public void testCopyRawEntriesFromFile() - throws IOException { + throws IOException { final File[] tmp = createTempDirAndFile(); final File reference = createReferenceFile(tmp[0], Zip64Mode.Never, "expected."); - final File a1 = File.createTempFile("src1.", ".zip", tmp[0]); - try (final ZipArchiveOutputStream zos = new ZipArchiveOutputStream(a1)) { + final File file1 = File.createTempFile("src1.", ".zip", tmp[0]); + try (final ZipArchiveOutputStream zos = new ZipArchiveOutputStream(file1)) { zos.setUseZip64(Zip64Mode.Never); createFirstEntry(zos).close(); } - final File a2 = File.createTempFile("src2.", ".zip", tmp[0]); - try (final ZipArchiveOutputStream zos1 = new ZipArchiveOutputStream(a2)) { + final File file2 = File.createTempFile("src2.", ".zip", tmp[0]); + try (final ZipArchiveOutputStream zos1 = new ZipArchiveOutputStream(file2)) { zos1.setUseZip64(Zip64Mode.Never); createSecondEntry(zos1).close(); } - try (final ZipFile zf1 = new ZipFile(a1); final ZipFile zf2 = new ZipFile(a2)) { + try (final ZipFile zipFile1 = new ZipFile(file1); final ZipFile zipFile2 = new ZipFile(file2)) { final File fileResult = File.createTempFile("file-actual.", ".zip", tmp[0]); try (final ZipArchiveOutputStream zos2 = new ZipArchiveOutputStream(fileResult)) { - zf1.copyRawEntries(zos2, allFilesPredicate); - zf2.copyRawEntries(zos2, allFilesPredicate); + zipFile1.copyRawEntries(zos2, allFilesPredicate); + zipFile2.copyRawEntries(zos2, allFilesPredicate); } // copyRawEntries does not add superfluous zip64 header like regular zip output stream // does when using Zip64Mode.AsNeeded so all the source material has to be Zip64Mode.Never, @@ -406,17 +389,17 @@ public final class ZipTestCase extends AbstractTestCase { createFirstEntry(zos1); } - final File a1 = File.createTempFile("zip64src.", ".zip", tmp[0]); - try (final ZipArchiveOutputStream zos = new ZipArchiveOutputStream(a1)) { + final File file1 = File.createTempFile("zip64src.", ".zip", tmp[0]); + try (final ZipArchiveOutputStream zos = new ZipArchiveOutputStream(file1)) { zos.setUseZip64(Zip64Mode.Always); createFirstEntry(zos).close(); } final File fileResult = File.createTempFile("file-actual.", ".zip", tmp[0]); - try (final ZipFile zf1 = new ZipFile(a1)) { + try (final ZipFile zipFile1 = new ZipFile(file1)) { try (final ZipArchiveOutputStream zos2 = new ZipArchiveOutputStream(fileResult)) { zos2.setUseZip64(Zip64Mode.Always); - zf1.copyRawEntries(zos2, allFilesPredicate); + zipFile1.copyRawEntries(zos2, allFilesPredicate); } assertSameFileContents(reference, fileResult); } @@ -427,8 +410,8 @@ public final class ZipTestCase extends AbstractTestCase { final File[] tmp = createTempDirAndFile(); - final File a1 = File.createTempFile("unixModeBits.", ".zip", tmp[0]); - try (final ZipArchiveOutputStream zos = new ZipArchiveOutputStream(a1)) { + final File file1 = File.createTempFile("unixModeBits.", ".zip", tmp[0]); + try (final ZipArchiveOutputStream zos = new ZipArchiveOutputStream(file1)) { final ZipArchiveEntry archiveEntry = new ZipArchiveEntry("fred"); archiveEntry.setUnixMode(0664); @@ -436,7 +419,7 @@ public final class ZipTestCase extends AbstractTestCase { zos.addRawArchiveEntry(archiveEntry, new ByteArrayInputStream("fud".getBytes())); } - try (final ZipFile zf1 = new ZipFile(a1)) { + try (final ZipFile zf1 = new ZipFile(file1)) { final ZipArchiveEntry fred = zf1.getEntry("fred"); assertEquals(0664, fred.getUnixMode()); } @@ -487,12 +470,11 @@ public final class ZipTestCase extends AbstractTestCase { assertEquals(expectedElement.getExternalAttributes(), actualElement.getExternalAttributes()); assertEquals(expectedElement.getInternalAttributes(), actualElement.getInternalAttributes()); - final InputStream actualIs = actual.getInputStream(actualElement); - final InputStream expectedIs = expected.getInputStream(expectedElement); - IOUtils.readFully(expectedIs, expectedBuf); - IOUtils.readFully(actualIs, actualBuf); - expectedIs.close(); - actualIs.close(); + try (final InputStream actualIs = actual.getInputStream(actualElement); + final InputStream expectedIs = expected.getInputStream(expectedElement)) { + IOUtils.readFully(expectedIs, expectedBuf); + IOUtils.readFully(actualIs, actualBuf); + } Assert.assertArrayEquals(expectedBuf, actualBuf); // Buffers are larger than payload. dont care } @@ -666,14 +648,15 @@ public final class ZipTestCase extends AbstractTestCase { File directoryToZip = getFilesToZip(); File outputZipFile = new File(dir, "splitZip.zip"); long splitSize = 100 * 1024L; /* 100 KB */ - final ZipArchiveOutputStream zipArchiveOutputStream = new ZipArchiveOutputStream(outputZipFile, splitSize); + try (final ZipArchiveOutputStream zipArchiveOutputStream = new ZipArchiveOutputStream(outputZipFile, + splitSize)) { - // create a file that has the same name of one of the created split segments - File sameNameFile = new File(dir, "splitZip.z01"); - sameNameFile.createNewFile(); + // create a file that has the same name of one of the created split segments + File sameNameFile = new File(dir, "splitZip.z01"); + sameNameFile.createNewFile(); - addFilesToZip(zipArchiveOutputStream, directoryToZip); - zipArchiveOutputStream.close(); + addFilesToZip(zipArchiveOutputStream, directoryToZip); + } } @Test @@ -688,8 +671,6 @@ public final class ZipTestCase extends AbstractTestCase { StandardCharsets.UTF_8.toString(), true, false, true)) { ArchiveEntry entry; - File fileToCompare; - InputStream inputStreamToCompare; int filesNum = countNonDirectories(directoryToZip); int filesCount = 0; while ((entry = splitInputStream.getNextEntry()) != null) { @@ -697,11 +678,11 @@ public final class ZipTestCase extends AbstractTestCase { continue; } // compare all files one by one - fileToCompare = new File(entry.getName()); - inputStreamToCompare = new FileInputStream(fileToCompare); - Assert.assertTrue( - shaded.org.apache.commons.io.IOUtils.contentEquals(splitInputStream, inputStreamToCompare)); - inputStreamToCompare.close(); + File fileToCompare = new File(entry.getName()); + try (InputStream inputStreamToCompare = new FileInputStream(fileToCompare)) { + Assert.assertTrue( + shaded.org.apache.commons.io.IOUtils.contentEquals(splitInputStream, inputStreamToCompare)); + } filesCount++; } // and the number of files should equal @@ -766,55 +747,50 @@ public final class ZipTestCase extends AbstractTestCase { private File getFilesToZip() throws IOException { File originalZipFile = getFile("COMPRESS-477/split_zip_created_by_zip/zip_to_compare_created_by_zip.zip"); - ZipFile zipFile = new ZipFile(originalZipFile); - Enumeration<ZipArchiveEntry> zipEntries = zipFile.getEntries(); - ZipArchiveEntry zipEntry; - File outputFile; - InputStream inputStream; - OutputStream outputStream; - byte[] buffer; - int readLen; - - while (zipEntries.hasMoreElements()) { - zipEntry = zipEntries.nextElement(); - if (zipEntry.isDirectory()) { - continue; - } + try (ZipFile zipFile = new ZipFile(originalZipFile)) { + Enumeration<ZipArchiveEntry> zipEntries = zipFile.getEntries(); + ZipArchiveEntry zipEntry; + File outputFile; + byte[] buffer; + int readLen; + + while (zipEntries.hasMoreElements()) { + zipEntry = zipEntries.nextElement(); + if (zipEntry.isDirectory()) { + continue; + } - outputFile = new File(dir, zipEntry.getName()); - if (!outputFile.getParentFile().exists()) { - outputFile.getParentFile().mkdirs(); - } - outputFile = new File(dir, zipEntry.getName()); + outputFile = new File(dir, zipEntry.getName()); + if (!outputFile.getParentFile().exists()) { + outputFile.getParentFile().mkdirs(); + } + outputFile = new File(dir, zipEntry.getName()); - inputStream = zipFile.getInputStream(zipEntry); - outputStream = new FileOutputStream(outputFile); - buffer = new byte[(int)zipEntry.getSize()]; - while((readLen = inputStream.read(buffer)) > 0) { - outputStream.write(buffer, 0, readLen); + try (InputStream inputStream = zipFile.getInputStream(zipEntry); + OutputStream outputStream = new FileOutputStream(outputFile)) { + buffer = new byte[(int) zipEntry.getSize()]; + while ((readLen = inputStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, readLen); + } + } } - - inputStream.close(); - outputStream.close(); } - return dir.listFiles()[0]; } - private ZipArchiveOutputStream createTestSplitZipSegments() throws IOException { + private void createTestSplitZipSegments() throws IOException { File directoryToZip = getFilesToZip(); File outputZipFile = new File(dir, "splitZip.zip"); long splitSize = 100 * 1024L; /* 100 KB */ - final ZipArchiveOutputStream zipArchiveOutputStream = new ZipArchiveOutputStream(outputZipFile, splitSize); - - addFilesToZip(zipArchiveOutputStream, directoryToZip); - zipArchiveOutputStream.close(); - return zipArchiveOutputStream; + try (final ZipArchiveOutputStream zipArchiveOutputStream = new ZipArchiveOutputStream(outputZipFile, + splitSize)) { + addFilesToZip(zipArchiveOutputStream, directoryToZip); + } } private void addFilesToZip(ZipArchiveOutputStream zipArchiveOutputStream, File fileToAdd) throws IOException { - if(fileToAdd.isDirectory()) { - for(File file : fileToAdd.listFiles()) { + if (fileToAdd.isDirectory()) { + for (File file : fileToAdd.listFiles()) { addFilesToZip(zipArchiveOutputStream, file); } } else { @@ -822,7 +798,9 @@ public final class ZipTestCase extends AbstractTestCase { zipArchiveEntry.setMethod(ZipEntry.DEFLATED); zipArchiveOutputStream.putArchiveEntry(zipArchiveEntry); - IOUtils.copy(new FileInputStream(fileToAdd), zipArchiveOutputStream); + try (final FileInputStream input = new FileInputStream(fileToAdd)) { + IOUtils.copy(input, zipArchiveOutputStream); + } zipArchiveOutputStream.closeArchiveEntry(); } } diff --git a/src/test/java/org/apache/commons/compress/archivers/zip/ScatterSampleTest.java b/src/test/java/org/apache/commons/compress/archivers/zip/ScatterSampleTest.java index d94f294..ca6d032 100644 --- a/src/test/java/org/apache/commons/compress/archivers/zip/ScatterSampleTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/zip/ScatterSampleTest.java @@ -52,22 +52,23 @@ public class ScatterSampleTest { }; scatterSample.addEntry(archiveEntry, supp); - final ZipArchiveOutputStream zipArchiveOutputStream = new ZipArchiveOutputStream(result); - scatterSample.writeTo(zipArchiveOutputStream); - zipArchiveOutputStream.close(); + try (final ZipArchiveOutputStream zipArchiveOutputStream = new ZipArchiveOutputStream(result)) { + scatterSample.writeTo(zipArchiveOutputStream); + } } private void checkFile(final File result) throws IOException { - final ZipFile zf = new ZipFile(result); - final ZipArchiveEntry archiveEntry1 = zf.getEntries().nextElement(); - assertEquals( "test1.xml", archiveEntry1.getName()); - final InputStream inputStream = zf.getInputStream(archiveEntry1); - final byte[] b = new byte[6]; - final int i = IOUtils.readFully(inputStream, b); - assertEquals(5, i); - assertEquals('H', b[0]); - assertEquals('o', b[4]); - zf.close(); + try (final ZipFile zipFile = new ZipFile(result)) { + final ZipArchiveEntry archiveEntry1 = zipFile.getEntries().nextElement(); + assertEquals("test1.xml", archiveEntry1.getName()); + try (final InputStream inputStream = zipFile.getInputStream(archiveEntry1)) { + final byte[] b = new byte[6]; + final int i = IOUtils.readFully(inputStream, b); + assertEquals(5, i); + assertEquals('H', b[0]); + assertEquals('o', b[4]); + } + } result.delete(); } } \ No newline at end of file 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 721ab33..f9ad366 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 @@ -45,13 +45,12 @@ public class BrotliCompressorInputStreamTest extends AbstractTestCase { final File input = getFile("brotli.testdata.compressed"); final File expected = getFile("brotli.testdata.uncompressed"); try (InputStream inputStream = new FileInputStream(input); - InputStream expectedStream = new FileInputStream(expected); - BrotliCompressorInputStream brotliInputStream = new BrotliCompressorInputStream(inputStream)) { + BrotliCompressorInputStream brotliInputStream = new BrotliCompressorInputStream(inputStream)) { final byte[] b = new byte[20]; - IOUtils.readFully(expectedStream, b); + IOUtils.read(expected, b); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); int readByte = -1; - while((readByte = brotliInputStream.read()) != -1) { + while ((readByte = brotliInputStream.read()) != -1) { bos.write(readByte); } Assert.assertArrayEquals(b, bos.toByteArray()); 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 82e5075..126be75 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 @@ -46,10 +46,7 @@ public final class FramedLZ4CompressorInputStreamTest public void testMatches() throws IOException { assertFalse(FramedLZ4CompressorInputStream.matches(new byte[10], 4)); final byte[] b = new byte[12]; - final File input = getFile("bla.tar.lz4"); - try (FileInputStream in = new FileInputStream(input)) { - IOUtils.readFully(in, b); - } + IOUtils.read(getFile("bla.tar.lz4"), b); assertFalse(FramedLZ4CompressorInputStream.matches(b, 3)); assertTrue(FramedLZ4CompressorInputStream.matches(b, 4)); assertTrue(FramedLZ4CompressorInputStream.matches(b, 5)); 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 9d26d94..70e0940 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 @@ -40,10 +40,7 @@ public final class FramedSnappyCompressorInputStreamTest public void testMatches() throws IOException { assertFalse(FramedSnappyCompressorInputStream.matches(new byte[10], 10)); final byte[] b = new byte[12]; - final File input = getFile("bla.tar.sz"); - try (FileInputStream in = new FileInputStream(input)) { - IOUtils.readFully(in, b); - } + IOUtils.read(getFile("bla.tar.sz"), b); assertFalse(FramedSnappyCompressorInputStream.matches(b, 9)); assertTrue(FramedSnappyCompressorInputStream.matches(b, 10)); assertTrue(FramedSnappyCompressorInputStream.matches(b, 12)); 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 1d5f066..eae684b 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 @@ -47,10 +47,9 @@ public class ZstdCompressorInputStreamTest extends AbstractTestCase { final File input = getFile("zstandard.testdata.zst"); final File expected = getFile("zstandard.testdata"); try (InputStream inputStream = new FileInputStream(input); - InputStream expectedStream = new FileInputStream(expected); ZstdCompressorInputStream zstdInputStream = new ZstdCompressorInputStream(inputStream)) { final byte[] b = new byte[97]; - IOUtils.readFully(expectedStream, b); + IOUtils.read(expected, b); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); int readByte = -1; while((readByte = zstdInputStream.read()) != -1) {