AddExportsTest.java revision 3747:80b576bd3631
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-exports 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 AddExportsTest 32 */ 33 34import java.nio.file.Files; 35import java.nio.file.Path; 36import java.util.Set; 37 38import toolbox.JavacTask; 39import toolbox.Task; 40import toolbox.ToolBox; 41 42public class AddExportsTest extends ModuleTestBase { 43 44 public static void main(String... args) throws Exception { 45 new AddExportsTest().runTests(); 46 } 47 48 @Test 49 public void testEmpty(Path base) throws Exception { 50 Path src = base.resolve("src"); 51 tb.writeJavaFiles(src, "class Dummy { }"); 52 Path classes = base.resolve("classes"); 53 tb.createDirectories(classes); 54 testEmpty(src, classes, "--add-exports", ""); 55 testEmpty(src, classes, "--add-exports="); 56 } 57 58 private void testEmpty(Path src, Path classes, String... options) throws Exception { 59 String log = new JavacTask(tb, Task.Mode.CMDLINE) 60 .options(options) 61 .outdir(classes) 62 .files(findJavaFiles(src)) 63 .run(Task.Expect.FAIL) 64 .writeAll() 65 .getOutput(Task.OutputKind.DIRECT); 66 67 checkOutputContains(log, 68 "javac: no value for --add-exports option"); 69 } 70 71 @Test 72 public void testEmptyItem(Path base) throws Exception { 73 Path src = base.resolve("src"); 74 Path src_m1 = src.resolve("m1"); 75 tb.writeJavaFiles(src_m1, 76 "module m1 { }", 77 "package p1; public class C1 { }"); 78 Path src_m2 = src.resolve("m2"); 79 tb.writeJavaFiles(src_m2, 80 "module m2 { }", 81 "package p2; class C2 { p1.C1 c1; }"); 82 Path src_m3 = src.resolve("m3"); 83 tb.writeJavaFiles(src_m3, 84 "module m3 { }", 85 "package p3; class C3 { p1.C1 c1; }"); 86 Path classes = base.resolve("classes"); 87 tb.createDirectories(classes); 88 89 testEmptyItem(src, classes, "m1/p1=,m2,m3"); 90 testEmptyItem(src, classes, "m1/p1=m2,,m3"); 91 testEmptyItem(src, classes, "m1/p1=m2,m3,"); 92 } 93 94 void testEmptyItem(Path src, Path classes, String option) throws Exception { 95 new JavacTask(tb) 96 .options("--module-source-path", src.toString(), 97 "--add-exports", option) 98 .outdir(classes) 99 .files(findJavaFiles(src)) 100 .run() 101 .writeAll(); 102 } 103 104 @Test 105 public void testEmptyList(Path base) throws Exception { 106 Path src = base.resolve("src"); 107 Path src_m1 = src.resolve("m1"); 108 tb.writeJavaFiles(src_m1, 109 "module m1 { exports p1; }", 110 "package p1; public class C1 { }"); 111 Path classes = base.resolve("classes"); 112 tb.createDirectories(classes); 113 114 testEmptyList(src, classes, "m1/p1="); 115 testEmptyList(src, classes, "m1/p1=,"); 116 } 117 118 void testEmptyList(Path src, Path classes, String option) throws Exception { 119 String log = new JavacTask(tb, Task.Mode.CMDLINE) 120 .options("--module-source-path", src.toString(), 121 "--add-exports", option) 122 .outdir(classes) 123 .files(findJavaFiles(src)) 124 .run(Task.Expect.FAIL) 125 .writeAll() 126 .getOutput(Task.OutputKind.DIRECT); 127 128 checkOutputContains(log, 129 "javac: bad value for --add-exports option: '" + option + "'"); 130 } 131 132 @Test 133 public void testMissingSourceParts(Path base) throws Exception { 134 Path src = base.resolve("src"); 135 Path src_m1 = src.resolve("m1"); 136 tb.writeJavaFiles(src_m1, 137 "module m1 { exports p1; }", 138 "package p1; public class C1 { }"); 139 Path src_m2 = src.resolve("m2"); 140 tb.writeJavaFiles(src_m2, 141 "module m2 { }", 142 "package p2; class C2 { p1.C1 c1; }"); 143 Path classes = base.resolve("classes"); 144 tb.createDirectories(classes); 145 146 testMissingSourcePart(src, classes, "=m2"); 147 testMissingSourcePart(src, classes, "/=m2"); 148 testMissingSourcePart(src, classes, "m1/=m2"); 149 testMissingSourcePart(src, classes, "/p1=m2"); 150 testMissingSourcePart(src, classes, "m1p1=m2"); 151 } 152 153 private void testMissingSourcePart(Path src, Path classes, String option) throws Exception { 154 String log = new JavacTask(tb, Task.Mode.CMDLINE) 155 .options("--module-source-path", src.toString(), 156 "--add-exports", option) 157 .outdir(classes) 158 .files(findJavaFiles(src)) 159 .run(Task.Expect.FAIL) 160 .writeAll() 161 .getOutput(Task.OutputKind.DIRECT); 162 163 checkOutputContains(log, 164 "javac: bad value for --add-exports option: '" + option + "'"); 165 } 166 167 @Test 168 public void testBadSourceParts(Path base) throws Exception { 169 Path src = base.resolve("src"); 170 Path src_m1 = src.resolve("m1"); 171 tb.writeJavaFiles(src_m1, 172 "module m1 { exports p1; }", 173 "package p1; public class C1 { }"); 174 Path src_m2 = src.resolve("m2"); 175 tb.writeJavaFiles(src_m2, 176 "module m2 { }", 177 "package p2; class C2 { p1.C1 c1; }"); 178 Path classes = base.resolve("classes"); 179 tb.createDirectories(classes); 180 181 testBadSourcePart(src, classes, "m!/p1=m2", "m!"); 182 testBadSourcePart(src, classes, "m1/p!=m2", "p!"); 183 } 184 185 private void testBadSourcePart(Path src, Path classes, String option, String badName) 186 throws Exception { 187 String log = new JavacTask(tb, Task.Mode.CMDLINE) 188 .options("-XDrawDiagnostics", 189 "--module-source-path", src.toString(), 190 "--add-exports", option) 191 .outdir(classes) 192 .files(findJavaFiles(src)) 193 .run(Task.Expect.FAIL) 194 .writeAll() 195 .getOutput(Task.OutputKind.DIRECT); 196 197 checkOutputContains(log, 198 "- compiler.warn.bad.name.for.option: --add-exports, " + badName); 199 } 200 201 @Test 202 public void testBadTarget(Path base) throws Exception { 203 Path src = base.resolve("src"); 204 Path src_m1 = src.resolve("m1"); 205 tb.writeJavaFiles(src_m1, 206 "module m1 { exports p1; }", 207 "package p1; public class C1 { }"); 208 Path classes = base.resolve("classes"); 209 tb.createDirectories(classes); 210 211 String log = new JavacTask(tb, Task.Mode.CMDLINE) 212 .options("-XDrawDiagnostics", 213 "--module-source-path", src.toString(), 214 "--add-exports", "m1/p1=m!") 215 .outdir(classes) 216 .files(findJavaFiles(src)) 217 .run() 218 .writeAll() 219 .getOutput(Task.OutputKind.DIRECT); 220 221 checkOutputContains(log, 222 "- compiler.warn.bad.name.for.option: --add-exports, m!"); 223 } 224 225 @Test 226 public void testSourceNotFound(Path base) throws Exception { 227 Path src = base.resolve("src"); 228 Path src_m1 = src.resolve("m1"); 229 tb.writeJavaFiles(src_m1, 230 "module m1 { }"); 231 Path classes = base.resolve("classes"); 232 tb.createDirectories(classes); 233 234 String log = new JavacTask(tb, Task.Mode.CMDLINE) 235 .options("-XDrawDiagnostics", 236 "--module-source-path", src.toString(), 237 "--add-exports", "DoesNotExist/p=m1") 238 .outdir(classes) 239 .files(findJavaFiles(src)) 240 .run() 241 .writeAll() 242 .getOutput(Task.OutputKind.DIRECT); 243 244 checkOutputContains(log, 245 "- compiler.warn.module.for.option.not.found: --add-exports, DoesNotExist"); 246 } 247 248 @Test 249 public void testTargetNotFound(Path base) throws Exception { 250 Path src = base.resolve("src"); 251 Path src_m1 = src.resolve("m1"); 252 tb.writeJavaFiles(src_m1, 253 "module m1 { }", 254 "package p1; class C1 { }"); 255 Path classes = base.resolve("classes"); 256 tb.createDirectories(classes); 257 258 String log = new JavacTask(tb, Task.Mode.CMDLINE) 259 .options("-XDrawDiagnostics", 260 "--module-source-path", src.toString(), 261 "--add-exports", "m1/p1=DoesNotExist") 262 .outdir(classes) 263 .files(findJavaFiles(src)) 264 .run() 265 .writeAll() 266 .getOutput(Task.OutputKind.DIRECT); 267 268 checkOutputContains(log, 269 "- compiler.warn.module.for.option.not.found: --add-exports, DoesNotExist"); 270 } 271 272 @Test 273 public void testDuplicate(Path base) throws Exception { 274 Path src = base.resolve("src"); 275 Path src_m1 = src.resolve("m1"); 276 tb.writeJavaFiles(src_m1, 277 "module m1 { }", 278 "package p1; public class C1 { }"); 279 Path src_m2 = src.resolve("m2"); 280 tb.writeJavaFiles(src_m2, 281 "module m2 { }", 282 "package p2; class C2 { p1.C1 c1; }"); 283 Path classes = base.resolve("classes"); 284 tb.createDirectories(classes); 285 286 new JavacTask(tb) 287 .options("--module-source-path", src.toString(), 288 "--add-exports", "m1/p1=m2,m2") 289 .outdir(classes) 290 .files(findJavaFiles(src)) 291 .run() 292 .writeAll(); 293 } 294 295 @Test 296 public void testRepeated_SameTarget(Path base) throws Exception { 297 Path src = base.resolve("src"); 298 Path src_m1 = src.resolve("m1"); 299 tb.writeJavaFiles(src_m1, 300 "module m1 { }", 301 "package p1; public class C1 { }"); 302 Path src_m2 = src.resolve("m2"); 303 tb.writeJavaFiles(src_m2, 304 "module m2 { }", 305 "package p2; class C2 { p1.C1 c1; }"); 306 Path classes = base.resolve("classes"); 307 tb.createDirectories(classes); 308 309 new JavacTask(tb) 310 .options("--module-source-path", src.toString(), 311 "--add-exports", "m1/p1=m2", 312 "--add-exports", "m1/p1=m2") 313 .outdir(classes) 314 .files(findJavaFiles(src)) 315 .run() 316 .writeAll(); 317 } 318 319 @Test 320 public void testRepeated_DifferentTarget(Path base) throws Exception { 321 Path src = base.resolve("src"); 322 Path src_m1 = src.resolve("m1"); 323 tb.writeJavaFiles(src_m1, 324 "module m1 { }", 325 "package p1; public class C1 { }"); 326 Path src_m2 = src.resolve("m2"); 327 tb.writeJavaFiles(src_m2, 328 "module m2 { }", 329 "package p2; class C2 { p1.C1 c1; }"); 330 Path src_m3 = src.resolve("m3"); 331 tb.writeJavaFiles(src_m3, 332 "module m3 { }", 333 "package p3; class C3 { p1.C1 c1; }"); 334 Path classes = base.resolve("classes"); 335 tb.createDirectories(classes); 336 337 new JavacTask(tb) 338 .options("--module-source-path", src.toString(), 339 "--add-exports", "m1/p1=m2", 340 "--add-exports", "m1/p1=m3") 341 .outdir(classes) 342 .files(findJavaFiles(src)) 343 .run() 344 .writeAll(); 345 } 346} 347