1807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath/* 2807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * Licensed to the Apache Software Foundation (ASF) under one or more 3807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * contributor license agreements. See the NOTICE file distributed with 4807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * this work for additional information regarding copyright ownership. 5807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * The ASF licenses this file to You under the Apache License, Version 2.0 6807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * (the "License"); you may not use this file except in compliance with 7807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * the License. You may obtain a copy of the License at 8807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * 9807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 10807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * 11807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * Unless required by applicable law or agreed to in writing, software 12807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 13807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * See the License for the specific language governing permissions and 15807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath * limitations under the License. 16807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath */ 17d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathpackage org.apache.harmony.tests.java.util.jar; 18807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 19807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport tests.support.resource.Support_Resources; 20807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.io.File; 21807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.io.IOException; 22807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.io.InputStream; 23807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.net.URL; 24807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.util.Arrays; 25807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.util.HashSet; 26807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.util.Set; 27807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.util.jar.JarEntry; 28807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.util.jar.JarInputStream; 29807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.util.jar.Manifest; 30807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.util.zip.ZipEntry; 31807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathimport java.util.zip.ZipException; 32807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 33807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamathpublic class JarInputStreamTest extends junit.framework.TestCase { 34807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 35807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath private static final int DSA_INDEX = 2; 36807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 37807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath private static final int TEST_CLASS_INDEX = 4; 38807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 39807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath private static final int TOTAL_ENTRIES = 4; 40807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 41807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath private static final String A_CLASS = "foo/bar/A.class"; 42807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 43807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // a 'normal' jar file 44807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath private String jarName; 45807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 46807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // same as patch.jar but without a manifest file 47807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath private String jarName2; 48807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 49807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath @Override 50807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath protected void setUp() { 51807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jarName = Support_Resources.getURL("morestuff/hyts_patch.jar"); 52807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jarName2 = Support_Resources.getURL("morestuff/hyts_patch2.jar"); 53807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 54807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 55807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_ConstructorLjava_io_InputStream() throws Exception { 56807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // Test for method java.util.jar.JarInputStream(java.io.InputStream) 57807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(jarName).openConnection().getInputStream(); 58807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath boolean hasCorrectEntry = false; 59807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jis = new JarInputStream(is); 60807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertNotNull("The jar input stream should have a manifest", jis.getManifest()); 61807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 62807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarEntry je = jis.getNextJarEntry(); 63807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (je != null) { 64807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (je.getName().equals(A_CLASS)) { 65807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath hasCorrectEntry = true; 66807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 67807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath je = jis.getNextJarEntry(); 68807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 69807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertTrue("The jar input stream does not contain the correct entries", hasCorrectEntry); 70807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 71807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 72807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_closeAfterException() throws Exception { 73807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath File resources = Support_Resources.createTempFolder(); 74807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath Support_Resources.copyFile(resources, null, "Broken_entry.jar"); 75807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = Support_Resources.getStream("Broken_entry.jar"); 76807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jis = new JarInputStream(is, false); 77807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextEntry(); 78807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 79807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextEntry(); 80807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("ZipException expected"); 81807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (ZipException ee) { 82807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // expected 83807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 84807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.close(); 85807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 86807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextEntry(); 87807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("IOException expected"); 88807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (IOException ee) { 89807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // expected 90807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 91807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 92807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 93807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_getNextJarEntry_Ex() throws Exception { 94807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath final Set<String> desired = new HashSet<String>(Arrays 95807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .asList("foo/", "foo/bar/", "foo/bar/A.class", "Blah.txt")); 96807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath Set<String> actual = new HashSet<String>(); 97807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(jarName).openConnection().getInputStream(); 98807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jis = new JarInputStream(is); 99807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarEntry je = jis.getNextJarEntry(); 100807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (je != null) { 101807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath actual.add(je.toString()); 102807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath je = jis.getNextJarEntry(); 103807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 104807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(actual, desired); 105807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.close(); 106807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 107807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 108807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextJarEntry(); 109807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("IOException expected"); 110807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (IOException ee) { 111807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // expected 112807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 113807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 114807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath File resources = Support_Resources.createTempFolder(); 115807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath Support_Resources.copyFile(resources, null, "Broken_entry.jar"); 116807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath is = Support_Resources.getStream("Broken_entry.jar"); 117807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis = new JarInputStream(is, false); 118807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextJarEntry(); 119807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 120807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextJarEntry(); 121807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("ZipException expected"); 122807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (ZipException ee) { 123807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // expected 124807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 125807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 126807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 127807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_getManifest() throws Exception { 128807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // Test for method java.util.jar.Manifest 129807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // java.util.jar.JarInputStream.getManifest() 130807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath Manifest m; 131807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(jarName2).openConnection().getInputStream(); 132807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jis = new JarInputStream(is); 133807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath m = jis.getManifest(); 134807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertNull("The jar input stream should not have a manifest", m); 135807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 136807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath is = new URL(jarName).openConnection().getInputStream(); 137807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis = new JarInputStream(is); 138807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath m = jis.getManifest(); 139807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertNotNull("The jar input stream should have a manifest", m); 140807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 141807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 142807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_getNextJarEntry() throws Exception { 143807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath final Set<String> desired = new HashSet<String>(Arrays.asList(new String[] { "foo/", 144807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath "foo/bar/", A_CLASS, "Blah.txt" })); 145807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath Set<String> actual = new HashSet<String>(); 146807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(jarName).openConnection().getInputStream(); 147807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jis = new JarInputStream(is); 148807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarEntry je = jis.getNextJarEntry(); 149807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (je != null) { 150807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath actual.add(je.toString()); 151807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath je = jis.getNextJarEntry(); 152807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 153807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(actual, desired); 154807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 155807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 156807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_JarInputStream_Integrate_Jar_getNextEntry() 157807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throws IOException { 158807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String intJarName = Support_Resources.getURL("Integrate.jar"); 159807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(intJarName).openConnection() 160807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 161807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 162807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath ZipEntry entry = null; 163807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int count = 0; 164807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (count == 0 || entry != null) { 165807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath count++; 166807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath entry = jin.getNextEntry(); 167807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 168807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(TOTAL_ENTRIES + 1, count); 169807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 170807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 171807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 172807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_JarInputStream_Modified_Class_getNextEntry() 173807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throws IOException { 174807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String modJarName = Support_Resources.getURL("Modified_Class.jar"); 175807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(modJarName).openConnection() 176807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 177807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 178807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath ZipEntry zipEntry = null; 179807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 180807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int count = 0; 181807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (count == 0 || zipEntry != null) { 182807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath count++; 183807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 184807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath zipEntry = jin.getNextEntry(); 185807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count == TEST_CLASS_INDEX + 1) { 186807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("Should throw Security Exception"); 187807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 188807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (SecurityException e) { 189807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count != TEST_CLASS_INDEX + 1) { 190807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throw e; 191807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 192807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 193807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 194807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 195807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(TOTAL_ENTRIES + 2, count); 196807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 197807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 198807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 199807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_JarInputStream_Modified_Manifest_MainAttributes_getNextEntry() 200807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throws IOException { 201807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String modJarName = Support_Resources.getURL("Modified_Manifest_MainAttributes.jar"); 202807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(modJarName).openConnection() 203807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 204807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 205807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 206807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals("META-INF/TESTROOT.SF", jin.getNextEntry().getName()); 207807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals("META-INF/TESTROOT.DSA", jin.getNextEntry().getName()); 208807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 209807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.getNextEntry(); 210807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail(); 211807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (SecurityException expected) { 212807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 213807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals("META-INF/", jin.getNextEntry().getName()); 214807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals("Test.class", jin.getNextEntry().getName()); 215807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertNull(jin.getNextEntry()); 216807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 217807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 218807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 219807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_JarInputStream_Modified_Manifest_EntryAttributes_getNextEntry() 220807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throws IOException { 221807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String modJarName = Support_Resources 222807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getURL("Modified_Manifest_EntryAttributes.jar"); 223807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(modJarName).openConnection() 224807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 225807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 226807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath ZipEntry zipEntry = null; 227807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 228807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int count = 0; 229807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (count == 0 || zipEntry != null) { 230807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath count++; 231807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 232807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath zipEntry = jin.getNextEntry(); 233807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count == DSA_INDEX + 1) { 234807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("Should throw Security Exception"); 235807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 236807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (SecurityException e) { 237807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count != DSA_INDEX + 1) { 238807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throw e; 239807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 240807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 241807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 242807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(TOTAL_ENTRIES + 2, count); 243807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 244807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 245807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 246807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_JarInputStream_Modified_SF_EntryAttributes_getNextEntry() 247807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throws IOException { 248807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String modJarName = Support_Resources 249807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getURL("Modified_SF_EntryAttributes.jar"); 250807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(modJarName).openConnection() 251807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 252807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 253807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath ZipEntry zipEntry = null; 254807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 255807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int count = 0; 256807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (count == 0 || zipEntry != null) { 257807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath count++; 258807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 259807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath zipEntry = jin.getNextEntry(); 260807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count == DSA_INDEX + 1) { 261807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("Should throw Security Exception"); 262807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 263807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (SecurityException e) { 264807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count != DSA_INDEX + 1) { 265807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throw e; 266807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 267807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 268807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 269807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(TOTAL_ENTRIES + 2, count); 270807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 271807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 272807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 273807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_JarInputStream_Modified_Class_read() throws IOException { 274807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String modJarName = Support_Resources.getURL("Modified_Class.jar"); 275807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(modJarName).openConnection() 276807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 277807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 278807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int count = 0; 279807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath ZipEntry zipEntry = null; 280807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (count == 0 || zipEntry != null) { 281807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath count++; 282807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath zipEntry = jin.getNextEntry(); 283807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath byte[] buffer = new byte[1024]; 284807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 285807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int length = 0; 286807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (length >= 0) { 287807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath length = jin.read(buffer); 288807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 289807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count == TEST_CLASS_INDEX) { 290807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("Should throw Security Exception"); 291807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 292807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (SecurityException e) { 293807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count < TEST_CLASS_INDEX) { 294807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throw e; 295807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 296807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 297807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 298807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(TOTAL_ENTRIES + 1, count); 299807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 300807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 301807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 302807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_Integrate_Jar_read() throws IOException { 303807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String intJarName = Support_Resources.getURL("Integrate.jar"); 304807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(intJarName).openConnection() 305807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 306807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 307807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int count = 0; 308807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath ZipEntry zipEntry = null; 309807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (count == 0 || zipEntry != null) { 310807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath count++; 311807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath zipEntry = jin.getNextEntry(); 312807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath byte[] buffer = new byte[1024]; 313807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int length = 0; 314807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (length >= 0) { 315807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath length = jin.read(buffer); 316807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 317807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 318807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 319807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(TOTAL_ENTRIES + 1, count); 320807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 321807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 322807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 323807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_JarInputStream_Modified_Manifest_MainAttributes_read() 324807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throws IOException { 325807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String modJarName = Support_Resources 326807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getURL("Modified_Manifest_MainAttributes.jar"); 327807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(modJarName).openConnection() 328807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 329807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 330807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int count = 0; 331807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath ZipEntry zipEntry = null; 332807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (count == 0 || zipEntry != null) { 333807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath count++; 334807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath zipEntry = jin.getNextEntry(); 335807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath byte[] buffer = new byte[1024]; 336807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 337807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int length = 0; 338807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (length >= 0) { 339807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath length = jin.read(buffer); 340807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 341807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count == DSA_INDEX) { 342807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("Should throw Security Exception"); 343807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 344807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (SecurityException e) { 345807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count != DSA_INDEX) { 346807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throw e; 347807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 348807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 349807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 350807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(TOTAL_ENTRIES + 1, count); 351807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 352807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 353807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 354807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_JarInputStream_Modified_SF_EntryAttributes_read() 355807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throws IOException { 356807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath String modJarName = Support_Resources 357807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getURL("Modified_SF_EntryAttributes.jar"); 358807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = new URL(modJarName).openConnection() 359807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath .getInputStream(); 360807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jin = new JarInputStream(is, true); 361807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int count = 0; 362807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath ZipEntry zipEntry = null; 363807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (count == 0 || zipEntry != null) { 364807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath count++; 365807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath zipEntry = jin.getNextEntry(); 366807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath byte[] buffer = new byte[1024]; 367807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 368807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath int length = 0; 369807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath while (length >= 0) { 370807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath length = jin.read(buffer); 371807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 372807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count == DSA_INDEX) { 373807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("Should throw Security Exception"); 374807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 375807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (SecurityException e) { 376807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath if (count != DSA_INDEX) { 377807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath throw e; 378807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 379807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 380807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 381807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath assertEquals(TOTAL_ENTRIES + 1, count); 382807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jin.close(); 383807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 384807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 385807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath public void test_getNextEntry() throws Exception { 386807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath File resources = Support_Resources.createTempFolder(); 387807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath Support_Resources.copyFile(resources, null, "Broken_entry.jar"); 388807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath InputStream is = Support_Resources.getStream("Broken_entry.jar"); 389807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath JarInputStream jis = new JarInputStream(is, false); 390807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextEntry(); 391807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 392807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextEntry(); 393807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("ZipException expected"); 394807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (ZipException ee) { 395807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // expected 396807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 397807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath 398807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath try { 399807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.close(); // Android throws exception here, already! 400807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath jis.getNextEntry(); // But RI here, only! 401807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath fail("IOException expected"); 402807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } catch (IOException ee) { 403807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath // expected 404807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 405807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath } 40603d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak 40703d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak /** 40803d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * hyts_metainf.jar contains an additional entry in META-INF (META-INF/bad_checksum.txt), 40903d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * that has been altered since jar signing - we expect to detect a mismatching digest. 41003d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak */ 41103d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak public void test_metainf_verification() throws Exception { 41203d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak String jarFilename = "hyts_metainf.jar"; 41303d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak File resources = Support_Resources.createTempFolder(); 41403d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak Support_Resources.copyFile(resources, null, jarFilename); 41503d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak InputStream is = Support_Resources.getStream(jarFilename); 41603d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak 41703d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak try (JarInputStream jis = new JarInputStream(is, true)) { 41803d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak JarEntry je = jis.getNextJarEntry(); 41903d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak je = jis.getNextJarEntry(); 42003d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak je = jis.getNextJarEntry(); 42103d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak je = jis.getNextJarEntry(); 42203d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak 42303d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak if (!je.getName().equals("META-INF/bad_checksum.txt")) { 42403d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak fail("Expected META-INF/bad_checksum.txt as a 4th entry, got:" + je.getName()); 42503d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak } 42603d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak byte[] buffer = new byte[1024]; 42703d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak int length = 0; 42803d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak try { 42903d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak while (length >= 0) { 43003d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak length = jis.read(buffer); 43103d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak } 43203d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak fail("SecurityException expected"); 43303d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak } catch (SecurityException expected) {} 43403d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak } 43503d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak } 43603d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak 437807e0595eceab209ff043a9b99659d1ee938d539Narayan Kamath} 438