19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.core;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayInputStream;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayOutputStream;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.zip.ZipEntry;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.zip.ZipInputStream;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.zip.ZipOutputStream;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Basic tests for ZipStream
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ZipStreamTest extends TestCase {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testZipStream() throws Exception {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createCompressedZip(bytesOut);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] zipData = bytesOut.toByteArray();
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream outFile = new FileOutputStream("/tmp/foo.zip");
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outFile.write(zipData, 0, zipData.length);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outFile.close();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileInputStream inFile = new FileInputStream("/tmp/foo.zip");
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int inputLength = inFile.available();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        zipData = new byte[inputLength];
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (inFile.read(zipData) != inputLength)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inFile.close();
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ByteArrayInputStream bytesIn = new ByteArrayInputStream(zipData);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scanZip(bytesIn);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bytesOut = new ByteArrayOutputStream();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        createUncompressedZip(bytesOut);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        zipData = bytesOut.toByteArray();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bytesIn = new ByteArrayInputStream(zipData);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scanZip(bytesIn);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stepStep == 0 --> >99% compression
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stepStep == 1 --> ~30% compression
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stepStep == 2 --> no compression
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static byte[] makeSampleFile(int stepStep) throws IOException {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] sample = new byte[128 * 1024];
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte val, step;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i, j, offset;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        val = 0;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        step = 1;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        offset = 0;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i = 0; i < (128 * 1024) / 256; i++) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (j = 0; j < 256; j++) {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sample[offset++] = val;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val += step;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            step += stepStep;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sample;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void createCompressedZip(ByteArrayOutputStream bytesOut) throws IOException {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ZipOutputStream out = new ZipOutputStream(bytesOut);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i = 0; i < 3; i++) {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] input = makeSampleFile(i);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ZipEntry newEntry = new ZipEntry("file-" + i);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i != 1)
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    newEntry.setComment("this is file " + i);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.putNextEntry(newEntry);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(input, 0, input.length);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.closeEntry();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.setComment("This is a lovely compressed archive!");
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.close();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void createUncompressedZip(ByteArrayOutputStream bytesOut) throws IOException {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ZipOutputStream out = new ZipOutputStream(bytesOut);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long[] crcs = {0x205fbff3, 0x906fae57L, 0x2c235131};
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i = 0; i < 3; i++) {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] input = makeSampleFile(i);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ZipEntry newEntry = new ZipEntry("file-" + i);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i != 1)
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    newEntry.setComment("this is file " + i);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newEntry.setMethod(ZipEntry.STORED);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newEntry.setSize(128 * 1024);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newEntry.setCrc(crcs[i]);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.putNextEntry(newEntry);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(input, 0, input.length);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.closeEntry();
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.setComment("This is a lovely, but uncompressed, archive!");
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.close();
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void scanZip(ByteArrayInputStream bytesIn) throws IOException {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ZipInputStream in = new ZipInputStream(bytesIn);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i = 0; i < 3; i++) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ZipEntry entry = in.getNextEntry();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ByteArrayOutputStream contents = new ByteArrayOutputStream();
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] buf = new byte[4096];
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int len, totalLen = 0;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while ((len = in.read(buf)) > 0) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    contents.write(buf, 0, len);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    totalLen += len;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assertEquals(128 * 1024, totalLen);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                System.out.println("ZipStreamTest: name='" + entry.getName()
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                        + "', zero=" + contents.toByteArray()[0]
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                        + ", tfs=" + contents.toByteArray()[257]
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                        + ", crc=" + Long.toHexString(entry.getCrc()));
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertNull("should only be three entries", in.getNextEntry());
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.close();
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
172