JarFileTest.java revision 92408ff79b23d6559286e492c7c6cb3fdb6e399f
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;
3392408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Rootimport java.security.cert.X509Certificate;
34cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Rootimport java.util.Arrays;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Attributes;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarEntry;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarFile;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarOutputStream;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Manifest;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipEntry;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipException;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipFile;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JarFileTest extends TestCase {
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // BEGIN android-added
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte[] getAllBytesFromStream(InputStream is) throws IOException {
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteArrayOutputStream bs = new ByteArrayOutputStream();
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] buf = new byte[666];
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int iRead;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int off;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (is.available() > 0) {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            iRead = is.read(buf, 0, buf.length);
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (iRead > 0) bs.write(buf, 0, iRead);
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return bs.toByteArray();
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // END android-added
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName = "hyts_patch.jar"; // a 'normal' jar file
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName2 = "hyts_patch2.jar";
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName3 = "hyts_manifest1.jar";
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName4 = "hyts_signed.jar";
7157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName5 = "hyts_signed_inc.jar";
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String entryName = "foo/bar/A.class";
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String entryName3 = "coucou/FileAccess.class";
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String integrateJar = "Integrate.jar";
79d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
8057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    private final String integrateJarEntry = "Test.class";
8157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
82d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String emptyEntryJar = "EmptyEntries_signed.jar";
83d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
84d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String emptyEntry1 = "subfolder/internalSubset01.js";
85d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
86d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String emptyEntry2 = "svgtest.js";
87d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
88d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String emptyEntry3 = "svgunit.js";
89d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
90cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    private static final String VALID_CHAIN_JAR = "hyts_signed_validChain.jar";
91cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
92cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    private static final String INVALID_CHAIN_JAR = "hyts_signed_invalidChain.jar";
93cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private File resources;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // custom security manager
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    SecurityManager sm = new SecurityManager() {
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final String forbidenPermissionName = "user.dir";
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void checkPermission(Permission perm) {
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (perm.getName().equals(forbidenPermissionName)) {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SecurityException();
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void setUp() {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        resources = Support_Resources.createTempFolder();
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.io.File)
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_io_File() {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File("Wrong.file"));
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName));
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
132229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.lang.String)
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_lang_String() {
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile("Wrong.file");
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String fileName = (new File(resources, jarName)).getCanonicalPath();
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(fileName);
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
152229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.lang.String, boolean)
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_lang_StringZ() {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile("Wrong.file", false);
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String fileName = (new File(resources, jarName)).getCanonicalPath();
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(fileName, true);
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
172229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.io.File, boolean)
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_io_FileZ() {
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File("Wrong.file"), true);
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName), false);
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
191229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.io.File, boolean, int)
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_io_FileZI() {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File("Wrong.file"), true,
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ZipFile.OPEN_READ);
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName), false,
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ZipFile.OPEN_READ);
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName), false,
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ZipFile.OPEN_READ | ZipFile.OPEN_DELETE + 33);
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IllegalArgumentException");
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException e) {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
22357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Constructs JarFile object.
22457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
225229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.io.File)
226229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.lang.String)
22757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     */
22857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    public void testConstructor_file() throws IOException {
22957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        File f = new File(resources, jarName);
23057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Support_Resources.copyFile(resources, null, jarName);
23157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        assertTrue(new JarFile(f).getEntry(entryName).getName().equals(
23257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                entryName));
23357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        assertTrue(new JarFile(f.getPath()).getEntry(entryName).getName()
23457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                .equals(entryName));
23557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
23657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
23757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    /**
238229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#entries()
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_entries() throws Exception {
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Note only (and all of) the following should be contained in the file
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * META-INF/ META-INF/MANIFEST.MF foo/ foo/bar/ foo/bar/A.class Blah.txt
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, jarName));
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> e = jarFile.entries();
24857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        int i;
24957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        for (i = 0; e.hasMoreElements(); i++) {
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.nextElement();
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
25257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        assertEquals(jarFile.size(), i);
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(6, i);
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_entries2() throws Exception {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, jarName));
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> enumeration = jarFile.entries();
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            enumeration.hasMoreElements();
26457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("hasMoreElements() did not detect a closed jar file");
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException e) {
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile = new JarFile(new File(resources, jarName));
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        enumeration = jarFile.entries();
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            enumeration.nextElement();
27357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("nextElement() did not detect closed jar file");
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException e) {
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
280229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getJarEntry(java.lang.String)
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getEntryLjava_lang_String() throws IOException {
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName));
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Error in returned entry", 311, jarFile.getEntry(
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    entryName).getSize());
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test: " + e.toString());
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, jarName));
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> enumeration = jarFile.entries();
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(enumeration.hasMoreElements());
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (enumeration.hasMoreElements()) {
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry je = enumeration.nextElement();
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getEntry(je.getName());
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        enumeration = jarFile.entries();
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(enumeration.hasMoreElements());
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarEntry je = enumeration.nextElement();
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getEntry(je.getName());
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // fail("IllegalStateException expected.");
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException ee) { // Per documentation exception
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // may be thrown.
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
317229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getJarEntry(java.lang.String)
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getJarEntryLjava_lang_String() throws IOException {
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName));
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Error in returned entry", 311, jarFile.getJarEntry(
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    entryName).getSize());
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test: " + e.toString());
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, jarName));
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> enumeration = jarFile.entries();
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(enumeration.hasMoreElements());
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (enumeration.hasMoreElements()) {
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry je = enumeration.nextElement();
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getJarEntry(je.getName());
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        enumeration = jarFile.entries();
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(enumeration.hasMoreElements());
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarEntry je = enumeration.nextElement();
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getJarEntry(je.getName());
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // fail("IllegalStateException expected.");
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException ee) { // Per documentation exception
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // may be thrown.
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
35357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    /**
354229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getJarEntry(java.lang.String)
35557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     */
35657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    public void testGetJarEntry() throws Exception {
35757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Support_Resources.copyFile(resources, null, jarName);
35857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        JarFile jarFile = new JarFile(new File(resources, jarName));
35957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        assertEquals("Error in returned entry", 311, jarFile.getEntry(
36057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                entryName).getSize());
36157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        jarFile.close();
36257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
36357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        // tests for signed jars
36457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        // test all signed jars in the /Testres/Internal/SignedJars directory
36557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        String jarDirUrl = Support_Resources
36657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                .getResourceURL("/../internalres/signedjars");
36757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Vector<String> signedJars = new Vector<String>();
36857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
36957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            InputStream is = new URL(jarDirUrl + "/jarlist.txt").openStream();
37057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            while (is.available() > 0) {
37157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                StringBuilder linebuff = new StringBuilder(80); // Typical line
37257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                // length
37357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                done: while (true) {
37457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    int nextByte = is.read();
37557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    switch (nextByte) {
37657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        case -1:
37757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            break done;
37857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        case (byte) '\r':
37957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            if (linebuff.length() == 0) {
38057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                                // ignore
38157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            }
38257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            break done;
38357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        case (byte) '\n':
38457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            if (linebuff.length() == 0) {
38557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                                // ignore
38657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            }
38757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            break done;
38857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        default:
38957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            linebuff.append((char) nextByte);
39057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    }
39157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
39257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                if (linebuff.length() == 0) {
39357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    break;
39457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
39557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                String line = linebuff.toString();
39657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                signedJars.add(line);
39757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            }
39857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            is.close();
39957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (IOException e) {
40057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // no list of jars found
40157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
40257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
40357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        for (int i = 0; i < signedJars.size(); i++) {
40457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            String jarName = signedJars.get(i);
40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            try {
40657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                File file = Support_Resources.getExternalLocalFile(jarDirUrl
40757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        + "/" + jarName);
40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                jarFile = new JarFile(file, true);
40957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                boolean foundCerts = false;
41057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                Enumeration<JarEntry> e = jarFile.entries();
41157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                while (e.hasMoreElements()) {
41257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    JarEntry entry = e.nextElement();
41357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    InputStream is = jarFile.getInputStream(entry);
41457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    is.skip(100000);
41557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    is.close();
41657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    Certificate[] certs = entry.getCertificates();
41757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    if (certs != null && certs.length > 0) {
41857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        foundCerts = true;
41957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        break;
42057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    }
42157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
42257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                assertTrue(
42357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        "No certificates found during signed jar test for jar \""
42457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                                + jarName + "\"", foundCerts);
42557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            } catch (IOException e) {
42657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                fail("Exception during signed jar test for jar \"" + jarName
42757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        + "\": " + e.toString());
42857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            }
42957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
43057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
43157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
433229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getManifest()
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getManifest() {
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Test for method java.util.jar.Manifest
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // java.util.jar.JarFile.getManifest()
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName));
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Error--Manifest not returned", jarFile.getManifest());
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during 1st test: " + e.toString());
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName2);
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName2));
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNull("Error--should have returned null", jarFile
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .getManifest());
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during 2nd test: " + e.toString());
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // jarName3 was created using the following test
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName3);
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName3));
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Should find manifest without verifying", jarFile
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .getManifest());
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during 3rd test: " + e.toString());
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this is used to create jarName3 used in the previous test
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Manifest manifest = new Manifest();
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Attributes attributes = manifest.getMainAttributes();
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            attributes.put(new Attributes.Name("Manifest-Version"), "1.0");
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ByteArrayOutputStream manOut = new ByteArrayOutputStream();
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            manifest.write(manOut);
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] manBytes = manOut.toByteArray();
475206059bac7dbb60f56c3a81eef12e13b1eaac218Jorg Pleumann            File file = File.createTempFile(
476206059bac7dbb60f56c3a81eef12e13b1eaac218Jorg Pleumann                    Support_PlatformFile.getNewPlatformFile("hyts_manifest1",
477206059bac7dbb60f56c3a81eef12e13b1eaac218Jorg Pleumann                            ""), ".jar");
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    file.getAbsolutePath()));
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry entry = new ZipEntry("META-INF/");
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry.setSize(0);
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.putNextEntry(entry);
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry = new ZipEntry(JarFile.MANIFEST_NAME);
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry.setSize(manBytes.length);
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.putNextEntry(entry);
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.write(manBytes);
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry = new ZipEntry("myfile");
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry.setSize(1);
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.putNextEntry(entry);
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.write(65);
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.close();
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(file.getAbsolutePath(), false);
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Should find manifest without verifying", jar
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .getManifest());
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jar.close();
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            file.delete();
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException 3");
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName2);
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jF = new JarFile(new File(resources, jarName2));
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jF.close();
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jF.getManifest();
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("FAILED: expected IllegalStateException");
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException ise) {
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected;
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during 4th test: " + e.toString());
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, "Broken_manifest.jar");
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jf;
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jf = new JarFile(new File(resources, "Broken_manifest.jar"));
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jf.getManifest();
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException expected.");
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected.
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
524229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry)
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
526703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes    // This test doesn't pass on RI. If entry size is set up incorrectly,
527703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes    // SecurityException is thrown. But SecurityException is thrown on RI only
528703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes    // if jar file is signed incorrectly.
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getInputStreamLjava_util_jar_JarEntry_subtest0() {
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File signedFile = null;
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName4);
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            signedFile = new File(resources, jarName4);
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Failed to create local file 2: " + e);
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(signedFile);
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry entry = new JarEntry(entryName3);
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream in = jar.getInputStream(entry);
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            in.read();
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test 3: " + e);
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(signedFile);
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry entry = new JarEntry(entryName3);
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream in = jar.getInputStream(entry);
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-added
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] dummy = getAllBytesFromStream(in);
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-added
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNull("found certificates", entry.getCertificates());
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test 4: " + e);
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
55857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(signedFile);
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry entry = new JarEntry(entryName3);
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry.setSize(1076);
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream in = jar.getInputStream(entry);
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-added
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] dummy = getAllBytesFromStream(in);
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-added
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("SecurityException should be thrown.");
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SecurityException e) {
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test 5: " + e);
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName5);
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            signedFile = new File(resources, jarName5);
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Failed to create local file 5: " + e);
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
58057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(signedFile);
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry entry = new JarEntry(entryName3);
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream in = jar.getInputStream(entry);
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("SecurityException should be thrown.");
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SecurityException e) {
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test 5: " + e);
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
593cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    private Certificate[] getSignedJarCerts(String jarName, boolean chainCheck) throws Exception {
594cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        Support_Resources.copyFile(resources, null, jarName);
595cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
596cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        File file = new File(resources, jarName);
597cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        Certificate[] foundCerts = null;
598cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
599cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        JarFile jarFile = new JarFile(file, true, ZipFile.OPEN_READ, chainCheck);
600cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        try {
601cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
602cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root            Enumeration<JarEntry> e = jarFile.entries();
603cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root            while (e.hasMoreElements()) {
604cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                JarEntry entry = e.nextElement();
605cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                InputStream is = jarFile.getInputStream(entry);
606cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                // Skip bytes because we have to read the entire file for it to read signatures.
607cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                is.skip(entry.getSize());
608cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                is.close();
609cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                Certificate[] certs = entry.getCertificates();
610cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                if (certs != null && certs.length > 0) {
611cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                    foundCerts = certs;
612cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                    break;
613cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                }
614cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root            }
615cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        } finally {
616cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root            jarFile.close();
617cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        }
618cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
619cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        return foundCerts;
620cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
621cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
622cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    public void testJarFile_Signed_ValidChain_NoCheck() throws Exception {
623cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        Certificate[] certs = getSignedJarCerts(VALID_CHAIN_JAR, false);
624cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        assertNotNull(certs);
62592408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals(Arrays.deepToString(certs), 3, certs.length);
62692408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=fake-chain", ((X509Certificate) certs[0]).getSubjectDN().toString());
62792408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=intermediate1", ((X509Certificate) certs[1]).getSubjectDN().toString());
62892408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=root1", ((X509Certificate) certs[2]).getSubjectDN().toString());
629cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
630cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
631cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    public void testJarFile_Signed_ValidChain_Check() throws Exception {
632cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        Certificate[] certs = getSignedJarCerts(VALID_CHAIN_JAR, true);
633cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        assertNotNull(certs);
63492408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals(Arrays.deepToString(certs), 3, certs.length);
63592408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=fake-chain", ((X509Certificate) certs[0]).getSubjectDN().toString());
63692408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=intermediate1", ((X509Certificate) certs[1]).getSubjectDN().toString());
63792408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=root1", ((X509Certificate) certs[2]).getSubjectDN().toString());
638cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
639cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
640cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    public void testJarFile_Signed_InvalidChain_NoCheck() throws Exception {
641cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        Certificate[] certs = getSignedJarCerts(INVALID_CHAIN_JAR, false);
642cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        assertNotNull(certs);
64392408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals(Arrays.deepToString(certs), 3, certs.length);
64492408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=fake-chain", ((X509Certificate) certs[0]).getSubjectDN().toString());
64592408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=intermediate1", ((X509Certificate) certs[1]).getSubjectDN().toString());
64692408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=root1", ((X509Certificate) certs[2]).getSubjectDN().toString());
647cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
648cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
649cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    public void testJarFile_Signed_InvalidChain_Check() throws Exception {
650cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        Certificate[] certs = getSignedJarCerts(INVALID_CHAIN_JAR, true);
651cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        assertNotNull(certs);
65292408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals(Arrays.deepToString(certs), 2, certs.length);
65392408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=fake-chain", ((X509Certificate) certs[0]).getSubjectDN().toString());
65492408ff79b23d6559286e492c7c6cb3fdb6e399fKenny Root        assertEquals("CN=intermediate1", ((X509Certificate) certs[1]).getSubjectDN().toString());
655cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
656cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The jar created by 1.4 which does not provide a
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * algorithm-Digest-Manifest-Main-Attributes entry in .SF file.
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_Jar_created_before_java_5() throws IOException {
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Created_by_1_4.jar";
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getInputStream(zipEntry);
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /* The jar is intact, then everything is all right. */
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Integrate_Jar() throws IOException {
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Integrate.jar";
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
68257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE);
68357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
68457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
68557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
68657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    /**
68757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * The jar is intact, but the entry object is modified.
68857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     */
68957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    public void testJarVerificationModifiedEntry() throws IOException {
69057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Support_Resources.copyFile(resources, null, integrateJar);
69157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        File f = new File(resources, integrateJar);
69257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
69357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        JarFile jarFile = new JarFile(f);
69457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        ZipEntry zipEntry = jarFile.getJarEntry(integrateJarEntry);
69557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        zipEntry.setSize(zipEntry.getSize() + 1);
69657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE);
69757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
69857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        jarFile = new JarFile(f);
69957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        zipEntry = jarFile.getJarEntry(integrateJarEntry);
70057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        zipEntry.setSize(zipEntry.getSize() - 1);
70157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
70257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            //jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE);
70357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jarFile.getInputStream(zipEntry).read(new byte[5000], 0, 5000);
70457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("SecurityException expected");
70557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (SecurityException e) {
70657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // desired
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If another entry is inserted into Manifest, no security exception will be
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown out.
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_InsertEntry_in_Manifest_Jar() throws IOException {
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Inserted_Entry_Manifest.jar";
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int count = 0;
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getInputStream(zipEntry);
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            count++;
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(5, count);
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If another entry is inserted into Manifest, no security exception will be
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown out.
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_Inserted_Entry_Manifest_with_DigestCode()
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Inserted_Entry_Manifest_with_DigestCode.jar";
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int count = 0;
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getInputStream(zipEntry);
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            count++;
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(5, count);
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The content of Test.class is modified, jarFile.getInputStream will not
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * throw security Exception, but it will anytime before the inputStream got
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from getInputStream method has been read to end.
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Modified_Class() throws IOException {
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_Class.jar";
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getInputStream(zipEntry);
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /* The content of Test.class has been tampered. */
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ZipEntry zipEntry = jarFile.getEntry("Test.class");
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream in = jarFile.getInputStream(zipEntry);
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] buffer = new byte[1024];
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (in.available() > 0) {
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                in.read(buffer);
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
77357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("SecurityException expected");
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SecurityException e) {
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // desired
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * In the Modified.jar, the main attributes of META-INF/MANIFEST.MF is
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * tampered manually. Hence the RI 5.0 JarFile.getInputStream of any
78257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * JarEntry will throw security exception.
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Modified_Manifest_MainAttributes()
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_Manifest_MainAttributes.jar";
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                jarFile.getInputStream(zipEntry);
79557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                fail("SecurityException expected");
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SecurityException e) {
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // desired
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * It is all right in our original JarFile. If the Entry Attributes, for
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * example Test.class in our jar, the jarFile.getInputStream will throw
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Security Exception.
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Modified_Manifest_EntryAttributes()
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_Manifest_EntryAttributes.jar";
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                jarFile.getInputStream(zipEntry);
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("should throw Security Exception");
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SecurityException e) {
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // desired
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the content of the .SA file is modified, no matter what it resides,
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * JarFile.getInputStream of any JarEntry will throw Security Exception.
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Modified_SF_EntryAttributes() throws IOException {
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_SF_EntryAttributes.jar";
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                jarFile.getInputStream(zipEntry);
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("should throw Security Exception");
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SecurityException e) {
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // desired
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_close() throws IOException {
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_SF_EntryAttributes.jar";
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Can not check IOException
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
85857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
85957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    /**
86057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * @throws IOException
861229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry)
86257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     */
86357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    public void test_getInputStreamLjava_util_jar_JarEntry() throws IOException {
86457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        File localFile = null;
86557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
86657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            Support_Resources.copyFile(resources, null, jarName);
86757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            localFile = new File(resources, jarName);
86857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (Exception e) {
86957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("Failed to create local file: " + e);
87057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
87157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
87257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        byte[] b = new byte[1024];
87357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
87457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarFile jf = new JarFile(localFile);
87557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            java.io.InputStream is = jf.getInputStream(jf.getEntry(entryName));
87657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // BEGIN android-removed
87757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // jf.close();
87857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // END android-removed
87957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            assertTrue("Returned invalid stream", is.available() > 0);
88057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            int r = is.read(b, 0, 1024);
88157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            is.close();
88257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            StringBuffer sb = new StringBuffer(r);
88357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            for (int i = 0; i < r; i++) {
88457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                sb.append((char) (b[i] & 0xff));
88557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            }
88657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            String contents = sb.toString();
88757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            assertTrue("Incorrect stream read", contents.indexOf("bar") > 0);
88857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // BEGIN android-added
88957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jf.close();
89057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // END android-added
89157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (Exception e) {
89257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("Exception during test: " + e.toString());
89357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
89457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
89557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
89657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarFile jf = new JarFile(localFile);
89757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            InputStream in = jf.getInputStream(new JarEntry("invalid"));
89857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            assertNull("Got stream for non-existent entry", in);
89957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (Exception e) {
90057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("Exception during test 2: " + e);
90157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
90257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
90357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
90457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            Support_Resources.copyFile(resources, null, jarName);
90557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            File signedFile = new File(resources, jarName);
90657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarFile jf = new JarFile(signedFile);
90757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarEntry jre = new JarEntry("foo/bar/A.class");
90857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jf.getInputStream(jre);
90957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // InputStream returned in any way, exception can be thrown in case
91057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // of reading from this stream only.
91157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // fail("Should throw ZipException");
91257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (ZipException ee) {
91357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // expected
91457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
91557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
91657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
91757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            Support_Resources.copyFile(resources, null, jarName);
91857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            File signedFile = new File(resources, jarName);
91957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarFile jf = new JarFile(signedFile);
92057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarEntry jre = new JarEntry("foo/bar/A.class");
92157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jf.close();
92257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jf.getInputStream(jre);
92357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // InputStream returned in any way, exception can be thrown in case
92457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // of reading from this stream only.
92557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // The same for IOException
92657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("Should throw IllegalStateException");
92757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (IllegalStateException ee) {
92857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // expected
92957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
93057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
931d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
932d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    /**
933d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob     * The jar is intact, but the entry object is modified.
934d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob     */
935703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes    // Regression test for issue introduced by HARMONY-4569: signed archives containing files with size 0 could not get verified.
936d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    public void testJarVerificationEmptyEntry() throws IOException {
937d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        Support_Resources.copyFile(resources, null, emptyEntryJar);
938d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        File f = new File(resources, emptyEntryJar);
939d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
940d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        JarFile jarFile = new JarFile(f);
941d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
942d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        ZipEntry zipEntry = jarFile.getJarEntry(emptyEntry1);
943d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        int res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100);
944d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        assertEquals("Wrong length of empty jar entry", -1, res);
945d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
946d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        zipEntry = jarFile.getJarEntry(emptyEntry2);
947d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100);
948d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        assertEquals("Wrong length of empty jar entry", -1, res);
949d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
950d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        zipEntry = jarFile.getJarEntry(emptyEntry3);
951d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        res = jarFile.getInputStream(zipEntry).read();
952d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        assertEquals("Wrong length of empty jar entry", -1, res);
953d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    }
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
955