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 * @summary Verify the defining class loader of each module never delegates
27 * to its child class loader. Also sanity check java.compact2
28 * requires.
29 * @modules java.compact2
30 * @run testng/othervm --add-modules=ALL-SYSTEM VerifyModuleDelegation
31 */
32
33 import java.lang.module.ModuleDescriptor;
34 import java.lang.module.ModuleFinder;
35 import java.lang.module.ModuleReference;
36 import java.lang.reflect.Layer;
37 import java.lang.reflect.Module;
38 import java.util.Set;
39 import static java.util.stream.Collectors.toSet;
40
41 import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;
42
43 import org.testng.annotations.*;
44
45 import static org.testng.Assert.*;
46
47 public class VerifyModuleDelegation {
48 private static final String JAVA_BASE = "java.base";
49 private static final String JAVA_COMPACT1 = "java.compact1";
50 private static final String JAVA_COMPACT2 = "java.compact2";
51
52 private static final ModuleDescriptor BASE
53 = ModuleDescriptor.module(JAVA_BASE).build();
54
55 private static final ModuleDescriptor COMPACT2
56 = ModuleDescriptor.module(JAVA_COMPACT2)
57 .requires(Set.of(MANDATED), JAVA_BASE)
58 .requires(Set.of(TRANSITIVE), JAVA_COMPACT1)
59 .requires(Set.of(TRANSITIVE), "java.rmi")
60 .requires(Set.of(TRANSITIVE), "java.sql")
61 .requires(Set.of(TRANSITIVE), "java.xml")
62 .build();
63
64 private static final Set<ModuleDescriptor> MREFS
65 = Layer.boot().modules().stream().map(Module::getDescriptor)
66 .collect(toSet());
67
68 private void check(ModuleDescriptor md, ModuleDescriptor ref) {
69 assertTrue(md.requires().size() == ref.requires().size());
70 assertTrue(md.requires().containsAll(ref.requires()));
71 }
72
73 @Test
74 public void checkJavaBase() {
75 ModuleDescriptor md =
76 MREFS.stream()
77 .filter(d -> d.name().equals(JAVA_BASE))
78 .findFirst().orElseThrow(Error::new);
79
80 check(md, BASE);
81 }
82 @Test
83 public void checkCompact2() {
84 ModuleDescriptor md =
85 MREFS.stream()
86 .filter(d -> d.name().equals(JAVA_COMPACT2))
87 .findFirst().orElseThrow(Error::new);
88 check(md, COMPACT2);
89 }
90
91 @Test
92 public void checkLoaderDelegation() {
93 Layer boot = Layer.boot();
94 MREFS.stream()
95 .forEach(md -> md.requires().stream().forEach(req ->
96 {
97 // check if M requires D and D's loader must be either the
98 // same or an ancestor of M's loader
99 ClassLoader loader1 = boot.findLoader(md.name());
100 ClassLoader loader2 = boot.findLoader(req.name());
101 if (loader1 != loader2 && !isAncestor(loader2, loader1)) {
102 throw new Error(md.name() + " can't delegate to " +
103 "find classes from " + req.name());
104 }
105 }));
106 }
107
108 // Returns true if p is an ancestor of cl i.e. class loader 'p' can
109 // be found in the cl's delegation chain
|
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 * @summary Verify the defining class loader of each module never delegates
27 * to its child class loader.
28 * @run testng/othervm --add-modules=ALL-SYSTEM VerifyModuleDelegation
29 */
30
31 import java.lang.module.ModuleDescriptor;
32 import java.lang.module.ModuleFinder;
33 import java.lang.module.ModuleReference;
34 import java.lang.reflect.Layer;
35 import java.lang.reflect.Module;
36 import java.util.Set;
37 import static java.util.stream.Collectors.toSet;
38
39 import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;
40
41 import org.testng.annotations.*;
42
43 import static org.testng.Assert.*;
44
45 public class VerifyModuleDelegation {
46 private static final String JAVA_BASE = "java.base";
47
48 private static final ModuleDescriptor BASE
49 = ModuleDescriptor.module(JAVA_BASE).build();
50
51 private static final Set<ModuleDescriptor> MREFS
52 = Layer.boot().modules().stream().map(Module::getDescriptor)
53 .collect(toSet());
54
55 private void check(ModuleDescriptor md, ModuleDescriptor ref) {
56 assertTrue(md.requires().size() == ref.requires().size());
57 assertTrue(md.requires().containsAll(ref.requires()));
58 }
59
60 @Test
61 public void checkJavaBase() {
62 ModuleDescriptor md =
63 MREFS.stream()
64 .filter(d -> d.name().equals(JAVA_BASE))
65 .findFirst().orElseThrow(Error::new);
66
67 check(md, BASE);
68 }
69
70 @Test
71 public void checkLoaderDelegation() {
72 Layer boot = Layer.boot();
73 MREFS.stream()
74 .forEach(md -> md.requires().stream().forEach(req ->
75 {
76 // check if M requires D and D's loader must be either the
77 // same or an ancestor of M's loader
78 ClassLoader loader1 = boot.findLoader(md.name());
79 ClassLoader loader2 = boot.findLoader(req.name());
80 if (loader1 != loader2 && !isAncestor(loader2, loader1)) {
81 throw new Error(md.name() + " can't delegate to " +
82 "find classes from " + req.name());
83 }
84 }));
85 }
86
87 // Returns true if p is an ancestor of cl i.e. class loader 'p' can
88 // be found in the cl's delegation chain
|