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.util;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.File;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.MalformedURLException;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.URL;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.URLClassLoader;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Iterator;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.NoSuchElementException;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.ServiceConfigurationError;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.ServiceLoader;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.AbstractService;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.Service;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceDuplicateIn2File;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceFinalClass;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceForAllCommentTest;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceForEmptyTest;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceForIllegalNameTest;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceForWrongNameTest;
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceIn2File;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceIn2FileWithEmptyConfig;
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceMoreThanOne;
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.resources.ServiceLoader.ServiceWithDuplicateSons;
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.support.resource.Support_Resources;
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test cases for java.util.ServiceLoader
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class ServiceLoaderTest extends TestCase {
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static URL jarFile = null;
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws MalformedURLException
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests {@link java.util.ServiceLoader#reload()}.
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("nls")
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_reload() throws MalformedURLException {
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class SubURLClassLoader extends URLClassLoader {
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            /**
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes             * @param urls
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes             */
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public SubURLClassLoader(URL[] urls) {
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                super(urls);
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            @Override
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void addURL(URL url) {
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                super.addURL(url);
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SubURLClassLoader ucl = new SubURLClassLoader(new URL[] { new URL(
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "file:/no/such/file") });
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServiceLoader<Service> serviceLoader = ServiceLoader.load(
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Service.class, ucl);
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Iterator<Service> itr = serviceLoader.iterator();
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // change the ucl to install a jar file
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl.addURL(jarFile);
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // before reload, the Iterator is unchanged
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotSame(itr, serviceLoader.iterator());
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // after reload, the Iterator update
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader.reload();
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfService", itr.next().myNameIs());
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests {@link java.util.ServiceLoader#iterator()}.
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings( { "nls", "unchecked" })
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_iterator() {
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader ucl = new URLClassLoader(new URL[] { jarFile });
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Iterator itr = ServiceLoader.load(Service.class, ucl).iterator();
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfService", ((Service) itr.next())
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .myNameIs());
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.remove();
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOperationException");
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = ServiceLoader.load(ServiceForWrongNameTest.class, ucl).iterator();
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.next();
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw ServiceConfigurationError");
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ServiceConfigurationError e) {
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.remove();
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOperationException");
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // null test
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = ServiceLoader.load(null).iterator();
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        nullIteratorTester(itr);
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = ServiceLoader.load(null, null).iterator();
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        nullIteratorTester(itr);
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = ServiceLoader.load(null, ClassLoader.getSystemClassLoader())
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .iterator();
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        nullIteratorTester(itr);
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = ServiceLoader.load(Service.class, null).iterator();
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.next();
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NoSuchElementException");
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NoSuchElementException e) {
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.remove();
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOperationException");
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings( { "nls", "unchecked" })
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void nullIteratorTester(Iterator itr) {
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(itr);
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.hasNext();
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerException");
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.next();
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerException");
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.remove();
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOperationException");
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws MalformedURLException
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests {@link java.util.ServiceLoader#load(java.lang.Class, java.lang.ClassLoader)}.
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings( { "nls", "unchecked" })
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_loadLjava_lang_ClassLjava_lang_ClassLoader()
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws MalformedURLException {
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader ucl = new URLClassLoader(new URL[] { jarFile });
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal config file
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServiceLoader serviceLoader = ServiceLoader.load(Service.class, ucl);
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Iterator itr = serviceLoader.iterator();
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfService", ((Service) itr.next())
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .myNameIs());
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // class that can not cast correctly
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceFinalClass.class, ucl);
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.next();
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw ServiceConfigurationError");
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ServiceConfigurationError e) {
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // abstract class with comment in config file
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(AbstractService.class, ucl);
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfAbstractService", ((AbstractService) itr
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .next()).myNameIs());
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // one service with two implementation class
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceMoreThanOne.class, ucl);
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String name = ((ServiceMoreThanOne) itr.next()).myNameIs();
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if ("ImplementationOfServiceMoreThanOne1".equals(name)) {
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("ImplementationOfServiceMoreThanOne2",
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((ServiceMoreThanOne) itr.next()).myNameIs());
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } else if ("ImplementationOfServiceMoreThanOne2".equals(name)) {
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("ImplementationOfServiceMoreThanOne1",
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((ServiceMoreThanOne) itr.next()).myNameIs());
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } else {
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should load ImplementationOfServiceMoreThanOne1 or ImplementationOfServiceMoreThanOne2");
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // config file only contains comments
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceForAllCommentTest.class, ucl);
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.next();
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NoSuchElementException");
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NoSuchElementException e) {
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // empty config file
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceForEmptyTest.class, ucl);
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.next();
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NoSuchElementException");
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NoSuchElementException e) {
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // config file with illegal char
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .load(ServiceForIllegalNameTest.class, ucl);
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.hasNext();
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw ServiceConfigurationError");
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ServiceConfigurationError e) {
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // config file with legal string, but the class does not exist
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceForWrongNameTest.class, ucl);
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            itr.next();
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw ServiceConfigurationError");
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ServiceConfigurationError e) {
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // config file for an internal class
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                AbstractService.InternalService.class, ucl);
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfAbstractServiceInternalService",
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((AbstractService.InternalService) itr.next())
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        .myInternalNameIs());
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // config files in the 2 jar files
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceIn2File.class, ucl);
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfServiceIn2File1", ((ServiceIn2File) itr
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .next()).myNameIs());
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // add the second file
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL jarFile2 = prepairJar("hyts_services2.jar");
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader ucl2 = new URLClassLoader(
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new URL[] { jarFile, jarFile2 });
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceIn2File.class, ucl2);
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        name = ((ServiceIn2File) itr.next()).myNameIs();
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if ("ImplementationOfServiceIn2File1".equals(name)) {
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("ImplementationOfServiceIn2File2",
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((ServiceIn2File) itr.next()).myNameIs());
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } else if ("ImplementationOfServiceIn2File2".equals(name)) {
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("ImplementationOfServiceIn2File1",
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((ServiceIn2File) itr.next()).myNameIs());
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } else {
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should load ImplementationOfServiceIn2File1 or ImplementationOfServiceIn2File2");
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // same config files in 2 jar files
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceDuplicateIn2File.class, ucl2);
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfServiceDuplicateIn2File_1",
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((ServiceDuplicateIn2File) itr.next()).myNameIs());
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl2 = new URLClassLoader(new URL[] { jarFile2, jarFile });
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceDuplicateIn2File.class, ucl2);
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfServiceDuplicateIn2File_2",
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((ServiceDuplicateIn2File) itr.next()).myNameIs());
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // one config file in one jar, another empty config in another jar.
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceIn2FileWithEmptyConfig.class,
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ucl);
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfServiceIn2FileWithEmptyConfig",
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((ServiceIn2FileWithEmptyConfig) itr.next()).myNameIs());
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ucl2 = new URLClassLoader(new URL[] { jarFile, jarFile2 });
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceIn2FileWithEmptyConfig.class,
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ucl2);
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfServiceIn2FileWithEmptyConfig",
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((ServiceIn2FileWithEmptyConfig) itr.next()).myNameIs());
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // config file with duplicate items
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(ServiceWithDuplicateSons.class, ucl);
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        itr = serviceLoader.iterator();
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(itr.hasNext());
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("ImplementationOfServiceWithDuplicateSons",
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((ServiceWithDuplicateSons) itr.next()).myNameIs());
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(itr.hasNext());
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // can not load by system classloader
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(Service.class, ClassLoader
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getSystemClassLoader());
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(serviceLoader.iterator().hasNext());
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // can not load by Thread.currentThread().getContextClassLoader()
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(Service.class, Thread
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .currentThread().getContextClassLoader());
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(serviceLoader.iterator().hasNext());
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(Service.class, Service.class
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getClassLoader());
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(serviceLoader.iterator().hasNext());
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // String is a final class, no sub-class for it
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(String.class, ucl);
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(serviceLoader.iterator().hasNext());
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests {@link java.util.ServiceLoader#load(java.lang.Class)}.
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings( { "nls", "unchecked" })
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_loadLjava_lang_Class() {
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServiceLoader serviceLoader = ServiceLoader.load(Service.class);
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(serviceLoader.iterator().hasNext());
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // String is a final class, no sub-class for it
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(String.class);
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(serviceLoader.iterator().hasNext());
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @param fileName
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @return the URL of the jar file
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws MalformedURLException
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("nls")
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static URL prepairJar(String fileName) throws MalformedURLException {
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File resources = Support_Resources.createTempFolder();
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String resPath = resources.toString();
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (resPath.charAt(0) == '/' || resPath.charAt(0) == '\\') {
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            resPath = resPath.substring(1);
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Resources.copyFile(resources, "ServiceLoader", fileName);
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URL resourceURL = new URL("file:/" + resPath + "/ServiceLoader/"
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + fileName);
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return resourceURL;
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests {@link java.util.ServiceLoader#loadInstalled(java.lang.Class)}.
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_loadInstalledLjava_lang_Class() {
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServiceLoader<Service> serviceLoader = ServiceLoader
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .loadInstalled(Service.class);
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(serviceLoader.iterator().hasNext());
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.loadInstalled(null);
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Iterator<Service> itr = serviceLoader.iterator();
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        nullIteratorTester(itr);
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests {@link java.util.ServiceLoader#toString()}.
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings( { "unchecked", "nls" })
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_toString() {
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        URLClassLoader ucl = new URLClassLoader(new URL[] { jarFile });
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServiceLoader serviceLoader = ServiceLoader.load(Service.class, ucl);
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(serviceLoader.toString().length() > 0);
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(String.class, ucl);
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(serviceLoader.toString().length() > 0);
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(Service.class);
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(serviceLoader.toString().length() > 0);
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(String.class);
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(serviceLoader.toString().length() > 0);
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.loadInstalled(Service.class);
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(serviceLoader.toString().length() > 0);
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.loadInstalled(String.class);
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(serviceLoader.toString().length() > 0);
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(null, ucl);
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(serviceLoader);
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            serviceLoader.toString();
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerException");
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(null, null);
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(serviceLoader);
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            serviceLoader.toString();
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerException");
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(Service.class, null);
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(serviceLoader.toString().length() > 0);
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.load(null);
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(serviceLoader);
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            serviceLoader.toString();
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerException");
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serviceLoader = ServiceLoader.loadInstalled(null);
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(serviceLoader);
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            serviceLoader.toString();
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerException");
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @see junit.framework.TestCase#setUp()
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("nls")
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @Override
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() throws Exception {
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.setUp();
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        jarFile = prepairJar("hyts_services.jar");
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @see junit.framework.TestCase#tearDown()
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @Override
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void tearDown() throws Exception {
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.tearDown();
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        new File(jarFile.getFile()).delete();
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
492