/* * 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.FilenameFilter; import java.io.InputStream; import java.security.cert.Certificate; import java.util.Arrays; import java.util.Enumeration; import java.util.Random; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.zip.Deflater; import java.util.zip.Inflater; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import junit.framework.TestCase; public final class OldAndroidZipStressTest extends TestCase { /** * JarEntry.getCertificates() is really slow. http://b/1046174 */ public void checkJarCertificates(File file) throws Exception { JarFile jarFile = new JarFile(file); JarEntry je = jarFile.getJarEntry("AndroidManifest.xml"); byte[] readBuffer = new byte[1024]; long t0 = System.currentTimeMillis(); // We must read the stream for the JarEntry to retrieve its certificates. InputStream is = jarFile.getInputStream(je); while (is.read(readBuffer, 0, readBuffer.length) != -1) { } is.close(); Certificate[] certs = je != null ? je.getCertificates() : null; long t1 = System.currentTimeMillis(); System.out.println("loadCertificates() took " + (t1 - t0) + " ms"); if (certs == null) { System.out.println("We have no certificates"); } else { System.out.println("We have " + certs.length + " certificates"); } } private File[] getFiles() { File[] result = new File("/system/app").listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".apk"); } }); return result != null ? result : new File[0]; } public void testJarCertificates() throws Exception { for (File file : getFiles()) { checkJarCertificates(file); } } // Boot-time package scan is slow. Not expected to fail. Please see log if // you are interested in the results. http://b/1212257 public void testZipStressManifest() throws Exception { long time0 = System.currentTimeMillis(); byte[] buffer = new byte[512]; for (File file : getFiles()) { System.out.println("ZIP stress test processing " + file + "..."); ZipFile zip = new ZipFile(file); ZipEntry entry = zip.getEntry("AndroidManifest.xml"); InputStream stream = zip.getInputStream(entry); int j = stream.read(buffer); while (j != -1) { j = stream.read(buffer); } stream.close(); } long time1 = System.currentTimeMillis(); System.out.println("ZIP stress test finished, time was " + (time1- time0) + "ms"); } public void testZipStressAllFiles() throws Exception { long time0 = System.currentTimeMillis(); byte[] buffer = new byte[512]; for (File file : getFiles()) { System.out.println("ZIP stress test processing " + file + "..."); ZipFile zip = new ZipFile(file); Enumeration<? extends ZipEntry> entries = zip.entries(); while (entries.hasMoreElements()) { InputStream stream = zip.getInputStream(entries.nextElement()); int j = stream.read(buffer); while (j != -1) { j = stream.read(buffer); } stream.close(); } } long time1 = System.currentTimeMillis(); System.out.println("ZIP stress test finished, time was " + (time1- time0) + "ms"); } private void assertEquals(byte[] a, byte[] b) { assertTrue(Arrays.equals(a, b)); } /** * Native memory allocated by Deflater in system_server. The fix reduced * some internal ZLIB buffers in size, so this test is trying to execute a * lot of deflating to ensure that things are still working properly. * http://b/1185084 */ public void testZipDeflateInflateStress() throws Exception { final int DATA_SIZE = 16384; Random random = new Random(42); // Seed makes test reproducible // Outer loop selects "mode" of test. for (int j = 1; j <= 2; j++) { byte[] input = new byte[DATA_SIZE]; if (j == 1) { // Totally random content random.nextBytes(input); } else { // Random contents with longer repetitions int pos = 0; while (pos < input.length) { byte what = (byte)random.nextInt(256); int howMany = random.nextInt(32); if (pos + howMany >= input.length) { howMany = input.length - pos; } Arrays.fill(input, pos, pos + howMany, what); pos += howMany; } } // Inner loop tries all 9 compression levels. for (int i = 1; i <= 9; i++) { System.out.println("ZipDeflateInflateStress test (" + j + "," + i + ")..."); byte[] zipped = new byte[2 * DATA_SIZE]; // Just to make sure... Deflater deflater = new Deflater(i); deflater.setInput(input); deflater.finish(); deflater.deflate(zipped); deflater.end(); byte[] output = new byte[DATA_SIZE]; Inflater inflater = new Inflater(); inflater.setInput(zipped); inflater.finished(); inflater.inflate(output); inflater.end(); assertEquals(input, output); } } } }