1990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson/*
2990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * Copyright (C) 2008 The Android Open Source Project
3990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson *
4990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * you may not use this file except in compliance with the License.
6990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * You may obtain a copy of the License at
7990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson *
8990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson *
10990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * Unless required by applicable law or agreed to in writing, software
11990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * See the License for the specific language governing permissions and
14990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * limitations under the License.
15990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson */
16990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
17990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonpackage libcore.java.util.zip;
18990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
19990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport java.io.ByteArrayInputStream;
20990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport java.io.ByteArrayOutputStream;
21990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport java.io.IOException;
22990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport java.util.zip.ZipEntry;
23990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport java.util.zip.ZipInputStream;
24990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport java.util.zip.ZipOutputStream;
25990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport junit.framework.TestCase;
26990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
27990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson/**
28990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * Basic tests for ZipStream
29990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson */
30990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonpublic class OldAndroidZipStreamTest extends TestCase {
31990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
32990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    public void testZipStream() throws Exception {
33990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
34990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        createCompressedZip(bytesOut);
35990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
36990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        byte[] zipData = bytesOut.toByteArray();
37990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
38990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        /*
39990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        FileOutputStream outFile = new FileOutputStream("/tmp/foo.zip");
40990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        outFile.write(zipData, 0, zipData.length);
41990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        outFile.close();
42990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        */
43990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
44990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        /*
45990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        FileInputStream inFile = new FileInputStream("/tmp/foo.zip");
46990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        int inputLength = inFile.available();
47990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        zipData = new byte[inputLength];
48990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        if (inFile.read(zipData) != inputLength)
49990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            throw new RuntimeException();
50990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        inFile.close();
51990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        */
52990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
53990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        ByteArrayInputStream bytesIn = new ByteArrayInputStream(zipData);
54990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        scanZip(bytesIn);
55990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
56990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        bytesOut = new ByteArrayOutputStream();
57990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        createUncompressedZip(bytesOut);
58990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
59990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        zipData = bytesOut.toByteArray();
60990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
61990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        bytesIn = new ByteArrayInputStream(zipData);
62990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        scanZip(bytesIn);
63990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
64990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
65990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    /*
66990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson     * stepStep == 0 --> >99% compression
67990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson     * stepStep == 1 --> ~30% compression
68990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson     * stepStep == 2 --> no compression
69990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson     */
70990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    private static byte[] makeSampleFile(int stepStep) throws IOException {
71990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        byte[] sample = new byte[128 * 1024];
72990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        byte val, step;
73990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        int i, j, offset;
74990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
75990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        val = 0;
76990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        step = 1;
77990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        offset = 0;
78990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        for (i = 0; i < (128 * 1024) / 256; i++) {
79990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            for (j = 0; j < 256; j++) {
80990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                sample[offset++] = val;
81990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                val += step;
82990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            }
83990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
84990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            step += stepStep;
85990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        }
86990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
87990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        return sample;
88990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
89990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
90990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    private static void createCompressedZip(ByteArrayOutputStream bytesOut) throws IOException {
91990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        ZipOutputStream out = new ZipOutputStream(bytesOut);
92990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        try {
93990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            int i;
94990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
95990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            for (i = 0; i < 3; i++) {
96990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                byte[] input = makeSampleFile(i);
97990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                ZipEntry newEntry = new ZipEntry("file-" + i);
98990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
99990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                if (i != 1)
100990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                    newEntry.setComment("this is file " + i);
101990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                out.putNextEntry(newEntry);
102990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                out.write(input, 0, input.length);
103990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                out.closeEntry();
104990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            }
105990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
106990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            out.setComment("This is a lovely compressed archive!");
107990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        } finally {
108990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            out.close();
109990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        }
110990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
111990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
112990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    private static void createUncompressedZip(ByteArrayOutputStream bytesOut) throws IOException {
113990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        ZipOutputStream out = new ZipOutputStream(bytesOut);
114990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        try {
115990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            long[] crcs = {0x205fbff3, 0x906fae57L, 0x2c235131};
116990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            int i;
117990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
118990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            for (i = 0; i < 3; i++) {
119990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                byte[] input = makeSampleFile(i);
120990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                ZipEntry newEntry = new ZipEntry("file-" + i);
121990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
122990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                if (i != 1)
123990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                    newEntry.setComment("this is file " + i);
124990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                newEntry.setMethod(ZipEntry.STORED);
125990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                newEntry.setSize(128 * 1024);
126990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                newEntry.setCrc(crcs[i]);
127990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                out.putNextEntry(newEntry);
128990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                out.write(input, 0, input.length);
129990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                out.closeEntry();
130990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            }
131990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
132990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            out.setComment("This is a lovely, but uncompressed, archive!");
133990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        } finally {
134990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            out.close();
135990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        }
136990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
137990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
138990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    private static void scanZip(ByteArrayInputStream bytesIn) throws IOException {
139990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        ZipInputStream in = new ZipInputStream(bytesIn);
140990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        try {
141990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            int i;
142990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
143990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            for (i = 0; i < 3; i++) {
144990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                ZipEntry entry = in.getNextEntry();
145990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                ByteArrayOutputStream contents = new ByteArrayOutputStream();
146990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                byte[] buf = new byte[4096];
147990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                int len, totalLen = 0;
148990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
149990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                while ((len = in.read(buf)) > 0) {
150990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                    contents.write(buf, 0, len);
151990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                    totalLen += len;
152990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                }
153990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
154990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                assertEquals(128 * 1024, totalLen);
155990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
156990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson//                System.out.println("OldAndroidZipStreamTest: name='" + entry.getName()
157990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson//                        + "', zero=" + contents.toByteArray()[0]
158990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson//                        + ", tfs=" + contents.toByteArray()[257]
159990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson//                        + ", crc=" + Long.toHexString(entry.getCrc()));
160990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            }
161990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
162990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            assertNull("should only be three entries", in.getNextEntry());
163990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        } finally {
164990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            in.close();
165990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        }
166990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
167990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson}
168990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
169