1 /* 2 * Copyright (c) 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 * @bug 8159596 27 * @library /lib/testlibrary 28 * @modules jdk.compiler 29 * jdk.jartool 30 * @build DryRunTest CompilerUtils jdk.testlibrary.ProcessTools 31 * @run testng DryRunTest 32 * @summary Test java --dry-run 33 */ 34 35 import java.io.File; 36 import java.io.IOException; 37 import java.nio.file.Files; 38 import java.nio.file.Path; 39 import java.nio.file.Paths; 40 import java.util.spi.ToolProvider; 41 42 import jdk.testlibrary.ProcessTools; 43 44 import org.testng.annotations.BeforeTest; 45 import org.testng.annotations.Test; 46 import static org.testng.Assert.*; 47 48 49 @Test 50 public class DryRunTest { 51 52 private static final String TEST_SRC = System.getProperty("test.src"); 53 54 private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); 55 private static final Path MODS_DIR = Paths.get("mods"); 56 private static final Path LIBS_DIR = Paths.get("libs"); 57 58 // the module name of the test module 59 private static final String TEST_MODULE = "test"; 60 private static final String M_MODULE = "m"; 61 62 // the module main class 63 private static final String MAIN_CLASS = "jdk.test.Main"; 64 private static final String MAIN_CLINIT_CLASS = "jdk.test.MainWithClinit"; 65 66 67 @BeforeTest 68 public void compileTestModule() throws Exception { 69 70 // javac -d mods/$TESTMODULE src/$TESTMODULE/** 71 assertTrue(CompilerUtils.compile(SRC_DIR.resolve(M_MODULE), 72 MODS_DIR, 73 "--module-source-path", SRC_DIR.toString())); 74 75 assertTrue(CompilerUtils.compile(SRC_DIR.resolve(TEST_MODULE), 76 MODS_DIR, 77 "--module-source-path", SRC_DIR.toString())); 78 79 Files.createDirectories(LIBS_DIR); 80 81 // create JAR files with no module-info.class 82 assertTrue(jar(M_MODULE, "p/Lib.class") == 0); 83 assertTrue(jar(TEST_MODULE, "jdk/test/Main.class") == 0); 84 } 85 86 /** 87 * Execute "java" with the given arguments, returning the exit code. 88 */ 89 private int exec(String... args) throws Exception { 90 return ProcessTools.executeTestJava(args) 91 .outputTo(System.out) 92 .errorTo(System.out) 93 .getExitValue(); 94 } 95 96 97 /** 98 * Launch module main 99 */ 100 public void testModule() throws Exception { 101 String dir = MODS_DIR.toString(); 102 String mid = TEST_MODULE + "/" + MAIN_CLASS; 103 104 // no resolution failure 105 int exitValue = exec("--dry-run", "--module-path", dir, "-m", mid); 106 assertTrue(exitValue == 0); 107 } 108 109 /** 110 * Test dryrun that does not invoke <clinit> of the main class 111 */ 112 public void testMainClinit() throws Exception { 113 String dir = MODS_DIR.toString(); 114 String mid = TEST_MODULE + "/" + MAIN_CLINIT_CLASS; 115 116 int exitValue = exec("--dry-run", "--module-path", dir, "-m", mid); 117 assertTrue(exitValue == 0); 118 119 // expect the test to fail if main class is initialized 120 exitValue = exec("--module-path", dir, "-m", mid); 121 assertTrue(exitValue != 0); 122 } 123 124 /** 125 * Test non-existence module in --add-modules 126 */ 127 public void testNonExistAddModules() throws Exception { 128 String dir = MODS_DIR.toString(); 129 String mid = TEST_MODULE + "/" + MAIN_CLASS; 130 131 int exitValue = exec("--dry-run", "--module-path", dir, 132 "--add-modules", "non.existence", 133 "-m", mid); 134 assertTrue(exitValue != 0); 135 } 136 137 /** 138 * Launch main class from class path 139 */ 140 public void testClassPath() throws Exception { 141 Path testJar = LIBS_DIR.resolve(TEST_MODULE + ".jar"); 142 String libs = testJar.toString() + File.pathSeparator + 143 LIBS_DIR.resolve(M_MODULE + ".jar").toString(); 144 145 // test pass with m.jar:test.jar 146 int exitValue = exec("-classpath", libs, MAIN_CLASS); 147 assertTrue(exitValue == 0); 148 149 // m.jar is not on classpath and fails with p.Lib not found 150 exitValue = exec("-classpath", testJar.toString(), MAIN_CLASS); 151 assertTrue(exitValue != 0); 152 153 // dry pass passes since main is not executed 154 exitValue = exec("--dry-run", "-classpath", testJar.toString(), MAIN_CLASS); 155 assertTrue(exitValue == 0); 156 } 157 158 /** 159 * Test automatic modules 160 */ 161 public void testAutomaticModule() throws Exception { 162 String libs = LIBS_DIR.resolve(M_MODULE + ".jar").toString() + 163 File.pathSeparator + 164 LIBS_DIR.resolve(TEST_MODULE + ".jar").toString(); 165 String mid = TEST_MODULE + "/" + MAIN_CLASS; 166 167 // test main method with and without --add-modules mm 168 int exitValue = exec("--module-path", LIBS_DIR.toString(), 169 "-m", mid); 170 assertTrue(exitValue != 0); 171 172 exitValue = exec("--module-path", LIBS_DIR.toString(), 173 "--add-modules", M_MODULE, 174 "-m", mid); 175 assertTrue(exitValue == 0); 176 177 // test dry run with and without --add-modules m 178 // no resolution failure 179 exitValue = exec("--dry-run", "--module-path", LIBS_DIR.toString(), 180 "-m", mid); 181 assertTrue(exitValue == 0); 182 183 exitValue = exec("--dry-run", "--module-path", LIBS_DIR.toString(), 184 "--add-modules", M_MODULE, 185 "-m", mid); 186 assertTrue(exitValue == 0); 187 } 188 189 /** 190 * module m not found 191 */ 192 public void testMissingModule() throws Exception { 193 String subdir = MODS_DIR.resolve(TEST_MODULE).toString(); 194 String mid = TEST_MODULE + "/" + MAIN_CLASS; 195 196 // resolution failure 197 int exitValue = exec("--dry-run", "--module-path", subdir, "-m", mid); 198 assertTrue(exitValue != 0); 199 } 200 201 private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar").get(); 202 203 private static int jar(String name, String entries) throws IOException { 204 Path jar = LIBS_DIR.resolve(name + ".jar"); 205 206 // jar --create ... 207 String classes = MODS_DIR.resolve(name).toString(); 208 String[] args = { 209 "--create", 210 "--file=" + jar, 211 "-C", classes, entries 212 }; 213 return JAR_TOOL.run(System.out, System.out, args); 214 } 215 }