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