JarFileTest.java revision a3d40b4064c0f4de77122eff9253da242877c938
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 */
17d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathpackage org.apache.harmony.tests.java.util.jar;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileOutputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL;
26d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Rootimport java.security.CodeSigner;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Permission;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate;
29cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Rootimport java.util.Arrays;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Attributes;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarEntry;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarFile;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.JarOutputStream;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.jar.Manifest;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipEntry;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipException;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.zip.ZipFile;
4019745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamathimport junit.framework.TestCase;
4119745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamathimport tests.support.resource.Support_Resources;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JarFileTest extends TestCase {
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // BEGIN android-added
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte[] getAllBytesFromStream(InputStream is) throws IOException {
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteArrayOutputStream bs = new ByteArrayOutputStream();
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] buf = new byte[666];
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int iRead;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int off;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (is.available() > 0) {
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            iRead = is.read(buf, 0, buf.length);
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (iRead > 0) bs.write(buf, 0, iRead);
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return bs.toByteArray();
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // END android-added
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName = "hyts_patch.jar"; // a 'normal' jar file
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName2 = "hyts_patch2.jar";
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName3 = "hyts_manifest1.jar";
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName4 = "hyts_signed.jar";
6857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String jarName5 = "hyts_signed_inc.jar";
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root    private final String jarName6 = "hyts_signed_sha256withrsa.jar";
72bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root
73bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root    private final String jarName7 = "hyts_signed_sha256digest_sha256withrsa.jar";
74bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root
7552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root    private final String jarName8 = "hyts_signed_sha512digest_sha512withecdsa.jar";
7652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root
77bda6980df389e16edf907e5c516ee21e9e92883eKenny Root    private final String jarName9 = "hyts_signed_sha256digest_sha256withecdsa.jar";
78bda6980df389e16edf907e5c516ee21e9e92883eKenny Root
793de7083091497358d003bb889eba909f85b69fadKenny Root    private final String authAttrsJar = "hyts_signed_authAttrs.jar";
803de7083091497358d003bb889eba909f85b69fadKenny Root
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String entryName = "foo/bar/A.class";
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String entryName3 = "coucou/FileAccess.class";
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
85d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String integrateJar = "Integrate.jar";
86d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
8757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    private final String integrateJarEntry = "Test.class";
8857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
89d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String emptyEntryJar = "EmptyEntries_signed.jar";
90d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
91d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String emptyEntry1 = "subfolder/internalSubset01.js";
92d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
93d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String emptyEntry2 = "svgtest.js";
94d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
95d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    private final String emptyEntry3 = "svgunit.js";
96d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
97cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    private static final String VALID_CHAIN_JAR = "hyts_signed_validChain.jar";
98cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
99cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    private static final String INVALID_CHAIN_JAR = "hyts_signed_invalidChain.jar";
100cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
101a3d40b4064c0f4de77122eff9253da242877c938Kenny Root    private static final String AMBIGUOUS_SIGNERS_JAR = "hyts_signed_ambiguousSignerArray.jar";
102a3d40b4064c0f4de77122eff9253da242877c938Kenny Root
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private File resources;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // custom security manager
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    SecurityManager sm = new SecurityManager() {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final String forbidenPermissionName = "user.dir";
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void checkPermission(Permission perm) {
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (perm.getName().equals(forbidenPermissionName)) {
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SecurityException();
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void setUp() {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        resources = Support_Resources.createTempFolder();
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
122229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.io.File)
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_io_File() {
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File("Wrong.file"));
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName));
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
141229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.lang.String)
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_lang_String() {
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile("Wrong.file");
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String fileName = (new File(resources, jarName)).getCanonicalPath();
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(fileName);
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
161229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.lang.String, boolean)
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_lang_StringZ() {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile("Wrong.file", false);
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String fileName = (new File(resources, jarName)).getCanonicalPath();
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(fileName, true);
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
181229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.io.File, boolean)
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_io_FileZ() {
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File("Wrong.file"), true);
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName), false);
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
200229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.io.File, boolean, int)
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_ConstructorLjava_io_FileZI() {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File("Wrong.file"), true,
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ZipFile.OPEN_READ);
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IOException");
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName), false,
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ZipFile.OPEN_READ);
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName), false,
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ZipFile.OPEN_READ | ZipFile.OPEN_DELETE + 33);
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should throw IllegalArgumentException");
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Should not throw IOException");
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException e) {
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
23257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Constructs JarFile object.
23357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
234229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.io.File)
235229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#JarFile(java.lang.String)
23657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     */
23757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    public void testConstructor_file() throws IOException {
23857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        File f = new File(resources, jarName);
23957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Support_Resources.copyFile(resources, null, jarName);
24057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        assertTrue(new JarFile(f).getEntry(entryName).getName().equals(
24157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                entryName));
24257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        assertTrue(new JarFile(f.getPath()).getEntry(entryName).getName()
24357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                .equals(entryName));
24457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
24557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
24657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    /**
247229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#entries()
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_entries() throws Exception {
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Note only (and all of) the following should be contained in the file
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * META-INF/ META-INF/MANIFEST.MF foo/ foo/bar/ foo/bar/A.class Blah.txt
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, jarName));
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> e = jarFile.entries();
25757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        int i;
25857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        for (i = 0; e.hasMoreElements(); i++) {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.nextElement();
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
26157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        assertEquals(jarFile.size(), i);
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(6, i);
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_entries2() throws Exception {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, jarName));
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> enumeration = jarFile.entries();
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            enumeration.hasMoreElements();
27357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("hasMoreElements() did not detect a closed jar file");
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException e) {
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile = new JarFile(new File(resources, jarName));
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        enumeration = jarFile.entries();
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            enumeration.nextElement();
28257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("nextElement() did not detect closed jar file");
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException e) {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
289229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getJarEntry(java.lang.String)
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getEntryLjava_lang_String() throws IOException {
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
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            assertEquals("Error in returned entry", 311, jarFile.getEntry(
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    entryName).getSize());
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test: " + e.toString());
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, jarName));
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> enumeration = jarFile.entries();
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(enumeration.hasMoreElements());
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (enumeration.hasMoreElements()) {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry je = enumeration.nextElement();
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getEntry(je.getName());
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        enumeration = jarFile.entries();
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(enumeration.hasMoreElements());
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarEntry je = enumeration.nextElement();
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getEntry(je.getName());
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // fail("IllegalStateException expected.");
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException ee) { // Per documentation exception
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // may be thrown.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
326229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getJarEntry(java.lang.String)
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getJarEntryLjava_lang_String() throws IOException {
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
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            assertEquals("Error in returned entry", 311, jarFile.getJarEntry(
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    entryName).getSize());
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test: " + e.toString());
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, jarName);
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, jarName));
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> enumeration = jarFile.entries();
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(enumeration.hasMoreElements());
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (enumeration.hasMoreElements()) {
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry je = enumeration.nextElement();
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getJarEntry(je.getName());
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        enumeration = jarFile.entries();
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(enumeration.hasMoreElements());
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarEntry je = enumeration.nextElement();
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getJarEntry(je.getName());
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // fail("IllegalStateException expected.");
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException ee) { // Per documentation exception
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // may be thrown.
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
36257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    /**
363229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getJarEntry(java.lang.String)
36457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     */
36557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    public void testGetJarEntry() throws Exception {
36657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Support_Resources.copyFile(resources, null, jarName);
36757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        JarFile jarFile = new JarFile(new File(resources, jarName));
36857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        assertEquals("Error in returned entry", 311, jarFile.getEntry(
36957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                entryName).getSize());
37057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        jarFile.close();
37157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
37257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        // tests for signed jars
37357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        // test all signed jars in the /Testres/Internal/SignedJars directory
37457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        String jarDirUrl = Support_Resources
37557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                .getResourceURL("/../internalres/signedjars");
37657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Vector<String> signedJars = new Vector<String>();
37757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
37857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            InputStream is = new URL(jarDirUrl + "/jarlist.txt").openStream();
37957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            while (is.available() > 0) {
38057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                StringBuilder linebuff = new StringBuilder(80); // Typical line
38157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                // length
38257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                done: while (true) {
38357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    int nextByte = is.read();
38457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    switch (nextByte) {
38557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        case -1:
38657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            break done;
38757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        case (byte) '\r':
38857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            if (linebuff.length() == 0) {
38957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                                // ignore
39057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            }
39157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            break done;
39257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        case (byte) '\n':
39357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            if (linebuff.length() == 0) {
39457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                                // ignore
39557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            }
39657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            break done;
39757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        default:
39857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                            linebuff.append((char) nextByte);
39957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    }
40057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
40157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                if (linebuff.length() == 0) {
40257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    break;
40357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
40457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                String line = linebuff.toString();
40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                signedJars.add(line);
40657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            }
40757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            is.close();
40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (IOException e) {
40957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // no list of jars found
41057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
41157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
41257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        for (int i = 0; i < signedJars.size(); i++) {
41357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            String jarName = signedJars.get(i);
41457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            try {
41557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                File file = Support_Resources.getExternalLocalFile(jarDirUrl
41657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        + "/" + jarName);
41757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                jarFile = new JarFile(file, true);
41857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                boolean foundCerts = false;
41957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                Enumeration<JarEntry> e = jarFile.entries();
42057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                while (e.hasMoreElements()) {
42157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    JarEntry entry = e.nextElement();
42257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    InputStream is = jarFile.getInputStream(entry);
42357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    is.skip(100000);
42457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    is.close();
42557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    Certificate[] certs = entry.getCertificates();
42657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    if (certs != null && certs.length > 0) {
42757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        foundCerts = true;
42857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        break;
42957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    }
43057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
43157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                assertTrue(
43257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        "No certificates found during signed jar test for jar \""
43357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                                + jarName + "\"", foundCerts);
43457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            } catch (IOException e) {
43557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                fail("Exception during signed jar test for jar \"" + jarName
43657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        + "\": " + e.toString());
43757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            }
43857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
43957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
44057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
442229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getManifest()
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getManifest() {
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Test for method java.util.jar.Manifest
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // java.util.jar.JarFile.getManifest()
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName);
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName));
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Error--Manifest not returned", jarFile.getManifest());
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during 1st test: " + e.toString());
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName2);
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName2));
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNull("Error--should have returned null", jarFile
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .getManifest());
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during 2nd test: " + e.toString());
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // jarName3 was created using the following test
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName3);
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jarFile = new JarFile(new File(resources, jarName3));
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Should find manifest without verifying", jarFile
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .getManifest());
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.close();
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during 3rd test: " + e.toString());
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this is used to create jarName3 used in the previous test
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Manifest manifest = new Manifest();
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Attributes attributes = manifest.getMainAttributes();
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            attributes.put(new Attributes.Name("Manifest-Version"), "1.0");
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ByteArrayOutputStream manOut = new ByteArrayOutputStream();
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            manifest.write(manOut);
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] manBytes = manOut.toByteArray();
48419745ce89add193c0e13c18979a3c9fb25bee475Narayan Kamath            File file = File.createTempFile("hyts_manifest1", ".jar");
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    file.getAbsolutePath()));
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry entry = new ZipEntry("META-INF/");
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry.setSize(0);
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.putNextEntry(entry);
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry = new ZipEntry(JarFile.MANIFEST_NAME);
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry.setSize(manBytes.length);
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.putNextEntry(entry);
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.write(manBytes);
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry = new ZipEntry("myfile");
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry.setSize(1);
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.putNextEntry(entry);
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.write(65);
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarOut.close();
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(file.getAbsolutePath(), false);
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Should find manifest without verifying", jar
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .getManifest());
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jar.close();
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            file.delete();
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException 3");
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName2);
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jF = new JarFile(new File(resources, jarName2));
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jF.close();
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jF.getManifest();
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("FAILED: expected IllegalStateException");
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalStateException ise) {
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected;
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during 4th test: " + e.toString());
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, "Broken_manifest.jar");
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jf;
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jf = new JarFile(new File(resources, "Broken_manifest.jar"));
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jf.getManifest();
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException expected.");
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected.
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
531229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry)
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
533703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes    // This test doesn't pass on RI. If entry size is set up incorrectly,
534703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes    // SecurityException is thrown. But SecurityException is thrown on RI only
535703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes    // if jar file is signed incorrectly.
53652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root    public void test_getInputStreamLjava_util_jar_JarEntry_subtest0() throws Exception {
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File signedFile = null;
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName4);
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            signedFile = new File(resources, jarName4);
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Failed to create local file 2: " + e);
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(signedFile);
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry entry = new JarEntry(entryName3);
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream in = jar.getInputStream(entry);
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            in.read();
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test 3: " + e);
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(signedFile);
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry entry = new JarEntry(entryName3);
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream in = jar.getInputStream(entry);
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-added
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] dummy = getAllBytesFromStream(in);
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-added
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNull("found certificates", entry.getCertificates());
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test 4: " + e);
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
56557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(signedFile);
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry entry = new JarEntry(entryName3);
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            entry.setSize(1076);
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream in = jar.getInputStream(entry);
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-added
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] dummy = getAllBytesFromStream(in);
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-added
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("SecurityException should be thrown.");
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SecurityException e) {
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test 5: " + e);
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, jarName5);
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            signedFile = new File(resources, jarName5);
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Failed to create local file 5: " + e);
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
58757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarFile jar = new JarFile(signedFile);
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            JarEntry entry = new JarEntry(entryName3);
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream in = jar.getInputStream(entry);
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("SecurityException should be thrown.");
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SecurityException e) {
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // expected
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Exception during test 5: " + e);
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
598bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root
599bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root        // SHA1 digest, SHA256withRSA signed JAR
60052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root        checkSignedJar(jarName6);
601bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root
602bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root        // SHA-256 digest, SHA256withRSA signed JAR
60352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root        checkSignedJar(jarName7);
604bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root
60552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root        // SHA-512 digest, SHA512withECDSA signed JAR
60652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root        checkSignedJar(jarName8);
6073de7083091497358d003bb889eba909f85b69fadKenny Root
6083de7083091497358d003bb889eba909f85b69fadKenny Root        // JAR with a signature that has PKCS#7 Authenticated Attributes
6093de7083091497358d003bb889eba909f85b69fadKenny Root        checkSignedJar(authAttrsJar);
61052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root    }
61152c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root
612bda6980df389e16edf907e5c516ee21e9e92883eKenny Root    /**
613bda6980df389e16edf907e5c516ee21e9e92883eKenny Root     * This test uses a jar file signed with an algorithm that has its own OID
614bda6980df389e16edf907e5c516ee21e9e92883eKenny Root     * that is valid as a signature type. SHA256withECDSA is an algorithm that
615bda6980df389e16edf907e5c516ee21e9e92883eKenny Root     * isn't combined as DigestAlgorithm + "with" + DigestEncryptionAlgorithm
616bda6980df389e16edf907e5c516ee21e9e92883eKenny Root     * like RSAEncryption needs to be.
617bda6980df389e16edf907e5c516ee21e9e92883eKenny Root     */
618bda6980df389e16edf907e5c516ee21e9e92883eKenny Root    public void testJarFile_Signed_Valid_DigestEncryptionAlgorithm() throws Exception {
619bda6980df389e16edf907e5c516ee21e9e92883eKenny Root        checkSignedJar(jarName9);
620bda6980df389e16edf907e5c516ee21e9e92883eKenny Root    }
621bda6980df389e16edf907e5c516ee21e9e92883eKenny Root
62252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root    private void checkSignedJar(String jarName) throws Exception {
62352c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root        Support_Resources.copyFile(resources, null, jarName);
62452c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root
62552c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root        File file = new File(resources, jarName);
626bda6980df389e16edf907e5c516ee21e9e92883eKenny Root        boolean foundCerts = false;
62752c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root
62852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root        JarFile jarFile = new JarFile(file, true);
629bda6980df389e16edf907e5c516ee21e9e92883eKenny Root        try {
63052c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root
631bda6980df389e16edf907e5c516ee21e9e92883eKenny Root            Enumeration<JarEntry> e = jarFile.entries();
632bda6980df389e16edf907e5c516ee21e9e92883eKenny Root            while (e.hasMoreElements()) {
633bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                JarEntry entry = e.nextElement();
634bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                InputStream is = jarFile.getInputStream(entry);
635bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                is.skip(100000);
636bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                is.close();
637bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                Certificate[] certs = entry.getCertificates();
638bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                if (certs != null && certs.length > 0) {
639bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                    foundCerts = true;
640bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                    break;
641bda6980df389e16edf907e5c516ee21e9e92883eKenny Root                }
64252c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root            }
643bda6980df389e16edf907e5c516ee21e9e92883eKenny Root        } finally {
644bda6980df389e16edf907e5c516ee21e9e92883eKenny Root            jarFile.close();
645bff099b1b39940301bc7dd4be52dbe303c5e6fdfKenny Root        }
64652c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root
64752c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root        assertTrue(
64852c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root                "No certificates found during signed jar test for jar \""
64952c906b82c75e811284a1788e5ca0b4330a55a36Kenny Root                        + jarName + "\"", foundCerts);
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
652d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root    private static class Results {
653d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        public Certificate[] certificates;
654d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        public CodeSigner[] signers;
655d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root    }
656d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root
657d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root    private Results getSignedJarCerts(String jarName, boolean chainCheck) throws Exception {
658cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        Support_Resources.copyFile(resources, null, jarName);
659cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
660cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        File file = new File(resources, jarName);
661d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        Results results = new Results();
662cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
663cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        JarFile jarFile = new JarFile(file, true, ZipFile.OPEN_READ, chainCheck);
664cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        try {
665cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
666cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root            Enumeration<JarEntry> e = jarFile.entries();
667cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root            while (e.hasMoreElements()) {
668cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                JarEntry entry = e.nextElement();
669cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                InputStream is = jarFile.getInputStream(entry);
670cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                // Skip bytes because we have to read the entire file for it to read signatures.
671cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                is.skip(entry.getSize());
672cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                is.close();
673cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                Certificate[] certs = entry.getCertificates();
674d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root                CodeSigner[] signers = entry.getCodeSigners();
675cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                if (certs != null && certs.length > 0) {
676d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root                    results.certificates = certs;
677d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root                    results.signers = signers;
678cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                    break;
679cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root                }
680cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root            }
681cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        } finally {
682cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root            jarFile.close();
683cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root        }
684cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
685d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        return results;
686cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
687cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
688cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    public void testJarFile_Signed_ValidChain_NoCheck() throws Exception {
689d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        Results result = getSignedJarCerts(VALID_CHAIN_JAR, false);
690d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertNotNull(result);
691d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length);
692d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length);
693d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(2, result.signers[0].getSignerCertPath().getCertificates().size());
694cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
695cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
696cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    public void testJarFile_Signed_ValidChain_Check() throws Exception {
697d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        Results result = getSignedJarCerts(VALID_CHAIN_JAR, true);
698d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertNotNull(result);
699d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length);
700d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length);
701d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(2, result.signers[0].getSignerCertPath().getCertificates().size());
702cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
703cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
704cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    public void testJarFile_Signed_InvalidChain_NoCheck() throws Exception {
705d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        Results result = getSignedJarCerts(INVALID_CHAIN_JAR, false);
706d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertNotNull(result);
707d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length);
708d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length);
709d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(2, result.signers[0].getSignerCertPath().getCertificates().size());
710cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
711cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
712cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    public void testJarFile_Signed_InvalidChain_Check() throws Exception {
713d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        Results result = getSignedJarCerts(INVALID_CHAIN_JAR, true);
714d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertNotNull(result);
715d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(Arrays.deepToString(result.certificates), 1, result.certificates.length);
716d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length);
717d32a5c2f44587946ad9d4de26117e45b610b0a6dKenny Root        assertEquals(1, result.signers[0].getSignerCertPath().getCertificates().size());
718cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root    }
719cb11b9fff2a1af8bb4fcad18986003a7f59189c6Kenny Root
720a3d40b4064c0f4de77122eff9253da242877c938Kenny Root    public void testJarFile_Signed_AmbiguousSigners() throws Exception {
721a3d40b4064c0f4de77122eff9253da242877c938Kenny Root        Results result = getSignedJarCerts(AMBIGUOUS_SIGNERS_JAR, false);
722a3d40b4064c0f4de77122eff9253da242877c938Kenny Root        assertNotNull(result);
723a3d40b4064c0f4de77122eff9253da242877c938Kenny Root        assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length);
724a3d40b4064c0f4de77122eff9253da242877c938Kenny Root        assertEquals(Arrays.deepToString(result.signers), 2, result.signers.length);
725a3d40b4064c0f4de77122eff9253da242877c938Kenny Root        assertEquals(1, result.signers[0].getSignerCertPath().getCertificates().size());
726a3d40b4064c0f4de77122eff9253da242877c938Kenny Root        assertEquals(1, result.signers[1].getSignerCertPath().getCertificates().size());
727a3d40b4064c0f4de77122eff9253da242877c938Kenny Root    }
728a3d40b4064c0f4de77122eff9253da242877c938Kenny Root
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The jar created by 1.4 which does not provide a
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * algorithm-Digest-Manifest-Main-Attributes entry in .SF file.
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_Jar_created_before_java_5() throws IOException {
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Created_by_1_4.jar";
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getInputStream(zipEntry);
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /* The jar is intact, then everything is all right. */
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Integrate_Jar() throws IOException {
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Integrate.jar";
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
75457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE);
75557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
75657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
75757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
75857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    /**
75957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * The jar is intact, but the entry object is modified.
76057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     */
76157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    public void testJarVerificationModifiedEntry() throws IOException {
76257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Support_Resources.copyFile(resources, null, integrateJar);
76357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        File f = new File(resources, integrateJar);
76457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
76557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        JarFile jarFile = new JarFile(f);
76657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        ZipEntry zipEntry = jarFile.getJarEntry(integrateJarEntry);
76757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        zipEntry.setSize(zipEntry.getSize() + 1);
76857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE);
76957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
77057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        jarFile = new JarFile(f);
77157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        zipEntry = jarFile.getJarEntry(integrateJarEntry);
77257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        zipEntry.setSize(zipEntry.getSize() - 1);
77357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
77457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            //jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE);
77557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jarFile.getInputStream(zipEntry).read(new byte[5000], 0, 5000);
77657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("SecurityException expected");
77757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (SecurityException e) {
77857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // desired
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If another entry is inserted into Manifest, no security exception will be
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown out.
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_InsertEntry_in_Manifest_Jar() throws IOException {
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Inserted_Entry_Manifest.jar";
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int count = 0;
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getInputStream(zipEntry);
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            count++;
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(5, count);
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If another entry is inserted into Manifest, no security exception will be
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown out.
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_Inserted_Entry_Manifest_with_DigestCode()
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Inserted_Entry_Manifest_with_DigestCode.jar";
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int count = 0;
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getInputStream(zipEntry);
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            count++;
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(5, count);
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The content of Test.class is modified, jarFile.getInputStream will not
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * throw security Exception, but it will anytime before the inputStream got
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from getInputStream method has been read to end.
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Modified_Class() throws IOException {
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_Class.jar";
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            jarFile.getInputStream(zipEntry);
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /* The content of Test.class has been tampered. */
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ZipEntry zipEntry = jarFile.getEntry("Test.class");
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream in = jarFile.getInputStream(zipEntry);
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] buffer = new byte[1024];
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (in.available() > 0) {
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                in.read(buffer);
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
84557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("SecurityException expected");
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SecurityException e) {
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // desired
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * In the Modified.jar, the main attributes of META-INF/MANIFEST.MF is
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * tampered manually. Hence the RI 5.0 JarFile.getInputStream of any
85457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * JarEntry will throw security exception.
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Modified_Manifest_MainAttributes()
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_Manifest_MainAttributes.jar";
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                jarFile.getInputStream(zipEntry);
86757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                fail("SecurityException expected");
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SecurityException e) {
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // desired
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * It is all right in our original JarFile. If the Entry Attributes, for
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * example Test.class in our jar, the jarFile.getInputStream will throw
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Security Exception.
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Modified_Manifest_EntryAttributes()
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_Manifest_EntryAttributes.jar";
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                jarFile.getInputStream(zipEntry);
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("should throw Security Exception");
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SecurityException e) {
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // desired
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the content of the .SA file is modified, no matter what it resides,
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * JarFile.getInputStream of any JarEntry will throw Security Exception.
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_JarFile_Modified_SF_EntryAttributes() throws IOException {
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_SF_EntryAttributes.jar";
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (entries.hasMoreElements()) {
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ZipEntry zipEntry = entries.nextElement();
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                jarFile.getInputStream(zipEntry);
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("should throw Security Exception");
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SecurityException e) {
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // desired
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_close() throws IOException {
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String modifiedJarName = "Modified_SF_EntryAttributes.jar";
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Support_Resources.copyFile(resources, null, modifiedJarName);
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        JarFile jarFile = new JarFile(new File(resources, modifiedJarName),
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                true);
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Enumeration<JarEntry> entries = jarFile.entries();
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        jarFile.close();
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Can not check IOException
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
93057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
93157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    /**
93257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * @throws IOException
933229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.util.jar.JarFile#getInputStream(java.util.zip.ZipEntry)
93457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     */
93557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    public void test_getInputStreamLjava_util_jar_JarEntry() throws IOException {
93657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        File localFile = null;
93757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
93857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            Support_Resources.copyFile(resources, null, jarName);
93957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            localFile = new File(resources, jarName);
94057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (Exception e) {
94157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("Failed to create local file: " + e);
94257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
94357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
94457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        byte[] b = new byte[1024];
94557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
94657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarFile jf = new JarFile(localFile);
94757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            java.io.InputStream is = jf.getInputStream(jf.getEntry(entryName));
94857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // BEGIN android-removed
94957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // jf.close();
95057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // END android-removed
95157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            assertTrue("Returned invalid stream", is.available() > 0);
95257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            int r = is.read(b, 0, 1024);
95357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            is.close();
95457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            StringBuffer sb = new StringBuffer(r);
95557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            for (int i = 0; i < r; i++) {
95657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                sb.append((char) (b[i] & 0xff));
95757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            }
95857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            String contents = sb.toString();
95957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            assertTrue("Incorrect stream read", contents.indexOf("bar") > 0);
96057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // BEGIN android-added
96157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jf.close();
96257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // END android-added
96357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (Exception e) {
96457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("Exception during test: " + e.toString());
96557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
96657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
96757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
96857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarFile jf = new JarFile(localFile);
96957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            InputStream in = jf.getInputStream(new JarEntry("invalid"));
97057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            assertNull("Got stream for non-existent entry", in);
97157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (Exception e) {
97257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("Exception during test 2: " + e);
97357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
97457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
97557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
97657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            Support_Resources.copyFile(resources, null, jarName);
97757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            File signedFile = new File(resources, jarName);
97857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarFile jf = new JarFile(signedFile);
97957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarEntry jre = new JarEntry("foo/bar/A.class");
98057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jf.getInputStream(jre);
98157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // InputStream returned in any way, exception can be thrown in case
98257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // of reading from this stream only.
98357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // fail("Should throw ZipException");
98457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (ZipException ee) {
98557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // expected
98657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
98757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
98857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        try {
98957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            Support_Resources.copyFile(resources, null, jarName);
99057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            File signedFile = new File(resources, jarName);
99157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarFile jf = new JarFile(signedFile);
99257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            JarEntry jre = new JarEntry("foo/bar/A.class");
99357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jf.close();
99457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            jf.getInputStream(jre);
99557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // InputStream returned in any way, exception can be thrown in case
99657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // of reading from this stream only.
99757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // The same for IOException
99857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            fail("Should throw IllegalStateException");
99957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        } catch (IllegalStateException ee) {
100057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // expected
100157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
100257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
1003d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
1004d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    /**
1005d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob     * The jar is intact, but the entry object is modified.
1006d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob     */
1007703ef27278351bd0fd1d50cbd565826f217571daElliott Hughes    // Regression test for issue introduced by HARMONY-4569: signed archives containing files with size 0 could not get verified.
1008d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    public void testJarVerificationEmptyEntry() throws IOException {
1009d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        Support_Resources.copyFile(resources, null, emptyEntryJar);
1010d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        File f = new File(resources, emptyEntryJar);
1011d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
1012d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        JarFile jarFile = new JarFile(f);
1013d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
1014d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        ZipEntry zipEntry = jarFile.getJarEntry(emptyEntry1);
1015d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        int res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100);
1016d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        assertEquals("Wrong length of empty jar entry", -1, res);
1017d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
1018d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        zipEntry = jarFile.getJarEntry(emptyEntry2);
1019d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100);
1020d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        assertEquals("Wrong length of empty jar entry", -1, res);
1021d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob
1022d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        zipEntry = jarFile.getJarEntry(emptyEntry3);
1023d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        res = jarFile.getInputStream(zipEntry).read();
1024d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob        assertEquals("Wrong length of empty jar entry", -1, res);
1025d477459f4b89725dc32043aac8ad6f1dfc93de50Urs Grob    }
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1027