1 /* 2 * Copyright (c) 2014, 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 * @library /lib/testlibrary 27 * @modules jdk.jlink/jdk.tools.jmod 28 * jdk.compiler 29 * @build AddModsTest CompilerUtils jdk.testlibrary.* 30 * @run testng AddModsTest 31 * @summary Basic test for java --add-modules 32 */ 33 34 import java.io.File; 35 import java.nio.file.Path; 36 import java.nio.file.Paths; 37 38 import static jdk.testlibrary.ProcessTools.*; 39 40 import org.testng.annotations.BeforeTest; 41 import org.testng.annotations.Test; 42 import static org.testng.Assert.*; 43 44 45 @Test 46 public class AddModsTest { 47 48 private static final String TEST_SRC = System.getProperty("test.src"); 49 50 private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); 51 private static final Path MODS1_DIR = Paths.get("mods1"); 52 private static final Path MODS2_DIR = Paths.get("mods2"); 53 54 // test module / main class 55 private static final String TEST_MODULE = "test"; 56 private static final String TEST_MAIN_CLASS = "test.Main"; 57 private static final String TEST_MID = TEST_MODULE + "/" + TEST_MAIN_CLASS; 58 59 // logger module 60 private static final String LOGGER_MODULE = "logger"; 61 62 63 @BeforeTest 64 public void compile() throws Exception { 65 // javac -d mods1/test src/test/** 66 boolean compiled = CompilerUtils.compile( 67 SRC_DIR.resolve(TEST_MODULE), 68 MODS1_DIR.resolve(TEST_MODULE) 69 ); 70 assertTrue(compiled, "test did not compile"); 71 72 // javac -d mods1/logger src/logger/** 73 compiled= CompilerUtils.compile( 74 SRC_DIR.resolve(LOGGER_MODULE), 75 MODS2_DIR.resolve(LOGGER_MODULE) 76 ); 77 assertTrue(compiled, "test did not compile"); 78 } 79 80 81 /** 82 * Basic test of --add-modules ALL-DEFAULT. Module java.sql should be 83 * resolved and the types in that module should be visible. 84 */ 85 public void testAddDefaultModules1() throws Exception { 86 87 // java --add-modules ALL-DEFAULT --module-path mods1 -m test ... 88 int exitValue 89 = executeTestJava("--module-path", MODS1_DIR.toString(), 90 "--add-modules", "ALL-DEFAULT", 91 "-m", TEST_MID, 92 "java.sql.Connection") 93 .outputTo(System.out) 94 .errorTo(System.out) 95 .getExitValue(); 96 97 assertTrue(exitValue == 0); 98 } 99 100 /** 101 * Basic test of --add-modules ALL-DEFAULT. Module java.annotations.common 102 * should not resolved and so the types in that module should not be 103 * visible. 104 */ 105 public void testAddDefaultModules2() throws Exception { 106 107 // java --add-modules ALL-DEFAULT --module-path mods1 -m test ... 108 int exitValue 109 = executeTestJava("--module-path", MODS1_DIR.toString(), 110 "--add-modules", "ALL-DEFAULT", 111 "-m", TEST_MID, 112 "javax.annotation.Generated") 113 .outputTo(System.out) 114 .errorTo(System.out) 115 .shouldContain("ClassNotFoundException") 116 .getExitValue(); 117 118 assertTrue(exitValue != 0); 119 } 120 121 /** 122 * Basic test of --add-modules ALL-SYSTEM. All system modules should be resolved 123 * and thus all types in those modules should be visible. 124 */ 125 public void testAddSystemModules() throws Exception { 126 127 // java --add-modules ALL-SYSTEM --module-path mods1 -m test ... 128 int exitValue 129 = executeTestJava("--module-path", MODS1_DIR.toString(), 130 "--add-modules", "ALL-SYSTEM", 131 "-m", TEST_MID, 132 "java.sql.Connection", 133 "javax.annotation.Generated") 134 .outputTo(System.out) 135 .errorTo(System.out) 136 .getExitValue(); 137 138 assertTrue(exitValue == 0); 139 } 140 141 142 /** 143 * Run test on class path to load a type in a module on the application 144 * module path, uses {@code --add-modules logger}. 145 */ 146 public void testRunWithAddMods() throws Exception { 147 148 // java --module-path mods --add-modules logger -cp classes test.Main 149 String classpath = MODS1_DIR.resolve(TEST_MODULE).toString(); 150 String modulepath = MODS2_DIR.toString(); 151 int exitValue 152 = executeTestJava("--module-path", modulepath, 153 "--add-modules", LOGGER_MODULE, 154 "-cp", classpath, 155 TEST_MAIN_CLASS, 156 "logger.Logger") 157 .outputTo(System.out) 158 .errorTo(System.out) 159 .getExitValue(); 160 161 assertTrue(exitValue == 0); 162 } 163 164 /** 165 * Run application on class path that makes use of module on the 166 * application module path. Does not use --add-modules and so should 167 * fail at run-time. 168 */ 169 public void testRunMissingAddMods() throws Exception { 170 171 // java --module-path mods -cp classes test.Main 172 String classpath = MODS1_DIR.resolve(TEST_MODULE).toString(); 173 String modulepath = MODS1_DIR.toString(); 174 int exitValue 175 = executeTestJava("--module-path", modulepath, 176 "-cp", classpath, 177 TEST_MAIN_CLASS, 178 "logger.Logger") 179 .outputTo(System.out) 180 .errorTo(System.out) 181 .shouldContain("ClassNotFoundException") 182 .getExitValue(); 183 184 assertTrue(exitValue != 0); 185 } 186 187 188 /** 189 * Run test on class path to load a type in a module on the application 190 * module path, uses {@code --add-modules ALL-MODULE-PATH}. 191 */ 192 public void testAddAllModulePath() throws Exception { 193 194 // java --module-path mods --add-modules ALL-MODULE-PATH -cp classes test.Main 195 String classpath = MODS1_DIR.resolve(TEST_MODULE).toString(); 196 String modulepath = MODS1_DIR.toString(); 197 int exitValue 198 = executeTestJava("--module-path", modulepath, 199 "--add-modules", "ALL-MODULE-PATH", 200 "-cp", classpath, 201 TEST_MAIN_CLASS) 202 .outputTo(System.out) 203 .errorTo(System.out) 204 .getExitValue(); 205 206 assertTrue(exitValue == 0); 207 } 208 209 210 /** 211 * Test {@code --add-modules ALL-MODULE-PATH} without {@code --module-path}. 212 */ 213 public void testAddAllModulePathWithNoModulePath() throws Exception { 214 215 // java --add-modules ALL-MODULE-PATH -version 216 int exitValue 217 = executeTestJava("--add-modules", "ALL-MODULE-PATH", 218 "-version") 219 .outputTo(System.out) 220 .errorTo(System.out) 221 .getExitValue(); 222 223 assertTrue(exitValue == 0); 224 } 225 226 227 /** 228 * Tests {@code --add-modules} be specified more than once. 229 */ 230 public void testWithMultipleAddModules() throws Exception { 231 232 String modulepath = MODS1_DIR.toString() + File.pathSeparator + 233 MODS2_DIR.toString(); 234 int exitValue 235 = executeTestJava("--module-path", modulepath, 236 "--add-modules", LOGGER_MODULE, 237 "--add-modules", TEST_MODULE, 238 "-m", TEST_MID, 239 "logger.Logger") 240 .outputTo(System.out) 241 .errorTo(System.out) 242 .getExitValue(); 243 244 assertTrue(exitValue == 0); 245 } 246 247 248 /** 249 * Attempt to run with a bad module name specified to --add-modules 250 */ 251 public void testRunWithBadAddMods() throws Exception { 252 253 // java --module-path mods --add-modules DoesNotExist -m test ... 254 int exitValue 255 = executeTestJava("--module-path", MODS1_DIR.toString(), 256 "--add-modules", "DoesNotExist", 257 "-m", TEST_MID) 258 .outputTo(System.out) 259 .errorTo(System.out) 260 .shouldContain("DoesNotExist") 261 .getExitValue(); 262 263 assertTrue(exitValue != 0); 264 } 265 266 }