1a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath/* 2a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * Copyright (C) 2015 The Android Open Source Project 3a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * 4a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * Licensed under the Apache License, Version 2.0 (the "License"); 5a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * you may not use this file except in compliance with the License. 6a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * You may obtain a copy of the License at 7a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * 8a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 9a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * 10a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * Unless required by applicable law or agreed to in writing, software 11a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 12a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * See the License for the specific language governing permissions and 14a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath * limitations under the License 15a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath */ 16a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 17a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathpackage libcore.java.util.zip; 18a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 19a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamathimport libcore.io.Streams; 20a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath 21a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.io.BufferedOutputStream; 22a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.io.File; 23a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.io.FileOutputStream; 24a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.io.IOException; 25a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamathimport java.io.InputStream; 26a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.io.OutputStream; 27a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.util.Enumeration; 28a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.util.zip.ZipEntry; 29a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.util.zip.ZipFile; 30a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathimport java.util.zip.ZipOutputStream; 31a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 32a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamathpublic final class Zip64FileTest extends AbstractZipFileTest { 33a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath @Override 34a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath protected ZipOutputStream createZipOutputStream(OutputStream wrapped) { 35a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath return new ZipOutputStream(wrapped, true /* forceZip64 */); 36a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 37a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 38a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath public void testZip64Support_largeNumberOfEntries() throws IOException { 39a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath final File file = createZipFile(65550, 2, false /* setEntrySize */); 40a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath ZipFile zf = null; 41a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath try { 42a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath zf = new ZipFile(file); 43a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertEquals(65550, zf.size()); 44a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 45a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath Enumeration<? extends ZipEntry> entries = zf.entries(); 46a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertTrue(entries.hasMoreElements()); 47a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath ZipEntry ze = entries.nextElement(); 48a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertEquals(2, ze.getSize()); 49a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath InputStream is = null; 50a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath try { 51a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath is = zf.getInputStream(ze); 52a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath byte[] uncompressed = Streams.readFully(is); 53a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath assertEquals(2, uncompressed.length); 54a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath } finally { 55a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath if (is != null) { 56a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath is.close(); 57a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath } 58a1938dec320283543ee7faeb459a2fd372ceeb4eNarayan Kamath } 59a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } finally { 60a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath if (zf != null) { 61a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath zf.close(); 62a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 63a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 64a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 65a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 66a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath public void testZip64Support_totalLargerThan4G() throws IOException { 67a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath final File file = createZipFile(5, 1073741824L, false /* setEntrySize */); 68a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath ZipFile zf = null; 69a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath try { 70a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath zf = new ZipFile(file); 71a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertEquals(5, zf.size()); 72a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath Enumeration<? extends ZipEntry> entries = zf.entries(); 73a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertTrue(entries.hasMoreElements()); 74a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath ZipEntry ze = entries.nextElement(); 75a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertEquals(1073741824L, ze.getSize()); 76a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } finally { 77a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath if (zf != null) { 78a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath zf.close(); 79a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 80a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 81a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 82a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 83a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath public void testZip64Support_hugeEntry() throws IOException { 84a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath try { 85a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath createZipFile(1, 4294967410L, false /* setEntrySize */); 86a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath fail(); 87a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } catch (IOException expected) { 88a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 89a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 90a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath final File file = createZipFile(1, 4294967410L, true /* setEntrySize */); 91a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath ZipFile zf = null; 92a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath try { 93a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath zf = new ZipFile(file); 94a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertEquals(1, zf.size()); 95a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath Enumeration<? extends ZipEntry> entries = zf.entries(); 96a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertTrue(entries.hasMoreElements()); 97a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath ZipEntry ze = entries.nextElement(); 98a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath assertEquals(4294967410L, ze.getSize()); 99a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } finally { 100a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath if (zf != null) { 101a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath zf.close(); 102a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 103a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 104a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 105a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath 106a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath private File createZipFile(int numEntries, long entrySize, boolean setEntrySize) 107a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath throws IOException { 108a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath File file = createTemporaryZipFile(); 109a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath // Don't force a 64 bit zip file to test that our heuristics work. 110a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath ZipOutputStream os = new ZipOutputStream( 111a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath new BufferedOutputStream(new FileOutputStream(file))); 112a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath writeEntries(os, numEntries, entrySize, setEntrySize); 113a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath return file; 114a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath } 115a812a87e69850d1492c45bd88d7ff3dbf21d5075Narayan Kamath} 116