/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package libcore.java.util.zip; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import junit.framework.TestCase; /** * Basic tests for ZipFile. */ public class OldAndroidZipFileTest extends TestCase { private static final int SAMPLE_SIZE = 128 * 1024; public void testZipFile() throws Exception { File file = File.createTempFile("ZipFileTest", ".zip"); try { // create a test file; assume it's not going to collide w/anything FileOutputStream outStream = new FileOutputStream(file); createCompressedZip(outStream); scanZip(file.getPath()); read2(file.getPath()); } finally { file.delete(); } } /* * stepStep == 0 --> >99% compression * stepStep == 1 --> ~30% compression * stepStep == 2 --> no compression */ static byte[] makeSampleFile(int stepStep) throws IOException { byte[] sample = new byte[SAMPLE_SIZE]; byte val, step; int i, j, offset; val = 0; step = 1; offset = 0; for (i = 0; i < SAMPLE_SIZE / 256; i++) { for (j = 0; j < 256; j++) { sample[offset++] = val; val += step; } step += stepStep; } return sample; } static void createCompressedZip(OutputStream bytesOut) throws IOException { ZipOutputStream out = new ZipOutputStream(bytesOut); try { int i; for (i = 0; i < 3; i++) { byte[] input = makeSampleFile(i); ZipEntry newEntry = new ZipEntry("file-" + i); if (i != 1) { newEntry.setComment("this is file " + i); } out.putNextEntry(newEntry); out.write(input, 0, input.length); out.closeEntry(); } out.setComment("This is a lovely compressed archive!"); } finally { out.close(); } } static void scanZip(String fileName) throws IOException { ZipFile zipFile = new ZipFile(fileName); Enumeration fileList; int idx = 0; // System.out.println("Contents of " + zipFile + ":"); for (fileList = zipFile.entries(); fileList.hasMoreElements();) { ZipEntry entry = (ZipEntry) fileList.nextElement(); // System.out.println(" " + entry.getName()); assertEquals(entry.getName(), "file-" + idx); idx++; } zipFile.close(); } /* * Read compressed data from two different entries at the same time, * to verify that the streams aren't getting confused. If we do * something wrong, the inflater will choke and throw a ZipException. * * This doesn't test synchronization in multi-threaded use. */ static void read2(String fileName) throws IOException { ZipFile zipFile; ZipEntry entry1, entry2; byte buf[] = new byte[16384]; InputStream stream1, stream2; int len, totalLen1, totalLen2; /* use file-1 and file-2 because the compressed data is large */ zipFile = new ZipFile(fileName); entry1 = zipFile.getEntry("file-1"); entry2 = zipFile.getEntry("file-2"); /* make sure we got the right thing */ assertEquals("file-1", entry1.getName()); assertEquals("file-2", entry2.getName()); /* create streams */ stream1 = zipFile.getInputStream(entry1); stream2 = zipFile.getInputStream(entry2); /* * Read a piece of file #1. */ totalLen1 = stream1.read(buf); assertTrue("initial read failed on #1", totalLen1 >= 0); /* * Read a piece of file #2. */ totalLen2 = stream2.read(buf); assertTrue("initial read failed on #2", totalLen2 >= 0); /* * Read the rest of file #1, and close the stream. * * If our streams are crossed up, we'll fail here. */ while ((len = stream1.read(buf)) > 0) { totalLen1 += len; } assertEquals(SAMPLE_SIZE, totalLen1); stream1.close(); /* * Read the rest of file #2, and close the stream. */ while ((len = stream2.read(buf)) > 0) { totalLen2 += len; } assertEquals(SAMPLE_SIZE, totalLen2); stream2.close(); /* * Open a new one. */ stream1 = zipFile.getInputStream(zipFile.getEntry("file-0")); /* * Close the ZipFile. According to the RI, none if its InputStreams can * be read after this point. */ zipFile.close(); Exception error = null; try { stream1.read(buf); } catch (Exception ex) { error = ex; } assertNotNull("ZipFile shouldn't allow reading of closed files.", error); } }