1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.luni.tests.java.net;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.File;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.FileOutputStream;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.MalformedURLException;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.URL;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.URLClassLoader;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.URLStreamHandler;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.URLStreamHandlerFactory;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Enumeration;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.NoSuchElementException;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.StringTokenizer;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Vector;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.jar.Attributes;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.jar.JarFile;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.jar.JarOutputStream;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.jar.Manifest;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.support.Support_Configuration;
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.support.Support_Jetty;
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.support.resource.Support_Resources;
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class URLClassLoaderTest extends TestCase {
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final String PREFIX = "http://localhost:";
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final String ROOT = "resources/net.resources/HTTP/html/testres231";
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String serverURL = null;
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    URLClassLoader ucl;
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static {
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int port = 0;
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            port = Support_Jetty.startHttpServerWithDocRoot(ROOT);
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Exception during setup jetty : " + e.getMessage());
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serverURL = PREFIX + port + "/";
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    class BogusClassLoader extends ClassLoader {
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public URL getResource(String res) {
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return new URL("http://test/BogusClassLoader");
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (MalformedURLException e) {
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return null;
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public class URLClassLoaderExt extends URLClassLoader {
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public URLClassLoaderExt(URL[] urls) {
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(urls);
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Class<?> findClass(String cl) throws ClassNotFoundException {
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return super.findClass(cl);
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#URLClassLoader(java.net.URL[])
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_Constructor$Ljava_net_URL() throws Exception {
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] u = new URL[0];
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = new URLClassLoader(u);
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(ucl);
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("Failed to set parent", URLClassLoader
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getSystemClassLoader(), ucl.getParent());
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader loader = new URLClassLoader(new URL[] { null });
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class.forName("test", false, loader);
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerException");
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#URLClassLoader(java.net.URL[],
1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *java.lang.ClassLoader)
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_Constructor$Ljava_net_URLLjava_lang_ClassLoader() {
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ClassLoader cl = new BogusClassLoader();
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] u = new URL[0];
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = new URLClassLoader(u, cl);
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL res = ucl.getResource("J");
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(res);
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Failed to set parent", "/BogusClassLoader", res.getFile());
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#findResources(java.lang.String)
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_findResourcesLjava_lang_String() throws IOException {
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] resValues = { "This is a test resource file.",
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "This is a resource from a subdir" };
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] urls = new URL[2];
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL(serverURL);
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[1] = new URL(serverURL + "/subdir1/");
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = new URLClassLoader(urls);
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Enumeration res = ucl.findResources("RESOURCE.TXT");
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Failed to locate resources", res);
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int i = 0;
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (res.hasMoreElements()) {
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            StringBuffer sb = new StringBuffer();
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            InputStream is = ((URL) res.nextElement()).openStream();
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int c;
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while ((c = is.read()) != -1) {
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                sb.append((char) c);
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("Returned incorrect resource/or in wrong order",
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    resValues[i++], sb.toString());
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Incorrect number of resources returned: " + i, 2, i);
1418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression for HARMONY-6510
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        res = ucl.findResources(null);
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(res);
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(res.hasMoreElements());
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#getURLs()
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getURLs() throws MalformedURLException {
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] urls = new URL[4];
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL("http://" + Support_Configuration.HomeAddress);
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[1] = new URL("http://" + Support_Configuration.TestResources + "/");
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[2] = new URL("ftp://" + Support_Configuration.TestResources + "/");
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[3] = new URL("jar:file:c://" + Support_Configuration.TestResources
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + "!/");
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = new URLClassLoader(urls);
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] ucUrls = ucl.getURLs();
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < urls.length; i++) {
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("Returned incorrect URL[]", urls[i], ucUrls[i]);
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#newInstance(java.net.URL[])
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_newInstance$Ljava_net_URL() throws MalformedURLException,
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ClassNotFoundException {
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Verify that loaded class' have correct permissions
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] urls = new URL[1];
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL(serverURL + "/UCL/UCL.jar");
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = URLClassLoader.newInstance(urls);
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Class cl = ucl.loadClass("ucl.ResClass");
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL res = cl.getClassLoader().getResource("XX.class");
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Failed to load class", cl);
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Loaded class unable to access resource from same codeSource",
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                res);
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        cl = null;
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL("jar:" + serverURL + "/UCL/UCL.jar!/");
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = URLClassLoader.newInstance(urls);
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        cl = ucl.loadClass("ucl.ResClass");
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Failed to load class from explicit jar URL", cl);
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#newInstance(java.net.URL[],
1908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *java.lang.ClassLoader)
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_newInstance$Ljava_net_URLLjava_lang_ClassLoader() {
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ClassLoader cl = new BogusClassLoader();
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] u = new URL[0];
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = URLClassLoader.newInstance(u, cl);
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL res = ucl.getResource("J");
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(res);
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Failed to set parent", "/BogusClassLoader", res.getFile());
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#URLClassLoader(java.net.URL[],
2038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *java.lang.ClassLoader, java.net.URLStreamHandlerFactory)
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_Constructor$Ljava_net_URLLjava_lang_ClassLoaderLjava_net_URLStreamHandlerFactory() {
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class TestFactory implements URLStreamHandlerFactory {
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public URLStreamHandler createURLStreamHandler(String protocol) {
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return null;
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ClassLoader cl = new BogusClassLoader();
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] u = new URL[0];
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = new URLClassLoader(u, cl, new TestFactory());
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL res = ucl.getResource("J");
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(res);
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Failed to set parent", "/BogusClassLoader", res.getFile());
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws ClassNotFoundException
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws IOException
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#findClass(java.lang.String)
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_findClassLjava_lang_String()
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws ClassNotFoundException, IOException {
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File resources = Support_Resources.createTempFolder();
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String resPath = resources.toString();
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (resPath.charAt(0) == '/' || resPath.charAt(0) == '\\') {
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            resPath = resPath.substring(1);
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_11.jar");
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_12.jar");
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_13.jar");
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_14.jar");
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] urls = new URL[1];
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL("file:/" + resPath + "/JarIndex/hyts_11.jar");
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader ucl = URLClassLoader.newInstance(urls, null);
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL resURL = ucl.findResource("Test.txt");
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL reference = new URL("jar:file:/" + resPath.replace('\\', '/')
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + "/JarIndex/hyts_14.jar!/Test.txt");
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Resource not found: " + resURL + " ref: " + reference,
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                reference, resURL);
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(Class.forName("cpack.CNothing", true, ucl));
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_21.jar");
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_22.jar");
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_23.jar");
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL("file:/" + resPath + "/JarIndex/hyts_21.jar");
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = URLClassLoader.newInstance(urls, null);
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Enumeration en = ucl.findResources("bpack/");
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        boolean resourcesFound;
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            resourcesFound = true;
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            URL url1 = (URL) en.nextElement();
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            URL url2 = (URL) en.nextElement();
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            resourcesFound = resourcesFound
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    && url1.equals(new URL("jar:file:/"
2628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    + resPath.replace('\\', '/')
2638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    + "/JarIndex/hyts_22.jar!/bpack/"));
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            resourcesFound = resourcesFound
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    && url2.equals(new URL("jar:file:/"
2668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    + resPath.replace('\\', '/')
2678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    + "/JarIndex/hyts_23.jar!/bpack/"));
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (en.hasMoreElements()) {
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                resourcesFound = false;
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NoSuchElementException e) {
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            resourcesFound = false;
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Resources not found (1)", resourcesFound);
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(Class.forName("bpack.Homer", true, ucl));
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class.forName("bpack.Bart", true, ucl);
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw ClassNotFoundException");
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassNotFoundException e) {
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class.forName("Main4", true, ucl);
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw ClassNotFoundException");
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassNotFoundException e) {
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_22-new.jar");
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL("file:/" + resPath + "/JarIndex/hyts_22-new.jar");
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = URLClassLoader.newInstance(urls, null);
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Cannot find resource", ucl.findResource("cpack/"));
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_11.jar");
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL("file:/" + resPath + "/JarIndex/hyts_31.jar");
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = URLClassLoader.newInstance(urls, null);
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class.forName("cpack.Mock", true, ucl);
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw ClassNotFoundException");
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassNotFoundException e) {
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // testing circular reference
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_41.jar");
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_42.jar");
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL("file:/" + resPath + "/JarIndex/hyts_41.jar");
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = URLClassLoader.newInstance(urls, null);
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        en = ucl.findResources("bpack/");
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        resourcesFound = resourcesFound
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                && ((URL) en.nextElement()).equals(new URL("jar:file:/"
3158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + resPath.replace('\\', '/')
3168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + "/JarIndex/hyts_42.jar!/bpack/"));
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Resources not found (2)", resourcesFound);
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("No more resources expected", en.hasMoreElements());
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for HARMONY-2357.
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            URLClassLoaderExt cl = new URLClassLoaderExt(new URL[557]);
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cl.findClass("0");
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw NullPointerException");
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException npe) {
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for HARMONY-2871.
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader cl = new URLClassLoader(new URL[] { new URL(
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "file:/foo.jar") });
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class.forName("foo.Foo", false, cl);
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception ex) {
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Ignored
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class.forName("foo.Foo", false, cl);
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw ClassNotFoundException");
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassNotFoundException cnfe) {
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#findResource(java.lang.String)
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_findResourceLjava_lang_String()
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws MalformedURLException {
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] urls = new URL[2];
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL(serverURL);
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[1] = new URL(serverURL);
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = new URLClassLoader(urls);
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL res = ucl.findResource("RESOURCE.TXT");
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Failed to locate resource", res);
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        StringBuffer sb = new StringBuffer();
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            java.io.InputStream is = res.openStream();
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int c;
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while ((c = is.read()) != -1) {
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                sb.append((char) c);
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            is.close();
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Returned incorrect resource", !sb.toString().equals(
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "This is a test resource file"));
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testFindResource_H3461() throws Exception {
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File userDir = new File(System.getProperty("user.dir"));
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File dir = new File(userDir, "encode#me");
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File f, f2;
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader loader;
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL dirUrl;
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (!dir.exists()) {
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            dir.mkdir();
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dir.deleteOnExit();
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dirUrl = dir.toURI().toURL();
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        loader = new URLClassLoader(new URL[] { dirUrl });
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        f = File.createTempFile("temp", ".dat", dir);
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        f.deleteOnExit();
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        f2 = File.createTempFile("bad#name#", ".dat", dir);
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        f2.deleteOnExit();
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Unable to load resource from path with problematic name",
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                loader.getResource(f.getName()));
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("URL was not correctly encoded", f2.toURI().toURL(),
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                loader.getResource(f2.getName()));
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_findResource() throws Exception {
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File resources = Support_Resources.createTempFolder();
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String resPath = resources.toString();
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (resPath.charAt(0) == '/' || resPath.charAt(0) == ' ') {
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            resPath = resPath.substring(1);
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_21.jar");
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_22.jar");
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_23.jar");
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader urlClassloader = URLClassLoader.newInstance(
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new URL[] { new URL("file:/" + resPath
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "/JarIndex/hyts_21.jar") }, null);
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Enumeration en = urlClassloader.findResources("bpack/");
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(en.hasMoreElements());
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL expected = new URL("jar:file:/" + resPath.replace('\\', '/')
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + "/JarIndex/hyts_22.jar!/bpack/");
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(expected, (URL) en.nextElement());
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(expected, urlClassloader.findResource("bpack/"));
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.URLClassLoader#getResource(java.lang.String)
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getResourceLjava_lang_String()
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws MalformedURLException {
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL url1 = new URL("file:///");
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader loader = new URLClassLoader(new URL[] { url1 }, null);
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        long start = System.currentTimeMillis();
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // try without the leading /
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL result = loader.getResource("dir1/file1");
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        long end = System.currentTimeMillis();
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        long time = end - start;
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (time < 100) {
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            time = 100;
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        start = System.currentTimeMillis();
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // try with the leading forward slash
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        result = loader.getResource("/dir1/file1");
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        end = System.currentTimeMillis();
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        long uncTime = end - start;
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("too long. UNC path formed? UNC time: " + uncTime
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + " regular time: " + time, uncTime <= (time * 4));
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Regression for Harmony-2237
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getResource() throws Exception {
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader urlLoader = getURLClassLoader();
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(urlLoader.findResource("XXX")); //$NON-NLS-1$
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static URLClassLoader getURLClassLoader() {
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String classPath = System.getProperty("java.class.path");
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        StringTokenizer tok = new StringTokenizer(classPath, File.pathSeparator);
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Vector<URL> urlVec = new Vector<URL>();
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String resPackage = Support_Resources.RESOURCE_PACKAGE;
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (tok.hasMoreTokens()) {
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String path = tok.nextToken();
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String url;
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (new File(path).isDirectory())
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    url = "file:" + path + resPackage + "subfolder/";
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                else
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    url = "jar:file:" + path + "!" + resPackage + "subfolder/";
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                urlVec.addElement(new URL(url));
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (MalformedURLException e) {
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // do nothing
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] urls = new URL[urlVec.size()];
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < urlVec.size(); i++) {
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            urls[i] = urlVec.elementAt(i);
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader loader = new URLClassLoader(urls, null);
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return loader;
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Regression test for HARMONY-2255
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getResourceAsStream() {
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InputStream in = this.getClass()
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getResourceAsStream("test%.properties");
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(in);
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in = this.getClass().getResourceAsStream("test%25.properties");
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(in);
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
4908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Regression test for HARMONY-6074
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
4948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_findClassLjava_lang_String_Jar_Class_Path() throws Exception {
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File resources = Support_Resources.createTempFolder();
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String resPath = resources.toString();
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (resPath.charAt(0) == '/' || resPath.charAt(0) == '\\') {
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            resPath = resPath.substring(1);
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
5008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_11.jar");
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "JarIndex", "hyts_13.jar");
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        JarFile jarFile = new JarFile(resources.getAbsolutePath() + "/JarIndex/hyts_11.jar");
5058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        Manifest mf = jarFile.getManifest();
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Attributes attrs = mf.getMainAttributes();
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        attrs.putValue("Class-Path", "file:/" + resPath + "/JarIndex/hyts_13.jar");
5088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File mainJar = new File(resources.getAbsolutePath() + "/JarIndex/main.jar");
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        JarOutputStream jos = new JarOutputStream(new FileOutputStream(mainJar), mf);
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        jos.flush();
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        jos.close();
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(mainJar.exists());
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL[] urls = new URL[1];
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urls[0] = new URL("file:/" + resPath + "/JarIndex/main.jar");
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl = URLClassLoader.newInstance(urls, null);
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(Class.forName("Main2", true, ucl));
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
522