1 /* 2 * Copyright (c) 2015, 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 * @summary tests for multi-module mode compilation 27 * @library /tools/lib 28 * @modules 29 * jdk.compiler/com.sun.tools.javac.api 30 * jdk.compiler/com.sun.tools.javac.main 31 * @build toolbox.ToolBox toolbox.JavacTask toolbox.ModuleBuilder ModuleTestBase 32 * @run main XModuleTest 33 */ 34 35 import java.nio.file.Path; 36 import java.util.Arrays; 37 import java.util.List; 38 39 import toolbox.JavacTask; 40 import toolbox.ModuleBuilder; 41 import toolbox.Task; 42 import toolbox.TestRunner; 43 import toolbox.ToolBox; 44 45 public class XModuleTest extends ModuleTestBase { 46 47 public static void main(String... args) throws Exception { 48 new XModuleTest().runTests(); 49 } 50 51 @Test 52 public void testCorrectXModule(Path base) throws Exception { 53 //note: avoiding use of java.base, as that gets special handling on some places: 54 Path src = base.resolve("src"); 55 tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element { }"); 56 Path classes = base.resolve("classes"); 57 tb.createDirectories(classes); 58 59 String log = new JavacTask(tb) 60 .options("-Xmodule:java.compiler") 61 .outdir(classes) 62 .files(findJavaFiles(src)) 63 .run() 64 .writeAll() 65 .getOutput(Task.OutputKind.DIRECT); 66 67 if (!log.isEmpty()) 68 throw new Exception("expected output not found: " + log); 69 } 70 71 @Test 72 public void testSourcePath(Path base) throws Exception { 73 //note: avoiding use of java.base, as that gets special handling on some places: 74 Path src = base.resolve("src"); 75 tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element, Other { }", "package javax.lang.model.element; interface Other { }"); 76 Path classes = base.resolve("classes"); 77 tb.createDirectories(classes); 78 79 String log = new JavacTask(tb) 80 .options("-Xmodule:java.compiler", "-sourcepath", src.toString()) 81 .outdir(classes) 82 .files(src.resolve("javax/lang/model/element/Extra.java")) 83 .run() 84 .writeAll() 85 .getOutput(Task.OutputKind.DIRECT); 86 87 if (!log.isEmpty()) 88 throw new Exception("expected output not found: " + log); 89 } 90 91 @Test 92 public void testClassPath(Path base) throws Exception { 93 Path cpSrc = base.resolve("cpSrc"); 94 tb.writeJavaFiles(cpSrc, "package p; public interface Other { }"); 95 Path cpClasses = base.resolve("cpClasses"); 96 tb.createDirectories(cpClasses); 97 98 String cpLog = new JavacTask(tb) 99 .outdir(cpClasses) 100 .files(findJavaFiles(cpSrc)) 101 .run() 102 .writeAll() 103 .getOutput(Task.OutputKind.DIRECT); 104 105 if (!cpLog.isEmpty()) 106 throw new Exception("expected output not found: " + cpLog); 107 108 Path src = base.resolve("src"); 109 //note: avoiding use of java.base, as that gets special handling on some places: 110 tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element, p.Other { }"); 111 Path classes = base.resolve("classes"); 112 tb.createDirectories(classes); 113 114 String log = new JavacTask(tb) 115 .options("-Xmodule:java.compiler", "-classpath", cpClasses.toString()) 116 .outdir(classes) 117 .files(src.resolve("javax/lang/model/element/Extra.java")) 118 .run() 119 .writeAll() 120 .getOutput(Task.OutputKind.DIRECT); 121 122 if (!log.isEmpty()) 123 throw new Exception("expected output not found: " + log); 124 } 125 126 @Test 127 public void testNoModuleInfoOnSourcePath(Path base) throws Exception { 128 //note: avoiding use of java.base, as that gets special handling on some places: 129 Path src = base.resolve("src"); 130 tb.writeJavaFiles(src, 131 "module java.compiler {}", 132 "package javax.lang.model.element; public interface Extra { }"); 133 Path classes = base.resolve("classes"); 134 tb.createDirectories(classes); 135 136 List<String> log = new JavacTask(tb) 137 .options("-XDrawDiagnostics", "-Xmodule:java.compiler") 138 .outdir(classes) 139 .files(findJavaFiles(src)) 140 .run(Task.Expect.FAIL) 141 .writeAll() 142 .getOutputLines(Task.OutputKind.DIRECT); 143 144 List<String> expected = Arrays.asList("Extra.java:1:1: compiler.err.module-info.with.xmodule.sourcepath", 145 "1 error"); 146 147 if (!expected.equals(log)) 148 throw new Exception("expected output not found: " + log); 149 } 150 151 @Test 152 public void testNoModuleInfoInClassOutput(Path base) throws Exception { 153 //note: avoiding use of java.base, as that gets special handling on some places: 154 Path srcMod = base.resolve("src-mod"); 155 tb.writeJavaFiles(srcMod, 156 "module mod {}"); 157 Path classes = base.resolve("classes"); 158 tb.createDirectories(classes); 159 160 String logMod = new JavacTask(tb) 161 .options() 162 .outdir(classes) 163 .files(findJavaFiles(srcMod)) 164 .run() 165 .writeAll() 166 .getOutput(Task.OutputKind.DIRECT); 167 168 if (!logMod.isEmpty()) 169 throw new Exception("unexpected output found: " + logMod); 170 171 Path src = base.resolve("src"); 172 tb.writeJavaFiles(src, 173 "package javax.lang.model.element; public interface Extra { }"); 174 tb.createDirectories(classes); 175 176 List<String> log = new JavacTask(tb) 177 .options("-XDrawDiagnostics", "-Xmodule:java.compiler") 178 .outdir(classes) 179 .files(findJavaFiles(src)) 180 .run(Task.Expect.FAIL) 181 .writeAll() 182 .getOutputLines(Task.OutputKind.DIRECT); 183 184 List<String> expected = Arrays.asList("Extra.java:1:1: compiler.err.module-info.with.xmodule.classpath", 185 "1 error"); 186 187 if (!expected.equals(log)) 188 throw new Exception("expected output not found: " + log); 189 } 190 191 @Test 192 public void testModuleSourcePathXModule(Path base) throws Exception { 193 //note: avoiding use of java.base, as that gets special handling on some places: 194 Path src = base.resolve("src"); 195 tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element { }"); 196 Path classes = base.resolve("classes"); 197 tb.createDirectories(classes); 198 199 List<String> log = new JavacTask(tb) 200 .options("-XDrawDiagnostics", "-Xmodule:java.compiler", "-modulesourcepath", src.toString()) 201 .outdir(classes) 202 .files(findJavaFiles(src)) 203 .run(Task.Expect.FAIL) 204 .writeAll() 205 .getOutputLines(Task.OutputKind.DIRECT); 206 207 List<String> expected = Arrays.asList("- compiler.err.xmodule.no.module.sourcepath", 208 "1 error"); 209 210 if (!expected.equals(log)) 211 throw new Exception("expected output not found: " + log); 212 } 213 214 @Test 215 public void testXModuleTooMany(Path base) throws Exception { 216 //note: avoiding use of java.base, as that gets special handling on some places: 217 Path src = base.resolve("src"); 218 tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element { }"); 219 Path classes = base.resolve("classes"); 220 tb.createDirectories(classes); 221 222 List<String> log = new JavacTask(tb, Task.Mode.CMDLINE) 223 .options("-XDrawDiagnostics", "-Xmodule:java.compiler", "-Xmodule:java.compiler") 224 .outdir(classes) 225 .files(findJavaFiles(src)) 226 .run(Task.Expect.FAIL) 227 .writeAll() 228 .getOutputLines(Task.OutputKind.DIRECT); 229 230 List<String> expected = Arrays.asList("javac: option -Xmodule: can only be specified once", 231 "Usage: javac <options> <source files>", 232 "use -help for a list of possible options"); 233 234 if (!expected.equals(log)) 235 throw new Exception("expected output not found: " + log); 236 } 237 238 @Test 239 public void testWithModulePath(Path base) throws Exception { 240 Path modSrc = base.resolve("modSrc"); 241 Path modules = base.resolve("modules"); 242 new ModuleBuilder(tb, "m1") 243 .classes("package pkg1; public interface E { }") 244 .build(modSrc, modules); 245 246 Path src = base.resolve("src"); 247 tb.writeJavaFiles(src, "package p; interface A extends pkg1.E { }"); 248 249 new JavacTask(tb, Task.Mode.CMDLINE) 250 .options("-modulepath", modules.toString(), 251 "-Xmodule:m1") 252 .files(findJavaFiles(src)) 253 .run() 254 .writeAll(); 255 256 //checks module bounds still exist 257 new ModuleBuilder(tb, "m2") 258 .classes("package pkg2; public interface D { }") 259 .build(modSrc, modules); 260 261 Path src2 = base.resolve("src2"); 262 tb.writeJavaFiles(src2, "package p; interface A extends pkg2.D { }"); 263 264 List<String> log = new JavacTask(tb, Task.Mode.CMDLINE) 265 .options("-XDrawDiagnostics", 266 "-modulepath", modules.toString(), 267 "-Xmodule:m1") 268 .files(findJavaFiles(src2)) 269 .run(Task.Expect.FAIL) 270 .writeAll() 271 .getOutputLines(Task.OutputKind.DIRECT); 272 273 List<String> expected = Arrays.asList("A.java:1:36: compiler.err.doesnt.exist: pkg2", 274 "1 error"); 275 276 if (!expected.equals(log)) 277 throw new Exception("expected output not found: " + log); 278 } 279 280 @Test 281 public void testWithUpgradeModulePath(Path base) throws Exception { 282 Path modSrc = base.resolve("modSrc"); 283 Path modules = base.resolve("modules"); 284 new ModuleBuilder(tb, "m1") 285 .classes("package pkg1; public interface E { }") 286 .build(modSrc, modules); 287 288 Path upgrSrc = base.resolve("upgradeSrc"); 289 Path upgrade = base.resolve("upgrade"); 290 new ModuleBuilder(tb, "m1") 291 .classes("package pkg1; public interface D { }") 292 .build(upgrSrc, upgrade); 293 294 Path src = base.resolve("src"); 295 tb.writeJavaFiles(src, "package p; interface A extends pkg1.D { }"); 296 297 new JavacTask(tb, Task.Mode.CMDLINE) 298 .options("-modulepath", modules.toString(), 299 "-upgrademodulepath", upgrade.toString(), 300 "-Xmodule:m1") 301 .files(findJavaFiles(src)) 302 .run() 303 .writeAll(); 304 } 305 }