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