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