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