Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/java/lang/module/ModuleFinderTest.java
41149 views
1
/*
2
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
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
26
* @modules java.base/jdk.internal.module
27
* @build ModuleFinderTest
28
* @run testng ModuleFinderTest
29
* @summary Basic tests for java.lang.module.ModuleFinder
30
*/
31
32
import java.io.File;
33
import java.io.OutputStream;
34
import java.lang.module.FindException;
35
import java.lang.module.InvalidModuleDescriptorException;
36
import java.lang.module.ModuleDescriptor;
37
import java.lang.module.ModuleFinder;
38
import java.lang.module.ModuleReference;
39
import java.nio.file.Files;
40
import java.nio.file.Path;
41
import java.nio.file.Paths;
42
import java.util.Optional;
43
import java.util.Set;
44
import java.util.jar.JarEntry;
45
import java.util.jar.JarOutputStream;
46
import java.util.stream.Collectors;
47
48
import jdk.internal.module.ModuleInfoWriter;
49
50
import org.testng.annotations.Test;
51
import static org.testng.Assert.*;
52
53
@Test
54
public class ModuleFinderTest {
55
56
private static final Path USER_DIR
57
= Paths.get(System.getProperty("user.dir"));
58
59
60
/**
61
* Test ModuleFinder.ofSystem
62
*/
63
public void testOfSystem() {
64
ModuleFinder finder = ModuleFinder.ofSystem();
65
66
assertTrue(finder.find("java.se").isPresent());
67
assertTrue(finder.find("java.base").isPresent());
68
assertFalse(finder.find("java.rhubarb").isPresent());
69
70
Set<String> names = finder.findAll().stream()
71
.map(ModuleReference::descriptor)
72
.map(ModuleDescriptor::name)
73
.collect(Collectors.toSet());
74
assertTrue(names.contains("java.se"));
75
assertTrue(names.contains("java.base"));
76
assertFalse(names.contains("java.rhubarb"));
77
}
78
79
80
/**
81
* Test ModuleFinder.of with no entries
82
*/
83
public void testOfNoEntries() {
84
ModuleFinder finder = ModuleFinder.of();
85
assertTrue(finder.findAll().isEmpty());
86
assertFalse(finder.find("java.rhubarb").isPresent());
87
}
88
89
90
/**
91
* Test ModuleFinder.of with one directory of modules
92
*/
93
public void testOfOneDirectory() throws Exception {
94
Path dir = Files.createTempDirectory(USER_DIR, "mods");
95
createExplodedModule(dir.resolve("m1"), "m1");
96
createModularJar(dir.resolve("m2.jar"), "m2");
97
98
ModuleFinder finder = ModuleFinder.of(dir);
99
assertTrue(finder.findAll().size() == 2);
100
assertTrue(finder.find("m1").isPresent());
101
assertTrue(finder.find("m2").isPresent());
102
assertFalse(finder.find("java.rhubarb").isPresent());
103
}
104
105
106
/**
107
* Test ModuleFinder.of with two directories
108
*/
109
public void testOfTwoDirectories() throws Exception {
110
Path dir1 = Files.createTempDirectory(USER_DIR, "mods1");
111
createExplodedModule(dir1.resolve("m1"), "[email protected]");
112
createModularJar(dir1.resolve("m2.jar"), "[email protected]");
113
114
Path dir2 = Files.createTempDirectory(USER_DIR, "mods2");
115
createExplodedModule(dir2.resolve("m1"), "[email protected]");
116
createModularJar(dir2.resolve("m2.jar"), "[email protected]");
117
createExplodedModule(dir2.resolve("m3"), "m3");
118
createModularJar(dir2.resolve("m4.jar"), "m4");
119
120
ModuleFinder finder = ModuleFinder.of(dir1, dir2);
121
assertTrue(finder.findAll().size() == 4);
122
assertTrue(finder.find("m1").isPresent());
123
assertTrue(finder.find("m2").isPresent());
124
assertTrue(finder.find("m3").isPresent());
125
assertTrue(finder.find("m4").isPresent());
126
assertFalse(finder.find("java.rhubarb").isPresent());
127
128
// check that [email protected] (and not [email protected]) is found
129
ModuleDescriptor m1 = finder.find("m1").get().descriptor();
130
assertEquals(m1.version().get().toString(), "1.0");
131
132
// check that [email protected] (and not [email protected]) is found
133
ModuleDescriptor m2 = finder.find("m2").get().descriptor();
134
assertEquals(m2.version().get().toString(), "1.0");
135
}
136
137
138
/**
139
* Test ModuleFinder.of with one JAR file
140
*/
141
public void testOfOneJarFile() throws Exception {
142
Path dir = Files.createTempDirectory(USER_DIR, "mods");
143
Path jar1 = createModularJar(dir.resolve("m1.jar"), "m1");
144
145
ModuleFinder finder = ModuleFinder.of(jar1);
146
assertTrue(finder.findAll().size() == 1);
147
assertTrue(finder.find("m1").isPresent());
148
assertFalse(finder.find("java.rhubarb").isPresent());
149
}
150
151
152
/**
153
* Test ModuleFinder.of with two JAR files
154
*/
155
public void testOfTwoJarFiles() throws Exception {
156
Path dir = Files.createTempDirectory(USER_DIR, "mods");
157
158
Path jar1 = createModularJar(dir.resolve("m1.jar"), "m1");
159
Path jar2 = createModularJar(dir.resolve("m2.jar"), "m2");
160
161
ModuleFinder finder = ModuleFinder.of(jar1, jar2);
162
assertTrue(finder.findAll().size() == 2);
163
assertTrue(finder.find("m1").isPresent());
164
assertTrue(finder.find("m2").isPresent());
165
assertFalse(finder.find("java.rhubarb").isPresent());
166
}
167
168
169
/**
170
* Test ModuleFinder.of with many JAR files
171
*/
172
public void testOfManyJarFiles() throws Exception {
173
Path dir = Files.createTempDirectory(USER_DIR, "mods");
174
175
Path jar1 = createModularJar(dir.resolve("[email protected]"), "[email protected]");
176
Path jar2 = createModularJar(dir.resolve("[email protected]"), "m2");
177
Path jar3 = createModularJar(dir.resolve("[email protected]"), "[email protected]"); // shadowed
178
Path jar4 = createModularJar(dir.resolve("[email protected]"), "m3");
179
180
ModuleFinder finder = ModuleFinder.of(jar1, jar2, jar3, jar4);
181
assertTrue(finder.findAll().size() == 3);
182
assertTrue(finder.find("m1").isPresent());
183
assertTrue(finder.find("m2").isPresent());
184
assertTrue(finder.find("m3").isPresent());
185
assertFalse(finder.find("java.rhubarb").isPresent());
186
187
// check that [email protected] (and not [email protected]) is found
188
ModuleDescriptor m1 = finder.find("m1").get().descriptor();
189
assertEquals(m1.version().get().toString(), "1.0");
190
}
191
192
193
/**
194
* Test ModuleFinder.of with one exploded module.
195
*/
196
public void testOfOneExplodedModule() throws Exception {
197
Path dir = Files.createTempDirectory(USER_DIR, "mods");
198
Path m1_dir = createExplodedModule(dir.resolve("m1"), "m1");
199
200
ModuleFinder finder = ModuleFinder.of(m1_dir);
201
assertTrue(finder.findAll().size() == 1);
202
assertTrue(finder.find("m1").isPresent());
203
assertFalse(finder.find("java.rhubarb").isPresent());
204
}
205
206
207
/**
208
* Test ModuleFinder.of with two exploded modules.
209
*/
210
public void testOfTwoExplodedModules() throws Exception {
211
Path dir = Files.createTempDirectory(USER_DIR, "mods");
212
Path m1_dir = createExplodedModule(dir.resolve("m1"), "m1");
213
Path m2_dir = createExplodedModule(dir.resolve("m2"), "m2");
214
215
ModuleFinder finder = ModuleFinder.of(m1_dir, m2_dir);
216
assertTrue(finder.findAll().size() == 2);
217
assertTrue(finder.find("m1").isPresent());
218
assertTrue(finder.find("m2").isPresent());
219
assertFalse(finder.find("java.rhubarb").isPresent());
220
}
221
222
223
/**
224
* Test ModuleFinder.of with a mix of module directories and JAR files.
225
*/
226
public void testOfMixDirectoriesAndJars() throws Exception {
227
228
// directory with [email protected] and [email protected]
229
Path dir1 = Files.createTempDirectory(USER_DIR, "mods1");
230
createExplodedModule(dir1.resolve("m1"), "[email protected]");
231
createModularJar(dir1.resolve("m2.jar"), "[email protected]");
232
233
// JAR files: [email protected], [email protected], [email protected], [email protected]
234
Path dir2 = Files.createTempDirectory(USER_DIR, "mods2");
235
Path jar1 = createModularJar(dir2.resolve("m1.jar"), "[email protected]");
236
Path jar2 = createModularJar(dir2.resolve("m2.jar"), "[email protected]");
237
Path jar3 = createModularJar(dir2.resolve("m3.jar"), "[email protected]");
238
Path jar4 = createModularJar(dir2.resolve("m4.jar"), "[email protected]");
239
240
// directory with [email protected] and [email protected]
241
Path dir3 = Files.createTempDirectory(USER_DIR, "mods3");
242
createExplodedModule(dir3.resolve("m3"), "[email protected]");
243
createModularJar(dir3.resolve("m4.jar"), "[email protected]");
244
245
// JAR files: m5 and m6
246
Path dir4 = Files.createTempDirectory(USER_DIR, "mods4");
247
Path jar5 = createModularJar(dir4.resolve("m5.jar"), "[email protected]");
248
Path jar6 = createModularJar(dir4.resolve("m6.jar"), "[email protected]");
249
250
251
ModuleFinder finder
252
= ModuleFinder.of(dir1, jar1, jar2, jar3, jar4, dir3, jar5, jar6);
253
assertTrue(finder.findAll().size() == 6);
254
assertTrue(finder.find("m1").isPresent());
255
assertTrue(finder.find("m2").isPresent());
256
assertTrue(finder.find("m3").isPresent());
257
assertTrue(finder.find("m4").isPresent());
258
assertTrue(finder.find("m5").isPresent());
259
assertTrue(finder.find("m6").isPresent());
260
assertFalse(finder.find("java.rhubarb").isPresent());
261
262
// m1 and m2 should be located in dir1
263
ModuleDescriptor m1 = finder.find("m1").get().descriptor();
264
assertEquals(m1.version().get().toString(), "1.0");
265
ModuleDescriptor m2 = finder.find("m2").get().descriptor();
266
assertEquals(m2.version().get().toString(), "1.0");
267
268
// m3 and m4 should be located in JAR files
269
ModuleDescriptor m3 = finder.find("m3").get().descriptor();
270
assertEquals(m3.version().get().toString(), "2.0");
271
ModuleDescriptor m4 = finder.find("m4").get().descriptor();
272
assertEquals(m4.version().get().toString(), "2.0");
273
274
// m5 and m6 should be located in JAR files
275
ModuleDescriptor m5 = finder.find("m5").get().descriptor();
276
assertEquals(m5.version().get().toString(), "4.0");
277
ModuleDescriptor m6 = finder.find("m6").get().descriptor();
278
assertEquals(m6.version().get().toString(), "4.0");
279
}
280
281
282
/**
283
* Test ModuleFinder.of with a mix of module directories and exploded
284
* modules.
285
*/
286
public void testOfMixDirectoriesAndExplodedModules() throws Exception {
287
// directory with [email protected] and [email protected]
288
Path dir1 = Files.createTempDirectory(USER_DIR, "mods1");
289
createExplodedModule(dir1.resolve("m1"), "[email protected]");
290
createModularJar(dir1.resolve("m2.jar"), "[email protected]");
291
292
// exploded modules: [email protected], [email protected], [email protected], [email protected]
293
Path dir2 = Files.createTempDirectory(USER_DIR, "mods2");
294
Path m1_dir = createExplodedModule(dir2.resolve("m1"), "[email protected]");
295
Path m2_dir = createExplodedModule(dir2.resolve("m2"), "[email protected]");
296
Path m3_dir = createExplodedModule(dir2.resolve("m3"), "[email protected]");
297
Path m4_dir = createExplodedModule(dir2.resolve("m4"), "[email protected]");
298
299
ModuleFinder finder = ModuleFinder.of(dir1, m1_dir, m2_dir, m3_dir, m4_dir);
300
assertTrue(finder.findAll().size() == 4);
301
assertTrue(finder.find("m1").isPresent());
302
assertTrue(finder.find("m2").isPresent());
303
assertTrue(finder.find("m3").isPresent());
304
assertTrue(finder.find("m4").isPresent());
305
assertFalse(finder.find("java.rhubarb").isPresent());
306
307
// m1 and m2 should be located in dir1
308
ModuleDescriptor m1 = finder.find("m1").get().descriptor();
309
assertEquals(m1.version().get().toString(), "1.0");
310
ModuleDescriptor m2 = finder.find("m2").get().descriptor();
311
assertEquals(m2.version().get().toString(), "1.0");
312
313
// m3 and m4 should be located in dir2
314
ModuleDescriptor m3 = finder.find("m3").get().descriptor();
315
assertEquals(m3.version().get().toString(), "2.0");
316
ModuleDescriptor m4 = finder.find("m4").get().descriptor();
317
assertEquals(m4.version().get().toString(), "2.0");
318
}
319
320
321
/**
322
* Test ModuleFinder with a JAR file containing a mix of class and
323
* non-class resources.
324
*/
325
public void testOfOneJarFileWithResources() throws Exception {
326
Path dir = Files.createTempDirectory(USER_DIR, "mods");
327
Path jar = createModularJar(dir.resolve("m.jar"), "m",
328
"LICENSE",
329
"README",
330
"WEB-INF/tags",
331
"p/Type.class",
332
"p/resources/m.properties",
333
"q-/Type.class", // not a legal package name
334
"q-/resources/m/properties");
335
336
ModuleFinder finder = ModuleFinder.of(jar);
337
Optional<ModuleReference> mref = finder.find("m");
338
assertTrue(mref.isPresent(), "m1 not found");
339
340
ModuleDescriptor descriptor = mref.get().descriptor();
341
342
assertTrue(descriptor.packages().size() == 2);
343
assertTrue(descriptor.packages().contains("p"));
344
assertTrue(descriptor.packages().contains("p.resources"));
345
}
346
347
348
/**
349
* Test ModuleFinder with an exploded module containing a mix of class
350
* and non-class resources
351
*/
352
public void testOfOneExplodedModuleWithResources() throws Exception {
353
Path dir = Files.createTempDirectory(USER_DIR, "mods");
354
Path m_dir = createExplodedModule(dir.resolve("m"), "m",
355
"LICENSE",
356
"README",
357
"WEB-INF/tags",
358
"p/Type.class",
359
"p/resources/m.properties",
360
"q-/Type.class", // not a legal package name
361
"q-/resources/m/properties");
362
363
ModuleFinder finder = ModuleFinder.of(m_dir);
364
Optional<ModuleReference> mref = finder.find("m");
365
assertTrue(mref.isPresent(), "m not found");
366
367
ModuleDescriptor descriptor = mref.get().descriptor();
368
369
assertTrue(descriptor.packages().size() == 2);
370
assertTrue(descriptor.packages().contains("p"));
371
assertTrue(descriptor.packages().contains("p.resources"));
372
}
373
374
375
/**
376
* Test ModuleFinder with a JAR file containing a .class file in the top
377
* level directory.
378
*/
379
public void testOfOneJarFileWithTopLevelClass() throws Exception {
380
Path dir = Files.createTempDirectory(USER_DIR, "mods");
381
Path jar = createModularJar(dir.resolve("m.jar"), "m", "Mojo.class");
382
383
ModuleFinder finder = ModuleFinder.of(jar);
384
try {
385
finder.find("m");
386
assertTrue(false);
387
} catch (FindException e) {
388
assertTrue(e.getCause() instanceof InvalidModuleDescriptorException);
389
assertTrue(e.getCause().getMessage().contains("Mojo.class"));
390
}
391
392
finder = ModuleFinder.of(jar);
393
try {
394
finder.findAll();
395
assertTrue(false);
396
} catch (FindException e) {
397
assertTrue(e.getCause() instanceof InvalidModuleDescriptorException);
398
assertTrue(e.getCause().getMessage().contains("Mojo.class"));
399
}
400
}
401
402
/**
403
* Test ModuleFinder with a JAR file containing a .class file in the top
404
* level directory.
405
*/
406
public void testOfOneExplodedModuleWithTopLevelClass() throws Exception {
407
Path dir = Files.createTempDirectory(USER_DIR, "mods");
408
Path m_dir = createExplodedModule(dir.resolve("m"), "m", "Mojo.class");
409
410
ModuleFinder finder = ModuleFinder.of(m_dir);
411
try {
412
finder.find("m");
413
assertTrue(false);
414
} catch (FindException e) {
415
assertTrue(e.getCause() instanceof InvalidModuleDescriptorException);
416
assertTrue(e.getCause().getMessage().contains("Mojo.class"));
417
}
418
419
finder = ModuleFinder.of(m_dir);
420
try {
421
finder.findAll();
422
assertTrue(false);
423
} catch (FindException e) {
424
assertTrue(e.getCause() instanceof InvalidModuleDescriptorException);
425
assertTrue(e.getCause().getMessage().contains("Mojo.class"));
426
}
427
}
428
429
430
/**
431
* Test ModuleFinder.of with a path to a file that does not exist.
432
*/
433
public void testOfWithDoesNotExistEntry() throws Exception {
434
Path dir1 = Files.createTempDirectory(USER_DIR, "mods1");
435
436
Path dir2 = Files.createTempDirectory(USER_DIR, "mods2");
437
createModularJar(dir2.resolve("m2.jar"), "[email protected]");
438
439
Files.delete(dir1);
440
441
ModuleFinder finder = ModuleFinder.of(dir1, dir2);
442
443
assertTrue(finder.find("m2").isPresent());
444
assertTrue(finder.findAll().size() == 1);
445
assertFalse(finder.find("java.rhubarb").isPresent());
446
}
447
448
449
/**
450
* Test ModuleFinder.of with a file path to an unrecognized file type.
451
*/
452
public void testOfWithUnrecognizedEntry() throws Exception {
453
Path dir = Files.createTempDirectory(USER_DIR, "mods");
454
Path mod = Files.createTempFile(dir, "m", ".junk");
455
456
ModuleFinder finder = ModuleFinder.of(mod);
457
try {
458
finder.find("java.rhubarb");
459
assertTrue(false);
460
} catch (FindException e) {
461
// expected
462
}
463
464
finder = ModuleFinder.of(mod);
465
try {
466
finder.findAll();
467
assertTrue(false);
468
} catch (FindException e) {
469
// expected
470
}
471
}
472
473
474
/**
475
* Test ModuleFinder.of with a file path to a directory containing a file
476
* that will not be recognized as a module.
477
*/
478
public void testOfWithUnrecognizedEntryInDirectory1() throws Exception {
479
Path dir = Files.createTempDirectory(USER_DIR, "mods");
480
Files.createTempFile(dir, "m", ".junk");
481
482
ModuleFinder finder = ModuleFinder.of(dir);
483
assertFalse(finder.find("java.rhubarb").isPresent());
484
485
finder = ModuleFinder.of(dir);
486
assertTrue(finder.findAll().isEmpty());
487
}
488
489
490
/**
491
* Test ModuleFinder.of with a file path to a directory containing a file
492
* that will not be recognized as a module.
493
*/
494
public void testOfWithUnrecognizedEntryInDirectory2() throws Exception {
495
Path dir = Files.createTempDirectory(USER_DIR, "mods");
496
createModularJar(dir.resolve("m1.jar"), "m1");
497
Files.createTempFile(dir, "m2", ".junk");
498
499
ModuleFinder finder = ModuleFinder.of(dir);
500
assertTrue(finder.find("m1").isPresent());
501
assertFalse(finder.find("m2").isPresent());
502
503
finder = ModuleFinder.of(dir);
504
assertTrue(finder.findAll().size() == 1);
505
}
506
507
508
/**
509
* Test ModuleFinder.of with a directory that contains two
510
* versions of the same module
511
*/
512
public void testOfDuplicateModulesInDirectory() throws Exception {
513
Path dir = Files.createTempDirectory(USER_DIR, "mods");
514
createModularJar(dir.resolve("[email protected]"), "m1");
515
createModularJar(dir.resolve("[email protected]"), "m1");
516
517
ModuleFinder finder = ModuleFinder.of(dir);
518
try {
519
finder.find("m1");
520
assertTrue(false);
521
} catch (FindException expected) { }
522
523
finder = ModuleFinder.of(dir);
524
try {
525
finder.findAll();
526
assertTrue(false);
527
} catch (FindException expected) { }
528
}
529
530
531
/**
532
* Test ModuleFinder.of with a directory containing hidden files
533
*/
534
public void testOfWithHiddenFiles() throws Exception {
535
Path dir = Files.createTempDirectory(USER_DIR, "mods");
536
createExplodedModule(dir.resolve("m"), "m",
537
"com/.ignore",
538
"com/foo/.ignore",
539
"com/foo/foo.properties");
540
541
ModuleFinder finder = ModuleFinder.of(dir);
542
ModuleReference mref = finder.find("m").orElse(null);
543
assertNotNull(mref);
544
545
Set<String> expectedPackages;
546
if (System.getProperty("os.name").startsWith("Windows")) {
547
expectedPackages = Set.of("com", "com.foo");
548
} else {
549
expectedPackages = Set.of("com.foo");
550
}
551
assertEquals(mref.descriptor().packages(), expectedPackages);
552
}
553
554
555
/**
556
* Test ModuleFinder.of with a truncated module-info.class
557
*/
558
public void testOfWithTruncatedModuleInfo() throws Exception {
559
Path dir = Files.createTempDirectory(USER_DIR, "mods");
560
561
// create an empty <dir>/rhubarb/module-info.class
562
Path subdir = Files.createDirectory(dir.resolve("rhubarb"));
563
Files.createFile(subdir.resolve("module-info.class"));
564
565
ModuleFinder finder = ModuleFinder.of(dir);
566
try {
567
finder.find("rhubarb");
568
assertTrue(false);
569
} catch (FindException e) {
570
assertTrue(e.getCause() instanceof InvalidModuleDescriptorException);
571
}
572
573
finder = ModuleFinder.of(dir);
574
try {
575
finder.findAll();
576
assertTrue(false);
577
} catch (FindException e) {
578
assertTrue(e.getCause() instanceof InvalidModuleDescriptorException);
579
}
580
}
581
582
583
/**
584
* Test ModuleFinder.compose with no module finders
585
*/
586
public void testComposeOfNone() throws Exception {
587
ModuleFinder finder = ModuleFinder.of();
588
assertTrue(finder.findAll().isEmpty());
589
assertFalse(finder.find("java.rhubarb").isPresent());
590
}
591
592
593
/**
594
* Test ModuleFinder.compose with one module finder
595
*/
596
public void testComposeOfOne() throws Exception {
597
Path dir = Files.createTempDirectory(USER_DIR, "mods");
598
createModularJar(dir.resolve("m1.jar"), "m1");
599
createModularJar(dir.resolve("m2.jar"), "m2");
600
601
ModuleFinder finder1 = ModuleFinder.of(dir);
602
603
ModuleFinder finder = ModuleFinder.compose(finder1);
604
assertTrue(finder.findAll().size() == 2);
605
assertTrue(finder.find("m1").isPresent());
606
assertTrue(finder.find("m2").isPresent());
607
assertFalse(finder.find("java.rhubarb").isPresent());
608
}
609
610
611
/**
612
* Test ModuleFinder.compose with two module finders
613
*/
614
public void testComposeOfTwo() throws Exception {
615
Path dir1 = Files.createTempDirectory(USER_DIR, "mods1");
616
createModularJar(dir1.resolve("m1.jar"), "[email protected]");
617
createModularJar(dir1.resolve("m2.jar"), "[email protected]");
618
619
Path dir2 = Files.createTempDirectory(USER_DIR, "mods2");
620
createModularJar(dir2.resolve("m1.jar"), "[email protected]");
621
createModularJar(dir2.resolve("m2.jar"), "[email protected]");
622
createModularJar(dir2.resolve("m3.jar"), "m3");
623
createModularJar(dir2.resolve("m4.jar"), "m4");
624
625
ModuleFinder finder1 = ModuleFinder.of(dir1);
626
ModuleFinder finder2 = ModuleFinder.of(dir2);
627
628
ModuleFinder finder = ModuleFinder.compose(finder1, finder2);
629
assertTrue(finder.findAll().size() == 4);
630
assertTrue(finder.find("m1").isPresent());
631
assertTrue(finder.find("m2").isPresent());
632
assertTrue(finder.find("m3").isPresent());
633
assertTrue(finder.find("m4").isPresent());
634
assertFalse(finder.find("java.rhubarb").isPresent());
635
636
// check that [email protected] is found
637
ModuleDescriptor m1 = finder.find("m1").get().descriptor();
638
assertEquals(m1.version().get().toString(), "1.0");
639
640
// check that [email protected] is found
641
ModuleDescriptor m2 = finder.find("m2").get().descriptor();
642
assertEquals(m2.version().get().toString(), "1.0");
643
}
644
645
646
/**
647
* Test ModuleFinder.compose with three module finders
648
*/
649
public void testComposeOfThree() throws Exception {
650
Path dir1 = Files.createTempDirectory(USER_DIR, "mods1");
651
createModularJar(dir1.resolve("m1.jar"), "[email protected]");
652
createModularJar(dir1.resolve("m2.jar"), "[email protected]");
653
654
Path dir2 = Files.createTempDirectory(USER_DIR, "mods2");
655
createModularJar(dir2.resolve("m1.jar"), "[email protected]");
656
createModularJar(dir2.resolve("m2.jar"), "[email protected]");
657
createModularJar(dir2.resolve("m3.jar"), "[email protected]");
658
createModularJar(dir2.resolve("m4.jar"), "[email protected]");
659
660
Path dir3 = Files.createTempDirectory(USER_DIR, "mods3");
661
createModularJar(dir3.resolve("m3.jar"), "[email protected]");
662
createModularJar(dir3.resolve("m4.jar"), "[email protected]");
663
createModularJar(dir3.resolve("m5.jar"), "m5");
664
createModularJar(dir3.resolve("m6.jar"), "m6");
665
666
ModuleFinder finder1 = ModuleFinder.of(dir1);
667
ModuleFinder finder2 = ModuleFinder.of(dir2);
668
ModuleFinder finder3 = ModuleFinder.of(dir3);
669
670
ModuleFinder finder = ModuleFinder.compose(finder1, finder2, finder3);
671
assertTrue(finder.findAll().size() == 6);
672
assertTrue(finder.find("m1").isPresent());
673
assertTrue(finder.find("m2").isPresent());
674
assertTrue(finder.find("m3").isPresent());
675
assertTrue(finder.find("m4").isPresent());
676
assertTrue(finder.find("m5").isPresent());
677
assertTrue(finder.find("m6").isPresent());
678
assertFalse(finder.find("java.rhubarb").isPresent());
679
680
// check that [email protected] is found
681
ModuleDescriptor m1 = finder.find("m1").get().descriptor();
682
assertEquals(m1.version().get().toString(), "1.0");
683
684
// check that [email protected] is found
685
ModuleDescriptor m2 = finder.find("m2").get().descriptor();
686
assertEquals(m2.version().get().toString(), "1.0");
687
688
// check that [email protected] is found
689
ModuleDescriptor m3 = finder.find("m3").get().descriptor();
690
assertEquals(m3.version().get().toString(), "2.0");
691
692
// check that [email protected] is found
693
ModuleDescriptor m4 = finder.find("m4").get().descriptor();
694
assertEquals(m4.version().get().toString(), "2.0");
695
}
696
697
698
/**
699
* Test null handling
700
*/
701
public void testNulls() {
702
703
// ofSystem
704
try {
705
ModuleFinder.ofSystem().find(null);
706
assertTrue(false);
707
} catch (NullPointerException expected) { }
708
709
// of
710
Path dir = Paths.get("d");
711
try {
712
ModuleFinder.of().find(null);
713
assertTrue(false);
714
} catch (NullPointerException expected) { }
715
try {
716
ModuleFinder.of((Path)null);
717
assertTrue(false);
718
} catch (NullPointerException expected) { }
719
try {
720
ModuleFinder.of((Path[])null);
721
assertTrue(false);
722
} catch (NullPointerException expected) { }
723
try {
724
ModuleFinder.of(dir, null);
725
assertTrue(false);
726
} catch (NullPointerException expected) { }
727
try {
728
ModuleFinder.of(null, dir);
729
assertTrue(false);
730
} catch (NullPointerException expected) { }
731
732
// compose
733
ModuleFinder finder = ModuleFinder.of();
734
try {
735
ModuleFinder.compose((ModuleFinder)null);
736
assertTrue(false);
737
} catch (NullPointerException expected) { }
738
try {
739
ModuleFinder.compose((ModuleFinder[])null);
740
assertTrue(false);
741
} catch (NullPointerException expected) { }
742
try {
743
ModuleFinder.compose(finder, null);
744
assertTrue(false);
745
} catch (NullPointerException expected) { }
746
try {
747
ModuleFinder.compose(null, finder);
748
assertTrue(false);
749
} catch (NullPointerException expected) { }
750
751
}
752
753
754
/**
755
* Parses a string of the form {@code name[@version]} and returns a
756
* ModuleDescriptor with that name and version. The ModuleDescriptor
757
* will have a requires on java.base.
758
*/
759
static ModuleDescriptor newModuleDescriptor(String mid) {
760
String mn;
761
String vs;
762
int i = mid.indexOf("@");
763
if (i == -1) {
764
mn = mid;
765
vs = null;
766
} else {
767
mn = mid.substring(0, i);
768
vs = mid.substring(i+1);
769
}
770
ModuleDescriptor.Builder builder
771
= ModuleDescriptor.newModule(mn).requires("java.base");
772
if (vs != null)
773
builder.version(vs);
774
return builder.build();
775
}
776
777
/**
778
* Creates an exploded module in the given directory and containing a
779
* module descriptor with the given module name/version.
780
*/
781
static Path createExplodedModule(Path dir, String mid, String... entries)
782
throws Exception
783
{
784
ModuleDescriptor descriptor = newModuleDescriptor(mid);
785
Files.createDirectories(dir);
786
Path mi = dir.resolve("module-info.class");
787
try (OutputStream out = Files.newOutputStream(mi)) {
788
ModuleInfoWriter.write(descriptor, out);
789
}
790
791
for (String entry : entries) {
792
Path file = dir.resolve(entry.replace('/', File.separatorChar));
793
Files.createDirectories(file.getParent());
794
Files.createFile(file);
795
}
796
797
return dir;
798
}
799
800
/**
801
* Creates a JAR file with the given file path and containing a module
802
* descriptor with the given module name/version.
803
*/
804
static Path createModularJar(Path file, String mid, String ... entries)
805
throws Exception
806
{
807
ModuleDescriptor descriptor = newModuleDescriptor(mid);
808
try (OutputStream out = Files.newOutputStream(file)) {
809
try (JarOutputStream jos = new JarOutputStream(out)) {
810
811
JarEntry je = new JarEntry("module-info.class");
812
jos.putNextEntry(je);
813
ModuleInfoWriter.write(descriptor, jos);
814
jos.closeEntry();
815
816
for (String entry : entries) {
817
je = new JarEntry(entry);
818
jos.putNextEntry(je);
819
jos.closeEntry();
820
}
821
}
822
823
}
824
return file;
825
}
826
827
}
828
829
830