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 Test the --add-modules option 27 * @library /tools/lib 28 * @modules jdk.compiler/com.sun.tools.javac.api 29 * jdk.compiler/com.sun.tools.javac.main 30 * @build toolbox.ToolBox toolbox.JavacTask ModuleTestBase 31 * @run main AddModulesTest 32 */ 33 34 35 import java.nio.file.Path; 36 37 import toolbox.JavacTask; 38 import toolbox.Task; 39 import toolbox.ToolBox; 40 41 public class AddModulesTest extends ModuleTestBase { 42 public static void main(String... args) throws Exception { 43 new AddModulesTest().runTests(); 44 } 45 46 @Test 47 public void testEmpty(Path base) throws Exception { 48 Path src = base.resolve("src"); 49 tb.writeJavaFiles(src, "class Dummy { }"); 50 Path classes = base.resolve("classes"); 51 tb.createDirectories(classes); 52 53 testEmpty(src, classes, "--add-modules", ""); 54 testEmpty(src, classes, "--add-modules="); 55 } 56 57 private void testEmpty(Path src, Path classes, String... options) throws Exception { 58 String log = new JavacTask(tb, Task.Mode.CMDLINE) 59 .options(options) 60 .outdir(classes) 61 .files(findJavaFiles(src)) 62 .run(Task.Expect.FAIL) 63 .writeAll() 64 .getOutput(Task.OutputKind.DIRECT); 65 66 checkOutputContains(log, 67 "javac: no value for --add-modules option"); 68 } 69 70 @Test 71 public void testEmptyItem(Path base) throws Exception { 72 Path src = base.resolve("src"); 73 Path src_m1 = src.resolve("m1"); 74 tb.writeJavaFiles(src_m1, 75 "module m1 { }"); 76 Path src_m2 = src.resolve("m2"); 77 tb.writeJavaFiles(src_m2, 78 "module m2 { }"); 79 Path classes = base.resolve("classes"); 80 tb.createDirectories(classes); 81 82 testEmptyItem(src, classes, ",m1"); 83 testEmptyItem(src, classes, "m1,,m2"); 84 testEmptyItem(src, classes, "m1,"); 85 } 86 87 private void testEmptyItem(Path src, Path classes, String option) throws Exception { 88 new JavacTask(tb) 89 .options("--module-source-path", src.toString(), 90 "--add-modules", option) 91 .outdir(classes) 92 .files(findJavaFiles(src)) 93 .run() 94 .writeAll(); 95 } 96 97 @Test 98 public void testEmptyList(Path base) throws Exception { 99 Path src = base.resolve("src"); 100 tb.writeJavaFiles(src, "class Dummy { }"); 101 Path classes = base.resolve("classes"); 102 tb.createDirectories(classes); 103 104 String log = new JavacTask(tb, Task.Mode.CMDLINE) 105 .options("--module-source-path", src.toString(), 106 "--add-modules", ",") 107 .outdir(classes) 108 .files(findJavaFiles(src)) 109 .run(Task.Expect.FAIL) 110 .writeAll() 111 .getOutput(Task.OutputKind.DIRECT); 112 113 checkOutputContains(log, 114 "javac: bad value for --add-modules option"); 115 } 116 117 @Test 118 public void testInvalidName(Path base) throws Exception { 119 Path src = base.resolve("src"); 120 tb.writeJavaFiles(src, "class Dummy { }"); 121 Path classes = base.resolve("classes"); 122 tb.createDirectories(classes); 123 124 String log = new JavacTask(tb) 125 .options("-XDrawDiagnostics", 126 "--add-modules", "BadModule!") 127 .outdir(classes) 128 .files(findJavaFiles(src)) 129 .run(Task.Expect.FAIL) 130 .writeAll() 131 .getOutput(Task.OutputKind.DIRECT); 132 133 checkOutputContains(log, 134 "- compiler.err.bad.name.for.option: --add-modules, BadModule!"); 135 } 136 137 @Test 138 public void testUnknownName(Path base) throws Exception { 139 Path src = base.resolve("src"); 140 tb.writeJavaFiles(src, "class Dummy { }"); 141 Path classes = base.resolve("classes"); 142 tb.createDirectories(classes); 143 144 String log = new JavacTask(tb) 145 .options("-XDrawDiagnostics", 146 "--add-modules", "DoesNotExist") 147 .outdir(classes) 148 .files(findJavaFiles(src)) 149 .run(Task.Expect.FAIL) 150 .writeAll() 151 .getOutput(Task.OutputKind.DIRECT); 152 153 checkOutputContains(log, 154 "- compiler.err.module.not.found: DoesNotExist"); 155 } 156 157 @Test 158 public void testDuplicate(Path base) throws Exception { 159 Path src = base.resolve("src"); 160 161 // setup a utility module 162 Path src_m1 = src.resolve("m1"); 163 tb.writeJavaFiles(src_m1, 164 "module m1 { exports p1; }", 165 "package p1; public class C1 { }"); 166 Path modules = base.resolve("modules"); 167 tb.createDirectories(modules); 168 169 new JavacTask(tb) 170 .options("--module-source-path", src.toString()) 171 .outdir(modules) 172 .files(findJavaFiles(src)) 173 .run() 174 .writeAll(); 175 176 // now test access to the module 177 Path src2 = base.resolve("src2"); 178 tb.writeJavaFiles(src2, 179 "class Dummy { p1.C1 c1; }"); 180 Path classes = base.resolve("classes"); 181 tb.createDirectories(classes); 182 183 new JavacTask(tb) 184 .options("--module-path", modules.toString(), 185 "--add-modules", "m1,m1") 186 .outdir(classes) 187 .files(findJavaFiles(src2)) 188 .run() 189 .writeAll(); 190 } 191 192 @Test 193 public void testRepeatable(Path base) throws Exception { 194 Path src = base.resolve("src"); 195 196 // setup some utility modules 197 Path src_m1 = src.resolve("m1"); 198 tb.writeJavaFiles(src_m1, 199 "module m1 { exports p1; }", 200 "package p1; public class C1 { }"); 201 Path src_m2 = src.resolve("m2"); 202 tb.writeJavaFiles(src_m2, 203 "module m2 { exports p2; }", 204 "package p2; public class C2 { }"); 205 Path modules = base.resolve("modules"); 206 tb.createDirectories(modules); 207 208 new JavacTask(tb) 209 .options("--module-source-path", src.toString()) 210 .outdir(modules) 211 .files(findJavaFiles(src)) 212 .run() 213 .writeAll(); 214 215 // now test access to the modules 216 Path src2 = base.resolve("src2"); 217 tb.writeJavaFiles(src2, 218 "class Dummy { p1.C1 c1; p2.C2 c2; }"); 219 Path classes = base.resolve("classes"); 220 tb.createDirectories(classes); 221 222 new JavacTask(tb) 223 .options("--module-path", modules.toString(), 224 "--add-modules", "m1", 225 "--add-modules", "m2") 226 .outdir(classes) 227 .files(findJavaFiles(src2)) 228 .run() 229 .writeAll(); 230 } 231 } 232