Return-Path: X-Original-To: apmail-commons-commits-archive@minotaur.apache.org Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 6ABA570FD for ; Tue, 9 Aug 2011 10:33:27 +0000 (UTC) Received: (qmail 78395 invoked by uid 500); 9 Aug 2011 10:33:21 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 78044 invoked by uid 500); 9 Aug 2011 10:33:11 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 78009 invoked by uid 99); 9 Aug 2011 10:33:01 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Aug 2011 10:33:01 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Aug 2011 10:32:57 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 84FF123889E5 for ; Tue, 9 Aug 2011 10:32:36 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1155298 - in /commons/proper/compress/trunk/src: main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java test/java/org/apache/commons/compress/archivers/zip/Zip64SupportTest.java Date: Tue, 09 Aug 2011 10:32:36 -0000 To: commits@commons.apache.org From: bodewig@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110809103236.84FF123889E5@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: bodewig Date: Tue Aug 9 10:32:36 2011 New Revision: 1155298 URL: http://svn.apache.org/viewvc?rev=1155298&view=rev Log: Zip64Mode.Never was still creating extra fields for entries of unknown size when writing to a file. COMPRESS-150 Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/Zip64SupportTest.java Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java?rev=1155298&r1=1155297&r2=1155298&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java Tue Aug 9 10:32:36 2011 @@ -593,7 +593,8 @@ public class ZipArchiveOutputStream exte if (entry.entry.getSize() >= ZIP64_MAGIC || entry.entry.getCompressedSize() >= ZIP64_MAGIC || (entry.entry.getSize() == ArchiveEntry.SIZE_UNKNOWN - && raf != null)) { + && raf != null + && zip64Mode != Zip64Mode.Never)) { Zip64ExtendedInformationExtraField z64 = getZip64Extra(entry.entry); if (entry.entry.getMethod() == STORED Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/Zip64SupportTest.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/Zip64SupportTest.java?rev=1155298&r1=1155297&r2=1155298&view=diff ============================================================================== --- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/Zip64SupportTest.java (original) +++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/Zip64SupportTest.java Tue Aug 9 10:32:36 2011 @@ -647,7 +647,7 @@ public class Zip64SupportTest { @Test public void writeBigStoredEntryUnnownSizeToFileModeNever() throws Throwable { - withTemporaryArchive("writeBigStoredEntryUnknownSizeToFile", + withTemporaryArchive("writeBigStoredEntryUnknownSizeToFileModeNever", writeBigStoredEntryModeNever(false), true); } @@ -1079,9 +1079,17 @@ public class Zip64SupportTest { * Creates a temporary archive of approx 1MB in size */ private static ZipOutputTest writeSmallStoredEntry(final boolean knownSize) { + return writeSmallStoredEntry(knownSize, Zip64Mode.AsNeeded); + } + + private static ZipOutputTest writeSmallStoredEntry(final boolean knownSize, + final Zip64Mode mode) { return new ZipOutputTest() { public void test(File f, ZipArchiveOutputStream zos) throws IOException { + if (mode != Zip64Mode.AsNeeded) { + zos.setUseZip64(mode); + } byte[] buf = new byte[ONE_MILLION]; ZipArchiveEntry zae = new ZipArchiveEntry("0"); if (knownSize) { @@ -1146,7 +1154,10 @@ public class Zip64SupportTest { // and now validate local file header: this one // has a ZIP64 extra field if and only if size was - // unknown + // unknown and mode was not Never or the mode was + // Always (regardless of size) + boolean hasExtra = mode == Zip64Mode.Always + || (mode == Zip64Mode.AsNeeded && !knownSize); a.seek(0); header = new byte[10]; a.readFully(header); @@ -1175,11 +1186,11 @@ public class Zip64SupportTest { // file name length 1, 0, // extra field length - (byte) (knownSize ? 0 : 20), 0, + (byte) (!hasExtra ? 0 : 20), 0, // file name (byte) '0' }, rest); - if (!knownSize) { + if (hasExtra) { byte[] extra = new byte[20]; a.readFully(extra); assertArrayEquals(new byte[] { @@ -1220,20 +1231,35 @@ public class Zip64SupportTest { true); } - /* - * One entry of length 1 million bytes, written with compression - * to a stream. - * - * Compression + Stream => sizes are set to 0 in LFH, real values - * are inside the data descriptor. No ZIP64 extra field at all. - */ - @Test public void writeSmallDeflatedEntryKnownSizeToStream() + @Test public void writeSmallStoredEntryToStreamModeNever() throws Throwable { + withTemporaryArchive("writeSmallStoredEntryToStreamModeNever", + writeSmallStoredEntry(true, Zip64Mode.Never), + false); + } + + @Test public void writeSmallStoredEntryKnownSizeToFileModeNever() throws Throwable { - withTemporaryArchive("writeSmallDeflatedEntryKnownSizeToStream", - new ZipOutputTest() { + withTemporaryArchive("writeSmallStoredEntryKnownSizeToFileModeNever", + writeSmallStoredEntry(true, Zip64Mode.Never), + true); + } + + @Test public void writeSmallStoredEntryUnnownSizeToFileModeNever() + throws Throwable { + withTemporaryArchive("writeSmallStoredEntryUnknownSizeToFileModeNever", + writeSmallStoredEntry(false, Zip64Mode.Never), + true); + } + + private static ZipOutputTest + writeSmallDeflatedEntryKnownSizeToStream(final Zip64Mode mode) { + return new ZipOutputTest() { public void test(File f, ZipArchiveOutputStream zos) throws IOException { + if (mode != Zip64Mode.AsNeeded) { + zos.setUseZip64(mode); + } byte[] buf = new byte[ONE_MILLION]; ZipArchiveEntry zae = new ZipArchiveEntry("0"); @@ -1352,15 +1378,57 @@ public class Zip64SupportTest { // file name length 1, 0, // extra field length - 0, 0, + mode == Zip64Mode.Always + ? (byte) 20 : 0, + 0, // file name (byte) '0' }, rest); + if (mode == Zip64Mode.Always) { + byte[] extra = new byte[20]; + a.readFully(extra); + assertArrayEquals(new byte[] { + // Header-ID + 1, 0, + // size of extra + 16, 0, + // original size + (byte) 0x40, (byte) 0x42, (byte) 0x0F, 0, + 0, 0, 0, 0, + // compressed size + (byte) 0x40, (byte) 0x42, (byte) 0x0F, 0, + 0, 0, 0, 0, + }, extra); + } + } finally { a.close(); } } - }, + }; + + } + + /* + * One entry of length 1 million bytes, written with compression + * to a stream. + * + * Compression + Stream => sizes are set to 0 in LFH, real values + * are inside the data descriptor. No ZIP64 extra field at all. + */ + @Test public void writeSmallDeflatedEntryKnownSizeToStream() + throws Throwable { + withTemporaryArchive("writeSmallDeflatedEntryKnownSizeToStream", + writeSmallDeflatedEntryKnownSizeToStream(Zip64Mode + .AsNeeded), + false); + } + + @Test public void writeSmallDeflatedEntryKnownSizeToStreamModeNever() + throws Throwable { + withTemporaryArchive("writeSmallDeflatedEntryKnownSizeToStreamModeNever", + writeSmallDeflatedEntryKnownSizeToStream(Zip64Mode + .Never), false); } @@ -1373,9 +1441,18 @@ public class Zip64SupportTest { * field if size was known. */ private static ZipOutputTest writeSmallDeflatedEntryToFile(final boolean knownSize) { + return writeSmallDeflatedEntryToFile(knownSize, Zip64Mode.AsNeeded); + } + + private static ZipOutputTest + writeSmallDeflatedEntryToFile(final boolean knownSize, + final Zip64Mode mode) { return new ZipOutputTest() { public void test(File f, ZipArchiveOutputStream zos) throws IOException { + if (mode != Zip64Mode.AsNeeded) { + zos.setUseZip64(mode); + } byte[] buf = new byte[ONE_MILLION]; ZipArchiveEntry zae = new ZipArchiveEntry("0"); if (knownSize) { @@ -1467,17 +1544,21 @@ public class Zip64SupportTest { a.skipBytes(4); rest = new byte[9]; a.readFully(rest); + + boolean hasExtra = mode == Zip64Mode.Always + || (mode == Zip64Mode.AsNeeded && !knownSize); + assertArrayEquals(new byte[] { // Original Size (byte) 0x40, (byte) 0x42, (byte) 0x0F, 0, // file name length 1, 0, // extra field length - (byte) (knownSize ? 0 : 20), 0, + (byte) (!hasExtra ? 0 : 20), 0, // file name (byte) '0' }, rest); - if (!knownSize) { + if (hasExtra) { byte[] extra = new byte[12]; a.readFully(extra); assertArrayEquals(new byte[] { @@ -1515,6 +1596,22 @@ public class Zip64SupportTest { true); } + @Test public void writeSmallDeflatedEntryKnownSizeToFileModeNever() + throws Throwable { + withTemporaryArchive("writeSmallDeflatedEntryKnownSizeToFileModeNever", + writeSmallDeflatedEntryToFile(true, + Zip64Mode.Never), + true); + } + + @Test public void writeSmallDeflatedEntryUnknownSizeToFileModeNever() + throws Throwable { + withTemporaryArchive("writeSmallDeflatedEntryUnknownSizeToFileModeNever", + writeSmallDeflatedEntryToFile(false, + Zip64Mode.Never), + true); + } + static interface ZipOutputTest { void test(File f, ZipArchiveOutputStream zos) throws IOException; }