JVMDefineModule.java revision 12290:8953c0318163
1219820Sjeff/*
2219820Sjeff * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3219820Sjeff * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4219820Sjeff *
5219820Sjeff * This code is free software; you can redistribute it and/or modify it
6219820Sjeff * under the terms of the GNU General Public License version 2 only, as
7219820Sjeff * published by the Free Software Foundation.
8219820Sjeff *
9219820Sjeff * This code is distributed in the hope that it will be useful, but WITHOUT
10219820Sjeff * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11219820Sjeff * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12219820Sjeff * version 2 for more details (a copy is included in the LICENSE file that
13219820Sjeff * accompanied this code).
14219820Sjeff *
15219820Sjeff * You should have received a copy of the GNU General Public License version
16219820Sjeff * 2 along with this work; if not, write to the Free Software Foundation,
17219820Sjeff * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18219820Sjeff *
19219820Sjeff * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20219820Sjeff * or visit www.oracle.com if you need additional information or have any
21219820Sjeff * questions.
22219820Sjeff */
23219820Sjeff
24219820Sjeff/*
25219820Sjeff * @test
26219820Sjeff * @modules java.base/jdk.internal.misc
27219820Sjeff * @library /test/lib ..
28219820Sjeff * @build sun.hotspot.WhiteBox
29219820Sjeff * @compile/module=java.base java/lang/reflect/ModuleHelper.java
30219820Sjeff * @run main ClassFileInstaller sun.hotspot.WhiteBox
31219820Sjeff *                              sun.hotspot.WhiteBox$WhiteBoxPermission
32219820Sjeff * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI JVMDefineModule
33219820Sjeff */
34219820Sjeff
35219820Sjeffimport static jdk.test.lib.Asserts.*;
36219820Sjeffimport java.sql.Time;
37219820Sjeff
38219820Sjeffpublic class JVMDefineModule {
39219820Sjeff
40219820Sjeff    public static void main(String args[]) throws Throwable {
41219820Sjeff        MyClassLoader cl = new MyClassLoader();
42219820Sjeff        Object m;
43219820Sjeff
44219820Sjeff        // NULL classloader argument, expect success
45219820Sjeff        m = ModuleHelper.ModuleObject("mymodule", null, new String[] { "mypackage" });
46219820Sjeff        assertNotNull(m, "Module should not be null");
47219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "mymodule/here", new String[] { "mypackage" });
48219820Sjeff
49219820Sjeff/* Invalid test, won't compile.
50219820Sjeff        // Invalid classloader argument, expect an IAE
51219820Sjeff        try {
52219820Sjeff            m = ModuleHelper.ModuleObject("mymodule1", new Object(), new String[] { "mypackage1" });
53219820Sjeff            ModuleHelper.DefineModule(m,  "9.0", "mymodule/here", new String[] { "mypackage1" });
54219820Sjeff            throw new RuntimeException("Failed to get expected IAE for bad loader");
55219820Sjeff        } catch(IllegalArgumentException e) {
56219820Sjeff            // Expected
57219820Sjeff        }
58219820Sjeff*/
59219820Sjeff
60219820Sjeff        // NULL package argument, should not throw an exception
61219820Sjeff        m = ModuleHelper.ModuleObject("mymodule2", cl, new String[] { "nullpkg" });
62219820Sjeff        assertNotNull(m, "Module should not be null");
63219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "mymodule2/here", null);
64219820Sjeff
65219820Sjeff        // Null module argument, expect an NPE
66219820Sjeff        try {
67219820Sjeff            ModuleHelper.DefineModule(null,  "9.0", "mymodule/here", new String[] { "mypackage1" });
68219820Sjeff            throw new RuntimeException("Failed to get expected NPE for null module");
69219820Sjeff        } catch(NullPointerException e) {
70219820Sjeff            if (!e.getMessage().contains("Null module object")) {
71219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for null module: " + e.getMessage());
72219820Sjeff            }
73219820Sjeff            // Expected
74219820Sjeff        }
75219820Sjeff
76219820Sjeff        // Invalid module argument, expect an IAE
77219820Sjeff        try {
78219820Sjeff            ModuleHelper.DefineModule(new Object(),  "9.0", "mymodule/here", new String[] { "mypackage1" });
79219820Sjeff            throw new RuntimeException("Failed to get expected IAE or NPE for bad module");
80219820Sjeff        } catch(IllegalArgumentException e) {
81219820Sjeff            if (!e.getMessage().contains("module is not an instance of type java.lang.reflect.Module")) {
82219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for bad module: " + e.getMessage());
83219820Sjeff            }
84219820Sjeff        }
85219820Sjeff
86219820Sjeff        // NULL module name, expect an IAE or NPE
87219820Sjeff        try {
88219820Sjeff            m = ModuleHelper.ModuleObject(null, cl, new String[] { "mypackage2" });
89219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "mymodule/here", new String[] { "mypackage2" });
90219820Sjeff            throw new RuntimeException("Failed to get expected NPE for NULL module");
91219820Sjeff        } catch(IllegalArgumentException e) {
92219820Sjeff            // Expected
93219820Sjeff        } catch(NullPointerException e) {
94219820Sjeff            // Expected
95219820Sjeff        }
96219820Sjeff
97219820Sjeff        // module name is java.base, expect an IAE
98219820Sjeff        m = ModuleHelper.ModuleObject("java.base", cl, new String[] { "mypackage3" });
99219820Sjeff        try {
100219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "mymodule/here", new String[] { "mypackage3" });
101219820Sjeff            throw new RuntimeException("Failed to get expected IAE for java.base, not defined with boot class loader");
102219820Sjeff        } catch(IllegalArgumentException e) {
103219820Sjeff            if (!e.getMessage().contains("Class loader must be the boot class loader")) {
104219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for java.base: " + e.getMessage());
105219820Sjeff            }
106219820Sjeff        }
107219820Sjeff
108219820Sjeff        // Duplicates in package list, expect an IAE
109219820Sjeff        m = ModuleHelper.ModuleObject("module.x", cl, new String[] { "mypackage4", "mypackage5" });
110219820Sjeff        try {
111219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "mymodule/here", new String[] { "mypackage4", "mypackage5", "mypackage4" });
112219820Sjeff            throw new RuntimeException("Failed to get IAE for duplicate packages");
113219820Sjeff        } catch(IllegalArgumentException e) {
114219820Sjeff            if (!e.getMessage().contains("Duplicate package name")) {
115219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for duplicate package: " + e.getMessage());
116219820Sjeff            }
117219820Sjeff        }
118219820Sjeff
119219820Sjeff        // Empty entry in package list, expect an IAE
120219820Sjeff        m = ModuleHelper.ModuleObject("module.y", cl, new String[] { "mypackageX", "mypackageY" });
121219820Sjeff        try {
122219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "mymodule/here", new String[] { "mypackageX", "", "mypackageY" });
123219820Sjeff            throw new RuntimeException("Failed to get IAE for empty package");
124219820Sjeff        } catch(IllegalArgumentException e) {
125219820Sjeff            if (!e.getMessage().contains("Invalid package name")) {
126219820Sjeff              throw new RuntimeException("Failed to get expected IAE message empty package entry: " + e.getMessage());
127219820Sjeff            }
128219820Sjeff        }
129219820Sjeff
130219820Sjeff        // Duplicate module name, expect an IAE
131219820Sjeff        m = ModuleHelper.ModuleObject("module.name", cl, new String[] { "mypackage6" });
132219820Sjeff        assertNotNull(m, "Module should not be null");
133219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage6" });
134219820Sjeff        try {
135219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage6a" });
136219820Sjeff            throw new RuntimeException("Failed to get IAE for duplicate module");
137219820Sjeff        } catch(IllegalArgumentException e) {
138219820Sjeff            if (!e.getMessage().contains("Module module.name is already defined")) {
139219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for duplicate module: " + e.getMessage());
140219820Sjeff            }
141219820Sjeff        }
142219820Sjeff
143219820Sjeff        // Package is already defined for class loader, expect an IAE
144219820Sjeff        m = ModuleHelper.ModuleObject("dupl.pkg.module", cl, new String[] { "mypackage6b" });
145219820Sjeff        try {
146219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage6" });
147219820Sjeff            throw new RuntimeException("Failed to get IAE for existing package");
148219820Sjeff        } catch(IllegalArgumentException e) {
149219820Sjeff            if (!e.getMessage().contains("Package mypackage6 for module dupl.pkg.module already exists for class loader")) {
150219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for duplicate package: " + e.getMessage());
151219820Sjeff            }
152219820Sjeff        }
153219820Sjeff
154219820Sjeff        // Empty module name, expect an IAE
155219820Sjeff        try {
156219820Sjeff            m = ModuleHelper.ModuleObject("", cl, new String[] { "mypackage8" });
157219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage8" });
158219820Sjeff            throw new RuntimeException("Failed to get expected IAE for empty module name");
159219820Sjeff        } catch(IllegalArgumentException e) {
160219820Sjeff            // Expected
161219820Sjeff        }
162219820Sjeff
163219820Sjeff        // Bad module name, expect an IAE
164219820Sjeff        try {
165219820Sjeff            m = ModuleHelper.ModuleObject("bad;name", cl, new String[] { "mypackage9" });
166219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage9" });
167219820Sjeff            throw new RuntimeException("Failed to get expected IAE for bad;name");
168219820Sjeff        } catch(IllegalArgumentException e) {
169219820Sjeff            // Expected
170219820Sjeff        }
171219820Sjeff
172219820Sjeff        // Bad module name, expect an IAE
173219820Sjeff        try {
174219820Sjeff            m = ModuleHelper.ModuleObject(".leadingdot", cl, new String[] { "mypackage9a" });
175219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage9a" });
176219820Sjeff            throw new RuntimeException("Failed to get expected IAE for .leadingdot");
177219820Sjeff        } catch(IllegalArgumentException e) {
178219820Sjeff            // Expected
179219820Sjeff        }
180219820Sjeff
181219820Sjeff        // Bad module name, expect an IAE
182219820Sjeff        try {
183219820Sjeff            m = ModuleHelper.ModuleObject("trailingdot.", cl, new String[] { "mypackage9b" });
184219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage9b" });
185219820Sjeff            throw new RuntimeException("Failed to get expected IAE for trailingdot.");
186219820Sjeff        } catch(IllegalArgumentException e) {
187219820Sjeff            // Expected
188219820Sjeff        }
189219820Sjeff
190219820Sjeff        // Bad module name, expect an IAE
191219820Sjeff        m = ModuleHelper.ModuleObject("consecutive..dots", cl, new String[] { "mypackage9c" });
192219820Sjeff        try {
193219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage9c" });
194219820Sjeff            throw new RuntimeException("Failed to get expected IAE for consecutive..dots");
195219820Sjeff        } catch(IllegalArgumentException e) {
196219820Sjeff            // Expected
197219820Sjeff        }
198219820Sjeff
199219820Sjeff        // module name with multiple dots, should be okay
200219820Sjeff        m = ModuleHelper.ModuleObject("more.than.one.dat", cl, new String[] { "mypackage9d" });
201219820Sjeff        assertNotNull(m, "Module should not be null");
202219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "mypackage9d" });
203219820Sjeff
204219820Sjeff        // Zero length package list, should be okay
205219820Sjeff        m = ModuleHelper.ModuleObject("zero.packages", cl, new String[] { });
206219820Sjeff        assertNotNull(m, "Module should not be null");
207219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { });
208219820Sjeff
209219820Sjeff        // Invalid package name, expect an IAE
210219820Sjeff        m = ModuleHelper.ModuleObject("module5", cl, new String[] { "your.package" });
211219820Sjeff        try {
212219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "your.package" });
213219820Sjeff            throw new RuntimeException("Failed to get expected IAE for your.package");
214219820Sjeff        } catch(IllegalArgumentException e) {
215219820Sjeff            if (!e.getMessage().contains("Invalid package name")) {
216219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for bad package name: " + e.getMessage());
217219820Sjeff            }
218219820Sjeff        }
219219820Sjeff
220219820Sjeff        // Invalid package name, expect an IAE
221219820Sjeff        m = ModuleHelper.ModuleObject("module6", cl, new String[] { "foo" }); // Name irrelevant
222219820Sjeff        try {
223219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { ";your/package" });
224219820Sjeff            throw new RuntimeException("Failed to get expected IAE for ;your.package");
225219820Sjeff        } catch(IllegalArgumentException e) {
226219820Sjeff            if (!e.getMessage().contains("Invalid package name")) {
227219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for bad package name: " + e.getMessage());
228219820Sjeff            }
229219820Sjeff        }
230219820Sjeff
231219820Sjeff        // Invalid package name, expect an IAE
232219820Sjeff        m = ModuleHelper.ModuleObject("module7", cl, new String[] { "foo" }); // Name irrelevant
233219820Sjeff        try {
234219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "module.name/here", new String[] { "7[743" });
235219820Sjeff            throw new RuntimeException("Failed to get expected IAE for package 7[743");
236219820Sjeff        } catch(IllegalArgumentException e) {
237219820Sjeff            if (!e.getMessage().contains("Invalid package name")) {
238219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for bad package name: " + e.getMessage());
239219820Sjeff            }
240219820Sjeff        }
241219820Sjeff
242219820Sjeff        // Package named "java" defined to a class loader other than the boot or platform class loader, expect an IAE
243219820Sjeff        m = ModuleHelper.ModuleObject("modulejavapkg1", cl, new String[] { "java/foo" });
244219820Sjeff        try {
245219820Sjeff            // module m is defined to an instance of MyClassLoader class loader
246219820Sjeff            ModuleHelper.DefineModule(m, "9.0", "modulejavapkg1", new String[] { "java/foo" });
247219820Sjeff            throw new RuntimeException("Failed to get expected IAE for package java/foo");
248219820Sjeff        } catch(IllegalArgumentException e) {
249219820Sjeff            if (!e.getMessage().contains("prohibited package name")) {
250219820Sjeff              throw new RuntimeException("Failed to get expected IAE message for prohibited package name: " + e.getMessage());
251219820Sjeff            }
252219820Sjeff        }
253219820Sjeff
254219820Sjeff        // Package named "javabar" defined to a class loader other than the boot or platform class loader, should be ok
255219820Sjeff        m = ModuleHelper.ModuleObject("modulejavapkg2", cl, new String[] { "javabar" });
256219820Sjeff        assertNotNull(m, "Module should not be null");
257219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "modulejavapkg2", new String[] { "javabar" });
258219820Sjeff
259219820Sjeff        // Package named "java" defined to the boot class loader, should be ok
260219820Sjeff        //   m's type is a java.lang.Object, module is java.base
261219820Sjeff        //   java.base module is defined to the boot loader
262219820Sjeff        ClassLoader boot_loader = m.getClass().getClassLoader();
263219820Sjeff        m = ModuleHelper.ModuleObject("modulejavapkg3", boot_loader, new String[] { "java/foo" });
264219820Sjeff        assertNotNull(m, "Module should not be null");
265219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "modulejavapkg3", new String[] { "java/foo" });
266219820Sjeff
267219820Sjeff        // Package named "java" defined to the platform class loader, should be ok
268219820Sjeff        //   java.sql module defined to the platform class loader.
269219820Sjeff        java.sql.Time jst = new java.sql.Time(45 * 1000);
270219820Sjeff        ClassLoader platform_loader = jst.getClass().getClassLoader();
271219820Sjeff        m = ModuleHelper.ModuleObject("modulejavapkg4", platform_loader, new String[] { "java/foo" });
272219820Sjeff        assertNotNull(m, "Module should not be null");
273219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "modulejavapkg4", new String[] { "java/foo" });
274219820Sjeff
275219820Sjeff        // module version that is null, should be okay
276219820Sjeff        m = ModuleHelper.ModuleObject("module8", cl, new String[] { "a_package_8" });
277219820Sjeff        assertNotNull(m, "Module should not be null");
278219820Sjeff        ModuleHelper.DefineModule(m, null, "module8/here", new String[] { "a_package_8" });
279219820Sjeff
280219820Sjeff        // module version that is "", should be okay
281219820Sjeff        m = ModuleHelper.ModuleObject("module9", cl, new String[] { "a_package_9" });
282219820Sjeff        assertNotNull(m, "Module should not be null");
283219820Sjeff        ModuleHelper.DefineModule(m, "", "module9/here", new String[] { "a_package_9" });
284219820Sjeff
285219820Sjeff        // module location that is null, should be okay
286219820Sjeff        m = ModuleHelper.ModuleObject("module10", cl, new String[] { "a_package_10" });
287219820Sjeff        assertNotNull(m, "Module should not be null");
288219820Sjeff        ModuleHelper.DefineModule(m, "9.0", null, new String[] { "a_package_10" });
289219820Sjeff
290219820Sjeff        // module location that is "", should be okay
291219820Sjeff        m = ModuleHelper.ModuleObject("module11", cl, new String[] { "a_package_11" });
292219820Sjeff        assertNotNull(m, "Module should not be null");
293219820Sjeff        ModuleHelper.DefineModule(m, "9.0", "", new String[] { "a_package_11" });
294219820Sjeff    }
295219820Sjeff
296219820Sjeff    static class MyClassLoader extends ClassLoader { }
297219820Sjeff}
298219820Sjeff