JarFileTest.java revision 229e34b182b98e1dba15d3dc6341954986ae2b7a
1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.archive.tests.java.util.jar; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grobimport junit.framework.TestCase; 21d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 22d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grobimport tests.support.Support_PlatformFile; 23d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grobimport tests.support.resource.Support_Resources; 24d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileOutputStream; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Permission; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Attributes; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarEntry; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarFile; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarOutputStream; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Manifest; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipEntry; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipException; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipFile; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JarFileTest extends TestCase { 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getAllBytesFromStream(InputStream is) throws IOException { 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream bs = new ByteArrayOutputStream(); 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buf = new byte[666]; 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int iRead; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int off; 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (is.available() > 0) { 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project iRead = is.read(buf, 0, buf.length); 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (iRead > 0) bs.write(buf, 0, iRead); 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return bs.toByteArray(); 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName = "hyts_patch.jar"; // a 'normal' jar file 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName2 = "hyts_patch2.jar"; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName3 = "hyts_manifest1.jar"; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName4 = "hyts_signed.jar"; 6957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String jarName5 = "hyts_signed_inc.jar"; 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String entryName = "foo/bar/A.class"; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String entryName3 = "coucou/FileAccess.class"; 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String integrateJar = "Integrate.jar"; 77d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 7857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson private final String integrateJarEntry = "Test.class"; 7957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 80d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntryJar = "EmptyEntries_signed.jar"; 81d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 82d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry1 = "subfolder/internalSubset01.js"; 83d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 84d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry2 = "svgtest.js"; 85d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 86d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob private final String emptyEntry3 = "svgunit.js"; 87d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private File resources; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // custom security manager 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = new SecurityManager() { 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final String forbidenPermissionName = "user.dir"; 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void checkPermission(Permission perm) { 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (perm.getName().equals(forbidenPermissionName)) { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SecurityException(); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setUp() { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resources = Support_Resources.createTempFolder(); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 107229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File) 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_File() { 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file")); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 126229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String) 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_lang_String() { 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile("Wrong.file"); 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fileName = (new File(resources, jarName)).getCanonicalPath(); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(fileName); 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 146229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String, boolean) 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_lang_StringZ() { 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile("Wrong.file", false); 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fileName = (new File(resources, jarName)).getCanonicalPath(); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(fileName, true); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 166229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File, boolean) 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_FileZ() { 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file"), true); 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 185229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File, boolean, int) 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_FileZI() { 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File("Wrong.file"), true, 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IOException"); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false, 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ); 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName), false, 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.OPEN_READ | ZipFile.OPEN_DELETE + 33); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should throw IllegalArgumentException"); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Should not throw IOException"); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalArgumentException e) { 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 21757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * Constructs JarFile object. 21857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * 219229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.io.File) 220229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#JarFile(java.lang.String) 22157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 22257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testConstructor_file() throws IOException { 22357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, jarName); 22457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 22557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue(new JarFile(f).getEntry(entryName).getName().equals( 22657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName)); 22757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue(new JarFile(f.getPath()).getEntry(entryName).getName() 22857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .equals(entryName)); 22957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 23057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 23157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 232229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#entries() 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_entries() throws Exception { 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note only (and all of) the following should be contained in the file 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * META-INF/ META-INF/MANIFEST.MF foo/ foo/bar/ foo/bar/A.class Blah.txt 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> e = jarFile.entries(); 24257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int i; 24357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (i = 0; e.hasMoreElements(); i++) { 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project e.nextElement(); 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 24657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals(jarFile.size(), i); 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(6, i); 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_entries2() throws Exception { 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration.hasMoreElements(); 25857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("hasMoreElements() did not detect a closed jar file"); 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException e) { 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile = new JarFile(new File(resources, jarName)); 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration.nextElement(); 26757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("nextElement() did not detect closed jar file"); 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException e) { 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 274229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getEntryLjava_lang_String() throws IOException { 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getEntry( 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getEntry(je.getName()); 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getEntry(je.getName()); 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 311229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getJarEntryLjava_lang_String() throws IOException { 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Error in returned entry", 311, jarFile.getJarEntry( 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entryName).getSize()); 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test: " + e.toString()); 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> enumeration = jarFile.entries(); 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enumeration = jarFile.entries(); 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue(enumeration.hasMoreElements()); 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry je = enumeration.nextElement(); 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getJarEntry(je.getName()); 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // fail("IllegalStateException expected."); 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ee) { // Per documentation exception 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may be thrown. 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 34757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 348229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getJarEntry(java.lang.String) 34957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 35057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testGetJarEntry() throws Exception { 35157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 35257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(new File(resources, jarName)); 35357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertEquals("Error in returned entry", 311, jarFile.getEntry( 35457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson entryName).getSize()); 35557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.close(); 35657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 35757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // tests for signed jars 35857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // test all signed jars in the /Testres/Internal/SignedJars directory 35957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarDirUrl = Support_Resources 36057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson .getResourceURL("/../internalres/signedjars"); 36157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Vector<String> signedJars = new Vector<String>(); 36257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 36357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = new URL(jarDirUrl + "/jarlist.txt").openStream(); 36457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (is.available() > 0) { 36557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuilder linebuff = new StringBuilder(80); // Typical line 36657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // length 36757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson done: while (true) { 36857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int nextByte = is.read(); 36957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson switch (nextByte) { 37057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case -1: 37157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 37257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\r': 37357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 37457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 37557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 37657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 37757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson case (byte) '\n': 37857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 37957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // ignore 38057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 38157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break done; 38257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson default: 38357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson linebuff.append((char) nextByte); 38457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 38557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 38657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (linebuff.length() == 0) { 38757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 38857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 38957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String line = linebuff.toString(); 39057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson signedJars.add(line); 39157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 39257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 39357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 39457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // no list of jars found 39557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 39657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 39757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < signedJars.size(); i++) { 39857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String jarName = signedJars.get(i); 39957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 40057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File file = Support_Resources.getExternalLocalFile(jarDirUrl 40157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "/" + jarName); 40257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(file, true); 40357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson boolean foundCerts = false; 40457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Enumeration<JarEntry> e = jarFile.entries(); 40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson while (e.hasMoreElements()) { 40657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry entry = e.nextElement(); 40757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream is = jarFile.getInputStream(entry); 40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.skip(100000); 40957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 41057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Certificate[] certs = entry.getCertificates(); 41157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson if (certs != null && certs.length > 0) { 41257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson foundCerts = true; 41357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson break; 41457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 41557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 41657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue( 41757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson "No certificates found during signed jar test for jar \"" 41857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + jarName + "\"", foundCerts); 41957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IOException e) { 42057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during signed jar test for jar \"" + jarName 42157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson + "\": " + e.toString()); 42257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 42557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 427229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getManifest() 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getManifest() { 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Test for method java.util.jar.Manifest 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // java.util.jar.JarFile.getManifest() 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName); 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName)); 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Error--Manifest not returned", jarFile.getManifest()); 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 1st test: " + e.toString()); 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName2)); 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("Error--should have returned null", jarFile 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 2nd test: " + e.toString()); 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // jarName3 was created using the following test 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName3); 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, jarName3)); 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jarFile 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 3rd test: " + e.toString()); 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is used to create jarName3 used in the previous test 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Manifest manifest = new Manifest(); 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Attributes attributes = manifest.getMainAttributes(); 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributes.put(new Attributes.Name("Manifest-Version"), "1.0"); 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream manOut = new ByteArrayOutputStream(); 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project manifest.write(manOut); 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] manBytes = manOut.toByteArray(); 469206059bac7dbb60f56c3a81eef12e13b1eaac218Jorg Pleumann File file = File.createTempFile( 470206059bac7dbb60f56c3a81eef12e13b1eaac218Jorg Pleumann Support_PlatformFile.getNewPlatformFile("hyts_manifest1", 471206059bac7dbb60f56c3a81eef12e13b1eaac218Jorg Pleumann ""), ".jar"); 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarOutputStream jarOut = new JarOutputStream(new FileOutputStream( 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.getAbsolutePath())); 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry entry = new ZipEntry("META-INF/"); 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(0); 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry(JarFile.MANIFEST_NAME); 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(manBytes.length); 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(manBytes); 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry = new ZipEntry("myfile"); 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1); 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.putNextEntry(entry); 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.write(65); 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarOut.close(); 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(file.getAbsolutePath(), false); 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("Should find manifest without verifying", jar 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getManifest()); 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jar.close(); 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file.delete(); 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException 3"); 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName2); 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jF = new JarFile(new File(resources, jarName2)); 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.close(); 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jF.getManifest(); 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("FAILED: expected IllegalStateException"); 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalStateException ise) { 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected; 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during 4th test: " + e.toString()); 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, "Broken_manifest.jar"); 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jf; 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf = new JarFile(new File(resources, "Broken_manifest.jar")); 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jf.getManifest(); 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IOException expected."); 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected. 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 518229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 520703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // This test doesn't pass on RI. If entry size is set up incorrectly, 521703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // SecurityException is thrown. But SecurityException is thrown on RI only 522703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // if jar file is signed incorrectly. 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getInputStreamLjava_util_jar_JarEntry_subtest0() { 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project File signedFile = null; 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName4); 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName4); 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 2: " + e); 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(); 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 3: " + e); 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNull("found certificates", entry.getCertificates()); 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 4: " + e); 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 55257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entry.setSize(1076); 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] dummy = getAllBytesFromStream(in); 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, jarName5); 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project signedFile = new File(resources, jarName5); 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Failed to create local file 5: " + e); 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 57457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jar = new JarFile(signedFile); 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarEntry entry = new JarEntry(entryName3); 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jar.getInputStream(entry); 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("SecurityException should be thrown."); 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Exception during test 5: " + e); 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The jar created by 1.4 which does not provide a 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm-Digest-Manifest-Main-Attributes entry in .SF file. 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Jar_created_before_java_5() throws IOException { 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Created_by_1_4.jar"; 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The jar is intact, then everything is all right. */ 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Integrate_Jar() throws IOException { 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Integrate.jar"; 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 61257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 61357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 61457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 61557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 61657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 61757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * The jar is intact, but the entry object is modified. 61857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 61957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void testJarVerificationModifiedEntry() throws IOException { 62057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, integrateJar); 62157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File f = new File(resources, integrateJar); 62257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 62357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jarFile = new JarFile(f); 62457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson ZipEntry zipEntry = jarFile.getJarEntry(integrateJarEntry); 62557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() + 1); 62657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 62757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 62857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile = new JarFile(f); 62957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry = jarFile.getJarEntry(integrateJarEntry); 63057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson zipEntry.setSize(zipEntry.getSize() - 1); 63157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 63257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson //jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE); 63357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jarFile.getInputStream(zipEntry).read(new byte[5000], 0, 5000); 63457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 63557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (SecurityException e) { 63657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // desired 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_InsertEntry_in_Manifest_Jar() throws IOException { 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest.jar"; 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another entry is inserted into Manifest, no security exception will be 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown out. 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_Inserted_Entry_Manifest_with_DigestCode() 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Inserted_Entry_Manifest_with_DigestCode.jar"; 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = 0; 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count++; 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals(5, count); 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The content of Test.class is modified, jarFile.getInputStream will not 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * throw security Exception, but it will anytime before the inputStream got 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from getInputStream method has been read to end. 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Class() throws IOException { 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Class.jar"; 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* The content of Test.class has been tampered. */ 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = jarFile.getEntry("Test.class"); 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputStream in = jarFile.getInputStream(zipEntry); 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buffer = new byte[1024]; 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (in.available() > 0) { 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.read(buffer); 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 70357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In the Modified.jar, the main attributes of META-INF/MANIFEST.MF is 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tampered manually. Hence the RI 5.0 JarFile.getInputStream of any 71257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * JarEntry will throw security exception. 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_MainAttributes() 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_MainAttributes.jar"; 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 72557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("SecurityException expected"); 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It is all right in our original JarFile. If the Entry Attributes, for 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example Test.class in our jar, the jarFile.getInputStream will throw 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Security Exception. 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_Manifest_EntryAttributes() 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_Manifest_EntryAttributes.jar"; 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the content of the .SA file is modified, no matter what it resides, 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * JarFile.getInputStream of any JarEntry will throw Security Exception. 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_JarFile_Modified_SF_EntryAttributes() throws IOException { 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (entries.hasMoreElements()) { 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipEntry zipEntry = entries.nextElement(); 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.getInputStream(zipEntry); 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("should throw Security Exception"); 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SecurityException e) { 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desired 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_close() throws IOException { 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String modifiedJarName = "Modified_SF_EntryAttributes.jar"; 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Support_Resources.copyFile(resources, null, modifiedJarName); 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project JarFile jarFile = new JarFile(new File(resources, modifiedJarName), 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project true); 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<JarEntry> entries = jarFile.entries(); 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project jarFile.close(); 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Can not check IOException 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 78957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson /** 79057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson * @throws IOException 791229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry) 79257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson */ 79357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson public void test_getInputStreamLjava_util_jar_JarEntry() throws IOException { 79457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File localFile = null; 79557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 79657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 79757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson localFile = new File(resources, jarName); 79857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 79957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Failed to create local file: " + e); 80057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 80157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 80257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson byte[] b = new byte[1024]; 80357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 80457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 80557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson java.io.InputStream is = jf.getInputStream(jf.getEntry(entryName)); 80657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-removed 80757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // jf.close(); 80857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-removed 80957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Returned invalid stream", is.available() > 0); 81057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson int r = is.read(b, 0, 1024); 81157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson is.close(); 81257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson StringBuffer sb = new StringBuffer(r); 81357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson for (int i = 0; i < r; i++) { 81457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson sb.append((char) (b[i] & 0xff)); 81557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 81657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson String contents = sb.toString(); 81757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertTrue("Incorrect stream read", contents.indexOf("bar") > 0); 81857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // BEGIN android-added 81957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 82057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // END android-added 82157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 82257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test: " + e.toString()); 82357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 82457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 82557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 82657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(localFile); 82757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson InputStream in = jf.getInputStream(new JarEntry("invalid")); 82857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson assertNull("Got stream for non-existent entry", in); 82957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (Exception e) { 83057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Exception during test 2: " + e); 83157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 83257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 83357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 83457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 83557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 83657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 83757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 83857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 83957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 84057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 84157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // fail("Should throw ZipException"); 84257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (ZipException ee) { 84357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 84457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 84557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson 84657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson try { 84757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson Support_Resources.copyFile(resources, null, jarName); 84857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson File signedFile = new File(resources, jarName); 84957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarFile jf = new JarFile(signedFile); 85057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson JarEntry jre = new JarEntry("foo/bar/A.class"); 85157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.close(); 85257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson jf.getInputStream(jre); 85357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // InputStream returned in any way, exception can be thrown in case 85457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // of reading from this stream only. 85557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // The same for IOException 85657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson fail("Should throw IllegalStateException"); 85757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } catch (IllegalStateException ee) { 85857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson // expected 85957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 86057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson } 861d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 862d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob /** 863d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob * The jar is intact, but the entry object is modified. 864d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob */ 865703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes // Regression test for issue introduced by HARMONY-4569: signed archives containing files with size 0 could not get verified. 866d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob public void testJarVerificationEmptyEntry() throws IOException { 867d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob Support_Resources.copyFile(resources, null, emptyEntryJar); 868d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob File f = new File(resources, emptyEntryJar); 869d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 870d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob JarFile jarFile = new JarFile(f); 871d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 872d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob ZipEntry zipEntry = jarFile.getJarEntry(emptyEntry1); 873d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob int res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 874d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 875d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 876d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry2); 877d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); 878d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 879d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob 880d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob zipEntry = jarFile.getJarEntry(emptyEntry3); 881d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob res = jarFile.getInputStream(zipEntry).read(); 882d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob assertEquals("Wrong length of empty jar entry", -1, res); 883d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob } 884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 885