author | alanb |
Wed, 06 Dec 2017 08:36:09 +0000 | |
changeset 48076 | 794cbfa7a309 |
parent 47216 | 71c04702a3d5 |
child 52102 | 19f6b12df31a |
permissions | -rw-r--r-- |
44545 | 1 |
/* |
45393 | 2 |
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. |
44545 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
7 |
* published by the Free Software Foundation. |
|
8 |
* |
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
13 |
* accompanied this code). |
|
14 |
* |
|
15 |
* You should have received a copy of the GNU General Public License version |
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
18 |
* |
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
20 |
* or visit www.oracle.com if you need additional information or have any |
|
21 |
* questions. |
|
22 |
*/ |
|
23 |
||
24 |
/** |
|
25 |
* @test |
|
45393 | 26 |
* @library /lib/testlibrary /test/lib |
44545 | 27 |
* @modules jdk.compiler |
45393 | 28 |
* @build LayerAndLoadersTest jdk.test.lib.compiler.CompilerUtils ModuleUtils |
44545 | 29 |
* @run testng LayerAndLoadersTest |
30 |
* @summary Tests for java.lang.ModuleLayer@defineModulesWithXXX methods |
|
31 |
*/ |
|
32 |
||
33 |
import java.io.IOException; |
|
34 |
import java.io.InputStream; |
|
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
35 |
import java.io.UncheckedIOException; |
44545 | 36 |
import java.lang.module.Configuration; |
37 |
import java.lang.module.ModuleDescriptor; |
|
38 |
import java.lang.module.ModuleFinder; |
|
39 |
import java.lang.module.ModuleReference; |
|
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
40 |
import java.lang.module.ResolvedModule; |
44545 | 41 |
import java.lang.reflect.Method; |
42 |
import java.net.URL; |
|
43 |
import java.nio.file.Path; |
|
44 |
import java.nio.file.Paths; |
|
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
45 |
import java.util.ArrayList; |
44545 | 46 |
import java.util.Enumeration; |
47 |
import java.util.HashMap; |
|
48 |
import java.util.Iterator; |
|
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
49 |
import java.util.List; |
44545 | 50 |
import java.util.Map; |
51 |
import java.util.Optional; |
|
52 |
import java.util.ServiceLoader; |
|
53 |
import java.util.Set; |
|
54 |
import java.util.stream.Collectors; |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
55 |
|
45393 | 56 |
import jdk.test.lib.compiler.CompilerUtils; |
44545 | 57 |
|
58 |
import org.testng.annotations.BeforeTest; |
|
59 |
import org.testng.annotations.Test; |
|
60 |
import static org.testng.Assert.*; |
|
61 |
||
62 |
@Test |
|
63 |
public class LayerAndLoadersTest { |
|
64 |
||
65 |
private static final String TEST_SRC = System.getProperty("test.src"); |
|
66 |
||
67 |
private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); |
|
68 |
private static final Path MODS_DIR = Paths.get("mods"); |
|
69 |
||
70 |
@BeforeTest |
|
71 |
public void setup() throws Exception { |
|
72 |
// javac -d mods --module-source-path src src/** |
|
73 |
assertTrue(CompilerUtils.compile(SRC_DIR, MODS_DIR, |
|
74 |
"--module-source-path", SRC_DIR.toString())); |
|
75 |
} |
|
76 |
||
77 |
||
78 |
/** |
|
79 |
* Basic test of ModuleLayer.defineModulesWithOneLoader |
|
80 |
* |
|
81 |
* Test scenario: |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
82 |
* m1 requires m2 and m3 |
44545 | 83 |
*/ |
84 |
public void testWithOneLoader() throws Exception { |
|
85 |
Configuration cf = resolve("m1"); |
|
86 |
||
87 |
ClassLoader scl = ClassLoader.getSystemClassLoader(); |
|
88 |
||
89 |
ModuleLayer layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, scl); |
|
90 |
||
91 |
checkLayer(layer, "m1", "m2", "m3"); |
|
92 |
||
93 |
ClassLoader cl1 = layer.findLoader("m1"); |
|
94 |
ClassLoader cl2 = layer.findLoader("m2"); |
|
95 |
ClassLoader cl3 = layer.findLoader("m3"); |
|
96 |
||
97 |
assertTrue(cl1.getParent() == scl); |
|
98 |
assertTrue(cl2 == cl1); |
|
99 |
assertTrue(cl3 == cl1); |
|
100 |
||
101 |
invoke(layer, "m1", "p.Main"); |
|
102 |
} |
|
103 |
||
104 |
||
105 |
/** |
|
106 |
* Basic test of ModuleLayer.defineModulesWithManyLoaders |
|
107 |
* |
|
108 |
* Test scenario: |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
109 |
* m1 requires m2 and m3 |
44545 | 110 |
*/ |
111 |
public void testWithManyLoaders() throws Exception { |
|
112 |
Configuration cf = resolve("m1"); |
|
113 |
||
114 |
ClassLoader scl = ClassLoader.getSystemClassLoader(); |
|
115 |
||
116 |
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, scl); |
|
117 |
||
118 |
checkLayer(layer, "m1", "m2", "m3"); |
|
119 |
||
120 |
ClassLoader cl1 = layer.findLoader("m1"); |
|
121 |
ClassLoader cl2 = layer.findLoader("m2"); |
|
122 |
ClassLoader cl3 = layer.findLoader("m3"); |
|
123 |
||
124 |
assertTrue(cl1.getParent() == scl); |
|
125 |
assertTrue(cl2.getParent() == scl); |
|
126 |
assertTrue(cl3.getParent() == scl); |
|
127 |
assertTrue(cl2 != cl1); |
|
128 |
assertTrue(cl3 != cl1); |
|
129 |
assertTrue(cl3 != cl2); |
|
130 |
||
131 |
invoke(layer, "m1", "p.Main"); |
|
132 |
} |
|
133 |
||
134 |
||
135 |
/** |
|
136 |
* Basic test of ModuleLayer.defineModulesWithOneLoader where one of the |
|
137 |
* modules is a service provider module. |
|
138 |
* |
|
139 |
* Test scenario: |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
140 |
* m1 requires m2 and m3 |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
141 |
* m1 uses S |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
142 |
* m4 provides S with ... |
44545 | 143 |
*/ |
144 |
public void testServicesWithOneLoader() throws Exception { |
|
145 |
Configuration cf = resolveAndBind("m1"); |
|
146 |
||
147 |
ClassLoader scl = ClassLoader.getSystemClassLoader(); |
|
148 |
||
149 |
ModuleLayer layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, scl); |
|
150 |
||
151 |
checkLayer(layer, "m1", "m2", "m3", "m4"); |
|
152 |
||
153 |
ClassLoader cl1 = layer.findLoader("m1"); |
|
154 |
ClassLoader cl2 = layer.findLoader("m2"); |
|
155 |
ClassLoader cl3 = layer.findLoader("m3"); |
|
156 |
ClassLoader cl4 = layer.findLoader("m4"); |
|
157 |
||
158 |
assertTrue(cl1.getParent() == scl); |
|
159 |
assertTrue(cl2 == cl1); |
|
160 |
assertTrue(cl3 == cl1); |
|
161 |
assertTrue(cl4 == cl1); |
|
162 |
||
163 |
Class<?> serviceType = cl1.loadClass("p.Service"); |
|
164 |
assertTrue(serviceType.getClassLoader() == cl1); |
|
165 |
||
166 |
Iterator<?> iter = ServiceLoader.load(serviceType, cl1).iterator(); |
|
167 |
Object provider = iter.next(); |
|
168 |
assertTrue(serviceType.isInstance(provider)); |
|
169 |
assertTrue(provider.getClass().getClassLoader() == cl1); |
|
170 |
assertFalse(iter.hasNext()); |
|
171 |
} |
|
172 |
||
173 |
||
174 |
/** |
|
175 |
* Basic test of ModuleLayer.defineModulesWithManyLoaders where one of the |
|
176 |
* modules is a service provider module. |
|
177 |
* |
|
178 |
* Test scenario: |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
179 |
* m1 requires m2 and m3 |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
180 |
* m1 uses S |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
181 |
* m4 provides S with ... |
44545 | 182 |
*/ |
183 |
public void testServicesWithManyLoaders() throws Exception { |
|
184 |
Configuration cf = resolveAndBind("m1"); |
|
185 |
||
186 |
ClassLoader scl = ClassLoader.getSystemClassLoader(); |
|
187 |
||
188 |
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, scl); |
|
189 |
||
190 |
checkLayer(layer, "m1", "m2", "m3", "m4"); |
|
191 |
||
192 |
ClassLoader cl1 = layer.findLoader("m1"); |
|
193 |
ClassLoader cl2 = layer.findLoader("m2"); |
|
194 |
ClassLoader cl3 = layer.findLoader("m3"); |
|
195 |
ClassLoader cl4 = layer.findLoader("m4"); |
|
196 |
||
197 |
assertTrue(cl1.getParent() == scl); |
|
198 |
assertTrue(cl2.getParent() == scl); |
|
199 |
assertTrue(cl3.getParent() == scl); |
|
200 |
assertTrue(cl4.getParent() == scl); |
|
201 |
assertTrue(cl2 != cl1); |
|
202 |
assertTrue(cl3 != cl1); |
|
203 |
assertTrue(cl3 != cl2); |
|
204 |
assertTrue(cl4 != cl1); |
|
205 |
assertTrue(cl4 != cl2); |
|
206 |
assertTrue(cl4 != cl3); |
|
207 |
||
208 |
Class<?> serviceType = cl1.loadClass("p.Service"); |
|
209 |
assertTrue(serviceType.getClassLoader() == cl1); |
|
210 |
||
211 |
// Test that the service provider can be located via any of |
|
212 |
// the class loaders in the layer |
|
213 |
for (Module m : layer.modules()) { |
|
214 |
ClassLoader loader = m.getClassLoader(); |
|
215 |
Iterator<?> iter = ServiceLoader.load(serviceType, loader).iterator(); |
|
216 |
Object provider = iter.next(); |
|
217 |
assertTrue(serviceType.isInstance(provider)); |
|
218 |
assertTrue(provider.getClass().getClassLoader() == cl4); |
|
219 |
assertFalse(iter.hasNext()); |
|
220 |
} |
|
221 |
} |
|
222 |
||
223 |
||
224 |
/** |
|
225 |
* Tests that the class loaders created by defineModulesWithXXX delegate |
|
226 |
* to the given parent class loader. |
|
227 |
*/ |
|
228 |
public void testDelegationToParent() throws Exception { |
|
229 |
Configuration cf = resolve("m1"); |
|
230 |
||
231 |
ClassLoader parent = this.getClass().getClassLoader(); |
|
232 |
String cn = this.getClass().getName(); |
|
233 |
||
234 |
// one loader |
|
235 |
ModuleLayer layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, parent); |
|
236 |
testLoad(layer, cn); |
|
237 |
||
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
238 |
// one loader with boot loader as parent |
44545 | 239 |
layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, null); |
240 |
testLoadFail(layer, cn); |
|
241 |
||
242 |
// many loaders |
|
243 |
layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, parent); |
|
244 |
testLoad(layer, cn); |
|
245 |
||
246 |
// many loader with boot loader as parent |
|
247 |
layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, null); |
|
248 |
testLoadFail(layer, cn); |
|
249 |
} |
|
250 |
||
251 |
||
252 |
/** |
|
253 |
* Test defineModulesWithXXX when modules that have overlapping packages. |
|
254 |
* |
|
255 |
* Test scenario: |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
256 |
* m1 exports p |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
257 |
* m2 exports p |
44545 | 258 |
*/ |
259 |
public void testOverlappingPackages() { |
|
260 |
ModuleDescriptor descriptor1 |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
261 |
= ModuleDescriptor.newModule("m1").exports("p").build(); |
44545 | 262 |
|
263 |
ModuleDescriptor descriptor2 |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
264 |
= ModuleDescriptor.newModule("m2").exports("p").build(); |
44545 | 265 |
|
266 |
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2); |
|
267 |
||
268 |
Configuration cf = ModuleLayer.boot() |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
269 |
.configuration() |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
270 |
.resolve(finder, ModuleFinder.of(), Set.of("m1", "m2")); |
44545 | 271 |
|
272 |
// cannot define both module m1 and m2 to the same class loader |
|
273 |
try { |
|
274 |
ModuleLayer.boot().defineModulesWithOneLoader(cf, null); |
|
275 |
assertTrue(false); |
|
276 |
} catch (LayerInstantiationException expected) { } |
|
277 |
||
278 |
// should be okay to have one module per class loader |
|
279 |
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, null); |
|
280 |
checkLayer(layer, "m1", "m2"); |
|
281 |
} |
|
282 |
||
283 |
||
284 |
/** |
|
285 |
* Test ModuleLayer.defineModulesWithXXX with split delegation. |
|
286 |
* |
|
287 |
* Test scenario: |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
288 |
* layer1: m1 exports p, m2 exports p |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
289 |
* layer2: m3 reads m1, m4 reads m2 |
44545 | 290 |
*/ |
291 |
public void testSplitDelegation() { |
|
292 |
ModuleDescriptor descriptor1 |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
293 |
= ModuleDescriptor.newModule("m1").exports("p").build(); |
44545 | 294 |
|
295 |
ModuleDescriptor descriptor2 |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
296 |
= ModuleDescriptor.newModule("m2").exports("p").build(); |
44545 | 297 |
|
298 |
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); |
|
299 |
||
300 |
Configuration cf1 = ModuleLayer.boot() |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
301 |
.configuration() |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
302 |
.resolve(finder1, ModuleFinder.of(), Set.of("m1", "m2")); |
44545 | 303 |
|
304 |
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithManyLoaders(cf1, null); |
|
305 |
checkLayer(layer1, "m1", "m2"); |
|
306 |
||
307 |
ModuleDescriptor descriptor3 |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
308 |
= ModuleDescriptor.newModule("m3").requires("m1").build(); |
44545 | 309 |
|
310 |
ModuleDescriptor descriptor4 |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
311 |
= ModuleDescriptor.newModule("m4").requires("m2").build(); |
44545 | 312 |
|
313 |
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3, descriptor4); |
|
314 |
||
315 |
Configuration cf2 = cf1.resolve(finder2, ModuleFinder.of(), |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
316 |
Set.of("m3", "m4")); |
44545 | 317 |
|
318 |
// package p cannot be supplied by two class loaders |
|
319 |
try { |
|
320 |
layer1.defineModulesWithOneLoader(cf2, null); |
|
321 |
assertTrue(false); |
|
322 |
} catch (LayerInstantiationException expected) { } |
|
323 |
||
324 |
// no split delegation when modules have their own class loader |
|
325 |
ModuleLayer layer2 = layer1.defineModulesWithManyLoaders(cf2, null); |
|
326 |
checkLayer(layer2, "m3", "m4"); |
|
327 |
} |
|
328 |
||
329 |
||
330 |
/** |
|
331 |
* Test ModuleLayer.defineModulesWithXXX when the modules that override same |
|
332 |
* named modules in the parent layer. |
|
333 |
* |
|
334 |
* Test scenario: |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
335 |
* layer1: m1, m2, m3 => same loader |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
336 |
* layer2: m1, m2, m4 => same loader |
44545 | 337 |
*/ |
338 |
public void testOverriding1() throws Exception { |
|
339 |
Configuration cf1 = resolve("m1"); |
|
340 |
||
341 |
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithOneLoader(cf1, null); |
|
342 |
checkLayer(layer1, "m1", "m2", "m3"); |
|
343 |
||
344 |
ModuleFinder finder = ModuleFinder.of(MODS_DIR); |
|
345 |
Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(), |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
346 |
Set.of("m1")); |
44545 | 347 |
|
348 |
ModuleLayer layer2 = layer1.defineModulesWithOneLoader(cf2, null); |
|
349 |
checkLayer(layer2, "m1", "m2", "m3"); |
|
350 |
invoke(layer1, "m1", "p.Main"); |
|
351 |
||
352 |
ClassLoader loader1 = layer1.findLoader("m1"); |
|
353 |
ClassLoader loader2 = layer1.findLoader("m2"); |
|
354 |
ClassLoader loader3 = layer1.findLoader("m3"); |
|
355 |
||
356 |
ClassLoader loader4 = layer2.findLoader("m1"); |
|
357 |
ClassLoader loader5 = layer2.findLoader("m2"); |
|
358 |
ClassLoader loader6 = layer2.findLoader("m3"); |
|
359 |
||
360 |
assertTrue(loader1 == loader2); |
|
361 |
assertTrue(loader1 == loader3); |
|
362 |
||
363 |
assertTrue(loader4 == loader5); |
|
364 |
assertTrue(loader4 == loader6); |
|
365 |
assertTrue(loader4 != loader1); |
|
366 |
||
367 |
assertTrue(loader1.loadClass("p.Main").getClassLoader() == loader1); |
|
368 |
assertTrue(loader1.loadClass("q.Hello").getClassLoader() == loader1); |
|
369 |
assertTrue(loader1.loadClass("w.Hello").getClassLoader() == loader1); |
|
370 |
||
371 |
assertTrue(loader4.loadClass("p.Main").getClassLoader() == loader4); |
|
372 |
assertTrue(loader4.loadClass("q.Hello").getClassLoader() == loader4); |
|
373 |
assertTrue(loader4.loadClass("w.Hello").getClassLoader() == loader4); |
|
374 |
} |
|
375 |
||
376 |
||
377 |
/** |
|
378 |
* Test Layer defineModulesWithXXX when the modules that override same |
|
379 |
* named modules in the parent layer. |
|
380 |
* |
|
381 |
* Test scenario: |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
382 |
* layer1: m1, m2, m3 => loader pool |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
383 |
* layer2: m1, m2, m3 => loader pool |
44545 | 384 |
*/ |
385 |
public void testOverriding2() throws Exception { |
|
386 |
Configuration cf1 = resolve("m1"); |
|
387 |
||
388 |
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithManyLoaders(cf1, null); |
|
389 |
checkLayer(layer1, "m1", "m2", "m3"); |
|
390 |
||
391 |
ModuleFinder finder = ModuleFinder.of(MODS_DIR); |
|
392 |
Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(), |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
393 |
Set.of("m1")); |
44545 | 394 |
|
395 |
ModuleLayer layer2 = layer1.defineModulesWithManyLoaders(cf2, null); |
|
396 |
checkLayer(layer2, "m1", "m2", "m3"); |
|
397 |
invoke(layer1, "m1", "p.Main"); |
|
398 |
||
399 |
ClassLoader loader1 = layer1.findLoader("m1"); |
|
400 |
ClassLoader loader2 = layer1.findLoader("m2"); |
|
401 |
ClassLoader loader3 = layer1.findLoader("m3"); |
|
402 |
||
403 |
ClassLoader loader4 = layer2.findLoader("m1"); |
|
404 |
ClassLoader loader5 = layer2.findLoader("m2"); |
|
405 |
ClassLoader loader6 = layer2.findLoader("m3"); |
|
406 |
||
407 |
assertTrue(loader4 != loader1); |
|
408 |
assertTrue(loader5 != loader2); |
|
409 |
assertTrue(loader6 != loader3); |
|
410 |
||
411 |
assertTrue(loader1.loadClass("p.Main").getClassLoader() == loader1); |
|
412 |
assertTrue(loader1.loadClass("q.Hello").getClassLoader() == loader2); |
|
413 |
assertTrue(loader1.loadClass("w.Hello").getClassLoader() == loader3); |
|
414 |
||
415 |
// p.Main is not visible via loader2 |
|
416 |
try { |
|
417 |
loader2.loadClass("p.Main"); |
|
418 |
assertTrue(false); |
|
419 |
} catch (ClassNotFoundException expected) { } |
|
420 |
||
421 |
// w.Hello is not visible via loader2 |
|
422 |
try { |
|
423 |
loader2.loadClass("w.Hello"); |
|
424 |
assertTrue(false); |
|
425 |
} catch (ClassNotFoundException expected) { } |
|
426 |
||
427 |
// p.Main is not visible via loader3 |
|
428 |
try { |
|
429 |
loader3.loadClass("p.Main"); |
|
430 |
assertTrue(false); |
|
431 |
} catch (ClassNotFoundException expected) { } |
|
432 |
||
433 |
// q.Hello is not visible via loader3 |
|
434 |
try { |
|
435 |
loader3.loadClass("q.Hello"); |
|
436 |
assertTrue(false); |
|
437 |
} catch (ClassNotFoundException expected) { } |
|
438 |
||
439 |
||
440 |
assertTrue(loader4.loadClass("p.Main").getClassLoader() == loader4); |
|
441 |
assertTrue(loader5.loadClass("q.Hello").getClassLoader() == loader5); |
|
442 |
assertTrue(loader6.loadClass("w.Hello").getClassLoader() == loader6); |
|
443 |
||
444 |
// p.Main is not visible via loader5 |
|
445 |
try { |
|
446 |
loader5.loadClass("p.Main"); |
|
447 |
assertTrue(false); |
|
448 |
} catch (ClassNotFoundException expected) { } |
|
449 |
||
450 |
// w.Hello is not visible via loader5 |
|
451 |
try { |
|
452 |
loader5.loadClass("w.Hello"); |
|
453 |
assertTrue(false); |
|
454 |
} catch (ClassNotFoundException expected) { } |
|
455 |
||
456 |
// p.Main is not visible via loader6 |
|
457 |
try { |
|
458 |
loader6.loadClass("p.Main"); |
|
459 |
assertTrue(false); |
|
460 |
} catch (ClassNotFoundException expected) { } |
|
461 |
||
462 |
// q.Hello is not visible via loader6 |
|
463 |
try { |
|
464 |
loader6.loadClass("q.Hello"); |
|
465 |
assertTrue(false); |
|
466 |
} catch (ClassNotFoundException expected) { } |
|
467 |
} |
|
468 |
||
469 |
||
470 |
/** |
|
471 |
* Test ModuleLayer.defineModulesWithXXX when the modules that override same |
|
472 |
* named modules in the parent layer. |
|
473 |
* |
|
474 |
* layer1: m1, m2, m3 => same loader |
|
475 |
* layer2: m1, m3 => same loader |
|
476 |
*/ |
|
477 |
public void testOverriding3() throws Exception { |
|
478 |
Configuration cf1 = resolve("m1"); |
|
479 |
||
480 |
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithOneLoader(cf1, null); |
|
481 |
checkLayer(layer1, "m1", "m2", "m3"); |
|
482 |
||
483 |
ModuleFinder finder = finderFor("m1", "m3"); |
|
484 |
||
485 |
Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(), |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
486 |
Set.of("m1")); |
44545 | 487 |
|
488 |
ModuleLayer layer2 = layer1.defineModulesWithOneLoader(cf2, null); |
|
489 |
checkLayer(layer2, "m1", "m3"); |
|
490 |
invoke(layer1, "m1", "p.Main"); |
|
491 |
||
492 |
ClassLoader loader1 = layer1.findLoader("m1"); |
|
493 |
ClassLoader loader2 = layer2.findLoader("m1"); |
|
494 |
||
495 |
assertTrue(loader1.loadClass("p.Main").getClassLoader() == loader1); |
|
496 |
assertTrue(loader1.loadClass("q.Hello").getClassLoader() == loader1); |
|
497 |
assertTrue(loader1.loadClass("w.Hello").getClassLoader() == loader1); |
|
498 |
||
499 |
assertTrue(loader2.loadClass("p.Main").getClassLoader() == loader2); |
|
500 |
assertTrue(loader2.loadClass("q.Hello").getClassLoader() == loader1); |
|
501 |
assertTrue(loader2.loadClass("w.Hello").getClassLoader() == loader2); |
|
502 |
} |
|
503 |
||
504 |
||
505 |
/** |
|
506 |
* Test Layer defineModulesWithXXX when the modules that override same |
|
507 |
* named modules in the parent layer. |
|
508 |
* |
|
509 |
* layer1: m1, m2, m3 => loader pool |
|
510 |
* layer2: m1, m3 => loader pool |
|
511 |
*/ |
|
512 |
public void testOverriding4() throws Exception { |
|
513 |
Configuration cf1 = resolve("m1"); |
|
514 |
||
515 |
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithManyLoaders(cf1, null); |
|
516 |
checkLayer(layer1, "m1", "m2", "m3"); |
|
517 |
||
518 |
ModuleFinder finder = finderFor("m1", "m3"); |
|
519 |
||
520 |
Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(), |
|
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
521 |
Set.of("m1")); |
44545 | 522 |
|
523 |
ModuleLayer layer2 = layer1.defineModulesWithManyLoaders(cf2, null); |
|
524 |
checkLayer(layer2, "m1", "m3"); |
|
525 |
invoke(layer1, "m1", "p.Main"); |
|
526 |
||
527 |
ClassLoader loader1 = layer1.findLoader("m1"); |
|
528 |
ClassLoader loader2 = layer1.findLoader("m2"); |
|
529 |
ClassLoader loader3 = layer1.findLoader("m3"); |
|
530 |
||
531 |
ClassLoader loader4 = layer2.findLoader("m1"); |
|
532 |
ClassLoader loader5 = layer2.findLoader("m2"); |
|
533 |
ClassLoader loader6 = layer2.findLoader("m3"); |
|
534 |
||
535 |
assertTrue(loader4 != loader1); |
|
536 |
assertTrue(loader5 == loader2); // m2 not overridden |
|
537 |
assertTrue(loader6 != loader3); |
|
538 |
||
539 |
assertTrue(loader1.loadClass("p.Main").getClassLoader() == loader1); |
|
540 |
assertTrue(loader1.loadClass("q.Hello").getClassLoader() == loader2); |
|
541 |
assertTrue(loader1.loadClass("w.Hello").getClassLoader() == loader3); |
|
542 |
||
543 |
assertTrue(loader2.loadClass("q.Hello").getClassLoader() == loader2); |
|
544 |
||
545 |
assertTrue(loader3.loadClass("w.Hello").getClassLoader() == loader3); |
|
546 |
||
547 |
assertTrue(loader4.loadClass("p.Main").getClassLoader() == loader4); |
|
548 |
assertTrue(loader4.loadClass("q.Hello").getClassLoader() == loader2); |
|
549 |
assertTrue(loader4.loadClass("w.Hello").getClassLoader() == loader6); |
|
550 |
||
551 |
assertTrue(loader6.loadClass("w.Hello").getClassLoader() == loader6); |
|
552 |
} |
|
553 |
||
554 |
/** |
|
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
555 |
* Basic test for locating resources with a class loader created by |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
556 |
* defineModulesWithOneLoader. |
44545 | 557 |
*/ |
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
558 |
public void testResourcesWithOneLoader() throws Exception { |
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
559 |
testResourcesWithOneLoader(ClassLoader.getSystemClassLoader()); |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
560 |
testResourcesWithOneLoader(null); |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
561 |
} |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
562 |
|
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
563 |
/** |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
564 |
* Test locating resources with the class loader created by |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
565 |
* defineModulesWithOneLoader. The class loader has the given class |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
566 |
* loader as its parent. |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
567 |
*/ |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
568 |
void testResourcesWithOneLoader(ClassLoader parent) throws Exception { |
44545 | 569 |
Configuration cf = resolve("m1"); |
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
570 |
ModuleLayer layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, parent); |
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
571 |
|
44545 | 572 |
ClassLoader loader = layer.findLoader("m1"); |
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
573 |
assertNotNull(loader); |
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
574 |
assertTrue(loader.getParent() == parent); |
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
575 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
576 |
// check that getResource and getResources are consistent |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
577 |
URL url1 = loader.getResource("module-info.class"); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
578 |
URL url2 = loader.getResources("module-info.class").nextElement(); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
579 |
assertEquals(url1.toURI(), url2.toURI()); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
580 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
581 |
// use getResources to find module-info.class resources |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
582 |
Enumeration<URL> urls = loader.getResources("module-info.class"); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
583 |
List<String> list = readModuleNames(urls); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
584 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
585 |
// m1, m2, ... should be first (order not specified) |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
586 |
int count = cf.modules().size(); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
587 |
cf.modules().stream() |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
588 |
.map(ResolvedModule::name) |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
589 |
.forEach(mn -> assertTrue(list.indexOf(mn) < count)); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
590 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
591 |
// java.base should be after m1, m2, ... |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
592 |
assertTrue(list.indexOf("java.base") >= count); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
593 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
594 |
// check resources(String) |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
595 |
List<String> list2 = loader.resources("module-info.class") |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
596 |
.map(this::readModuleName) |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
597 |
.collect(Collectors.toList()); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
598 |
assertEquals(list2, list); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
599 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
600 |
// check nulls |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
601 |
try { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
602 |
loader.getResource(null); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
603 |
assertTrue(false); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
604 |
} catch (NullPointerException e) { } |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
605 |
try { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
606 |
loader.getResources(null); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
607 |
assertTrue(false); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
608 |
} catch (NullPointerException e) { } |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
609 |
try { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
610 |
loader.resources(null); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
611 |
assertTrue(false); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
612 |
} catch (NullPointerException e) { } |
44545 | 613 |
} |
614 |
||
615 |
/** |
|
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
616 |
* Basic test for locating resources with class loaders created by |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
617 |
* defineModulesWithManyLoaders. |
44545 | 618 |
*/ |
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
619 |
public void testResourcesWithManyLoaders() throws Exception { |
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
620 |
testResourcesWithManyLoaders(ClassLoader.getSystemClassLoader()); |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
621 |
testResourcesWithManyLoaders(null); |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
622 |
} |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
623 |
|
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
624 |
/** |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
625 |
* Test locating resources with class loaders created by |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
626 |
* defineModulesWithManyLoaders. The class loaders have the given class |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
627 |
* loader as their parent. |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
628 |
*/ |
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
629 |
void testResourcesWithManyLoaders(ClassLoader parent) throws Exception { |
44545 | 630 |
Configuration cf = resolve("m1"); |
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
631 |
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, parent); |
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
632 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
633 |
for (Module m : layer.modules()) { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
634 |
String name = m.getName(); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
635 |
ClassLoader loader = m.getClassLoader(); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
636 |
assertNotNull(loader); |
48076
794cbfa7a309
8182742: ClassLoader.getResourceXXX throws NPE when ClassLoader created by defineModulesWithXXX
alanb
parents:
47216
diff
changeset
|
637 |
assertTrue(loader.getParent() == parent); |
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
638 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
639 |
// getResource should find the module-info.class for the module |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
640 |
URL url = loader.getResource("module-info.class"); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
641 |
assertEquals(readModuleName(url), name); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
642 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
643 |
// list of modules names read from module-info.class |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
644 |
Enumeration<URL> urls = loader.getResources("module-info.class"); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
645 |
List<String> list = readModuleNames(urls); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
646 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
647 |
// module should be the first element |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
648 |
assertTrue(list.indexOf(name) == 0); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
649 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
650 |
// the module-info.class for the other modules in the layer |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
651 |
// should not be found |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
652 |
layer.modules().stream() |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
653 |
.map(Module::getName) |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
654 |
.filter(mn -> !mn.equals(name)) |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
655 |
.forEach(mn -> assertTrue(list.indexOf(mn) < 0)); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
656 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
657 |
// java.base cannot be the first element |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
658 |
assertTrue(list.indexOf("java.base") > 0); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
659 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
660 |
// check resources(String) |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
661 |
List<String> list2 = loader.resources("module-info.class") |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
662 |
.map(this::readModuleName) |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
663 |
.collect(Collectors.toList()); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
664 |
assertEquals(list2, list); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
665 |
|
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
666 |
// check nulls |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
667 |
try { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
668 |
loader.getResource(null); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
669 |
assertTrue(false); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
670 |
} catch (NullPointerException e) { } |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
671 |
try { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
672 |
loader.getResources(null); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
673 |
assertTrue(false); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
674 |
} catch (NullPointerException e) { } |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
675 |
try { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
676 |
loader.resources(null); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
677 |
assertTrue(false); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
678 |
} catch (NullPointerException e) { } |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
679 |
} |
44545 | 680 |
} |
681 |
||
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
682 |
private List<String> readModuleNames(Enumeration<URL> e) { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
683 |
List<String> list = new ArrayList<>(); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
684 |
while (e.hasMoreElements()) { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
685 |
URL url = e.nextElement(); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
686 |
list.add(readModuleName(url)); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
687 |
} |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
688 |
return list; |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
689 |
} |
44545 | 690 |
|
45652
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
691 |
private String readModuleName(URL url) { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
692 |
try (InputStream in = url.openStream()) { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
693 |
ModuleDescriptor descriptor = ModuleDescriptor.read(in); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
694 |
return descriptor.name(); |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
695 |
} catch (IOException ioe) { |
33342314ce89
8181087: Module system implementation refresh (6/2017)
alanb
parents:
44545
diff
changeset
|
696 |
throw new UncheckedIOException(ioe); |
44545 | 697 |
} |
698 |
} |
|
699 |
||
700 |
||
701 |
// -- supporting methods -- |
|
702 |
||
703 |
||
704 |
/** |
|
705 |
* Resolve the given modules, by name, and returns the resulting |
|
706 |
* Configuration. |
|
707 |
*/ |
|
708 |
private static Configuration resolve(String... roots) { |
|
709 |
ModuleFinder finder = ModuleFinder.of(MODS_DIR); |
|
710 |
return ModuleLayer.boot() |
|
711 |
.configuration() |
|
712 |
.resolve(finder, ModuleFinder.of(), Set.of(roots)); |
|
713 |
} |
|
714 |
||
715 |
/** |
|
716 |
* Resolve the given modules, by name, and returns the resulting |
|
717 |
* Configuration. |
|
718 |
*/ |
|
719 |
private static Configuration resolveAndBind(String... roots) { |
|
720 |
ModuleFinder finder = ModuleFinder.of(MODS_DIR); |
|
721 |
return ModuleLayer.boot() |
|
722 |
.configuration() |
|
723 |
.resolveAndBind(finder, ModuleFinder.of(), Set.of(roots)); |
|
724 |
} |
|
725 |
||
726 |
||
727 |
/** |
|
728 |
* Invokes the static void main(String[]) method on the given class |
|
729 |
* in the given module. |
|
730 |
*/ |
|
731 |
private static void invoke(ModuleLayer layer, String mn, String mc) throws Exception { |
|
732 |
ClassLoader loader = layer.findLoader(mn); |
|
733 |
Class<?> c = loader.loadClass(mc); |
|
734 |
Method mainMethod = c.getMethod("main", String[].class); |
|
735 |
mainMethod.invoke(null, (Object)new String[0]); |
|
736 |
} |
|
737 |
||
738 |
||
739 |
/** |
|
740 |
* Checks that the given layer contains exactly the expected modules |
|
741 |
* (by name). |
|
742 |
*/ |
|
743 |
private void checkLayer(ModuleLayer layer, String ... expected) { |
|
744 |
Set<String> names = layer.modules().stream() |
|
745 |
.map(Module::getName) |
|
746 |
.collect(Collectors.toSet()); |
|
747 |
assertTrue(names.size() == expected.length); |
|
748 |
for (String name : expected) { |
|
749 |
assertTrue(names.contains(name)); |
|
750 |
} |
|
751 |
} |
|
752 |
||
753 |
||
754 |
/** |
|
755 |
* Test that a class can be loaded via the class loader of all modules |
|
756 |
* in the given layer. |
|
757 |
*/ |
|
758 |
static void testLoad(ModuleLayer layer, String cn) throws Exception { |
|
759 |
for (Module m : layer.modules()) { |
|
760 |
ClassLoader l = m.getClassLoader(); |
|
761 |
l.loadClass(cn); |
|
762 |
} |
|
763 |
} |
|
764 |
||
765 |
||
766 |
/** |
|
767 |
* Test that a class cannot be loaded via any of the class loaders of |
|
768 |
* the modules in the given layer. |
|
769 |
*/ |
|
770 |
static void testLoadFail(ModuleLayer layer, String cn) throws Exception { |
|
771 |
for (Module m : layer.modules()) { |
|
772 |
ClassLoader l = m.getClassLoader(); |
|
773 |
try { |
|
774 |
l.loadClass(cn); |
|
775 |
assertTrue(false); |
|
776 |
} catch (ClassNotFoundException expected) { } |
|
777 |
} |
|
778 |
} |
|
779 |
||
780 |
||
781 |
/** |
|
782 |
* Returns a ModuleFinder that only finds the given test modules |
|
783 |
*/ |
|
784 |
static ModuleFinder finderFor(String... names) { |
|
785 |
||
786 |
ModuleFinder finder = ModuleFinder.of(MODS_DIR); |
|
787 |
||
788 |
Map<String, ModuleReference> mrefs = new HashMap<>(); |
|
789 |
for (String name : names) { |
|
790 |
Optional<ModuleReference> omref = finder.find(name); |
|
791 |
assert omref.isPresent(); |
|
792 |
mrefs.put(name, omref.get()); |
|
793 |
} |
|
794 |
||
795 |
return new ModuleFinder() { |
|
796 |
@Override |
|
797 |
public Optional<ModuleReference> find(String name) { |
|
798 |
ModuleReference mref = mrefs.get(name); |
|
799 |
return Optional.ofNullable(mref); |
|
800 |
} |
|
801 |
@Override |
|
802 |
public Set<ModuleReference> findAll() { |
|
803 |
return mrefs.values().stream().collect(Collectors.toSet()); |
|
804 |
} |
|
805 |
}; |
|
806 |
} |
|
807 |
||
808 |
} |