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 ModuleTestBase 32 * @run main MultiModuleModeTest 33 */ 34 35 import java.nio.file.Files; 36 import java.nio.file.Path; 37 import java.util.ArrayList; 38 import java.util.Arrays; 39 import java.util.List; 40 41 import toolbox.JavacTask; 42 import toolbox.Task; 43 import toolbox.ToolBox; 44 45 public class MultiModuleModeTest extends ModuleTestBase { 46 47 public static void main(String... args) throws Exception { 48 new MultiModuleModeTest().runTests(); 49 } 50 51 @Test 52 public void testDuplicateModules(Path base) throws Exception { 53 Path src = base.resolve("src"); 54 Path src_m1 = src.resolve("m1"); 55 tb.writeJavaFiles(src_m1, "module m1 { }"); 56 Path src_m2 = src.resolve("m2"); 57 tb.writeJavaFiles(src_m2, "module m1 { }"); 58 Path classes = base.resolve("classes"); 59 tb.createDirectories(classes); 60 61 String log = new JavacTask(tb) 62 .options("-XDrawDiagnostics", 63 "--module-source-path", src.toString()) 64 .outdir(classes) 65 .files(findJavaFiles(src)) 66 .run(Task.Expect.FAIL) 67 .writeAll() 68 .getOutput(Task.OutputKind.DIRECT); 69 70 if (!log.contains("module-info.java:1:1: compiler.err.duplicate.module: m1")) 71 throw new Exception("expected output not found"); 72 } 73 74 @Test 75 public void testCantFindModule(Path base) throws Exception { 76 Path src = base.resolve("src"); 77 Path src_m1 = src.resolve("m1"); 78 tb.writeJavaFiles(src_m1, "module m1 { }"); 79 Path misc = base.resolve("misc"); 80 tb.writeJavaFiles(misc, "package p; class C { }"); 81 Path classes = base.resolve("classes"); 82 tb.createDirectories(classes); 83 84 String log = new JavacTask(tb) 85 .options("-XDrawDiagnostics", 86 "--module-source-path", src.toString()) 87 .outdir(classes) 88 .files(join(findJavaFiles(src), findJavaFiles(misc))) 89 .run(Task.Expect.FAIL) 90 .writeAll() 91 .getOutput(Task.OutputKind.DIRECT); 92 93 if (!log.contains("C.java:1:1: compiler.err.unnamed.pkg.not.allowed.named.modules")) 94 throw new Exception("expected output not found"); 95 } 96 97 @Test 98 public void testModuleNameMismatch(Path base) throws Exception { 99 Path src = base.resolve("src"); 100 Path src_m1 = src.resolve("m1"); 101 tb.writeJavaFiles(src_m1, "module m2 { }"); 102 Path classes = base.resolve("classes"); 103 tb.createDirectories(classes); 104 105 String log = new JavacTask(tb) 106 .options("-XDrawDiagnostics", 107 "--module-source-path", src.toString()) 108 .outdir(classes) 109 .files(findJavaFiles(src)) 110 .run(Task.Expect.FAIL) 111 .writeAll() 112 .getOutput(Task.OutputKind.DIRECT); 113 114 if (!log.contains("module-info.java:1:8: compiler.err.module.name.mismatch: m2, m1")) 115 throw new Exception("expected output not found"); 116 } 117 118 @Test 119 public void testImplicitModuleSource(Path base) throws Exception { 120 Path src = base.resolve("src"); 121 tb.writeJavaFiles(src.resolve("m1"), "module m1 { }"); 122 tb.writeJavaFiles(src.resolve("m2"), "module m2 { requires m1; }"); 123 Path modules = base.resolve("modules"); 124 Files.createDirectories(modules); 125 126 new JavacTask(tb) 127 .options("--module-source-path", src.toString()) 128 .outdir(modules) 129 .files(src.resolve("m2/module-info.java")) 130 .run() 131 .writeAll(); 132 } 133 134 @Test 135 public void testImplicitModuleClass(Path base) throws Exception { 136 Path src1 = base.resolve("src1"); 137 tb.writeJavaFiles(src1.resolve("m1"), "module m1 { }"); 138 Path modules1 = base.resolve("modules1"); 139 Files.createDirectories(modules1); 140 141 new JavacTask(tb) 142 .options("--module-source-path", src1.toString()) 143 .outdir(modules1) 144 .files(src1.resolve("m1/module-info.java")) 145 .run() 146 .writeAll(); 147 148 Path src2= base.resolve("src2"); 149 tb.writeJavaFiles(src2.resolve("m2"), "module m2 { requires m1; }"); 150 Path modules2 = base.resolve("modules2"); 151 Files.createDirectories(modules2); 152 153 new JavacTask(tb) 154 .options("--module-path", modules1.toString(), 155 "--module-source-path", src2.toString()) 156 .outdir(modules2) 157 .files(src2.resolve("m2/module-info.java")) 158 .run() 159 .writeAll(); 160 } 161 162 Path[] join(Path[] a, Path[] b) { 163 List<Path> result = new ArrayList<>(); 164 result.addAll(Arrays.asList(a)); 165 result.addAll(Arrays.asList(b)); 166 return result.toArray(new Path[result.size()]); 167 } 168 }