--- old/test/tools/javac/modules/ModuleInfoTest.java 2016-12-15 09:20:14.985373533 +0000 +++ new/test/tools/javac/modules/ModuleInfoTest.java 2016-12-15 09:20:14.876366076 +0000 @@ -34,14 +34,12 @@ * @run main ModuleInfoTest */ -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import toolbox.JavacTask; import toolbox.Task; -import toolbox.ToolBox; public class ModuleInfoTest extends ModuleTestBase { @@ -137,21 +135,129 @@ } /** - * Verify that missing exports are reported. + * Verify that missing exports targets are reported. */ @Test public void testExportsNotFound(Path base) throws Exception { Path src = base.resolve("src"); - tb.writeJavaFiles(src, "module M1 { exports p to M2; }"); + tb.writeJavaFiles(src, + "module M { exports p to N; }", + "package p; public class C {}"); String log = new JavacTask(tb) - .options("-XDrawDiagnostics") + .options("-XDrawDiagnostics", + "-Xlint:module") + .files(findJavaFiles(src)) + .run() + .writeAll() + .getOutput(Task.OutputKind.DIRECT); + + if (!log.contains("module-info.java:1:25: compiler.warn.module.not.found: N")) + throw new Exception("expected output not found, actual output: " + log); + } + + /** + * Verify that duplicated qualified missing exports targets are reported. + */ + @Test + public void testExportsNotFoundDuplicated(Path base) throws Exception { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + "module M { exports p to N, N; }", + "package p; public class C {}"); + String log = new JavacTask(tb) + .options("-XDrawDiagnostics", + "-Xlint:module") .files(findJavaFiles(src)) .run(Task.Expect.FAIL) .writeAll() .getOutput(Task.OutputKind.DIRECT); - if (!log.contains("module-info.java:1:26: compiler.err.module.not.found: M2")) - throw new Exception("expected output not found"); + if (!log.contains("module-info.java:1:28: compiler.err.conflicting.exports.to.module: N")) + throw new Exception("expected output not found, actual output: " + log); + } + + /** + * Verify that missing exports target warning can be suppressed. + */ + @Test + public void testExportsNotFoundSuppress(Path base) throws Exception { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + "@SuppressWarnings(\"module\") module M { exports p to N; }", + "package p; public class C {}"); + String log = new JavacTask(tb) + .options("-XDrawDiagnostics", + "-Xlint:module") + .files(findJavaFiles(src)) + .run() + .writeAll() + .getOutput(Task.OutputKind.DIRECT); + + if (!log.isEmpty()) + throw new Exception("expected output not found, actual output: " + log); + } + + /** + * Verify that missing opens targets are reported. + */ + @Test + public void testOpensNotFound(Path base) throws Exception { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + "module M { opens p to N; }", + "package p; public class C {}"); + String log = new JavacTask(tb) + .options("-XDrawDiagnostics", + "-Xlint:module") + .files(findJavaFiles(src)) + .run() + .writeAll() + .getOutput(Task.OutputKind.DIRECT); + + if (!log.contains("module-info.java:1:23: compiler.warn.module.not.found: N")) + throw new Exception("expected output not found, actual output: " + log); + } + + /** + * Verify that duplicated qualified missing opens targets are reported. + */ + @Test + public void testOpensNotFoundDuplicated(Path base) throws Exception { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + "module M { opens p to N, N; }", + "package p; public class C {}"); + String log = new JavacTask(tb) + .options("-XDrawDiagnostics", + "-Xlint:module") + .files(findJavaFiles(src)) + .run(Task.Expect.FAIL) + .writeAll() + .getOutput(Task.OutputKind.DIRECT); + + if (!log.contains("module-info.java:1:26: compiler.err.conflicting.opens.to.module: N")) + throw new Exception("expected output not found, actual output: " + log); + } + + /** + * Verify that missing opens target warning can be suppressed. + */ + @Test + public void testOpensNotFoundSuppress(Path base) throws Exception { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + "@SuppressWarnings(\"module\") module M { opens p to N; }", + "package p; public class C {}"); + String log = new JavacTask(tb) + .options("-XDrawDiagnostics", + "-Xlint:module") + .files(findJavaFiles(src)) + .run() + .writeAll() + .getOutput(Task.OutputKind.DIRECT); + + if (!log.isEmpty()) + throw new Exception("expected output not found, actual output: " + log); } /** @@ -178,12 +284,12 @@ @Test public void testRequiresLoop(Path base) throws Exception { Path src = base.resolve("src"); - Path src_m1 = src.resolve("m1"); - tb.writeFile(src_m1.resolve("module-info.java"), "module m1 { requires m2; }"); - Path src_m2 = src.resolve("m2"); - tb.writeFile(src_m2.resolve("module-info.java"), "module m2 { requires m3; }"); - Path src_m3 = src.resolve("m3"); - tb.writeFile(src_m3.resolve("module-info.java"), "module m3 { requires m1; }"); + Path src_m1 = src.resolve("m1x"); + tb.writeFile(src_m1.resolve("module-info.java"), "module m1x { requires m2x; }"); + Path src_m2 = src.resolve("m2x"); + tb.writeFile(src_m2.resolve("module-info.java"), "module m2x { requires m3x; }"); + Path src_m3 = src.resolve("m3x"); + tb.writeFile(src_m3.resolve("module-info.java"), "module m3x { requires m1x; }"); Path classes = base.resolve("classes"); Files.createDirectories(classes); @@ -196,7 +302,7 @@ .writeAll() .getOutput(Task.OutputKind.DIRECT); - if (!log.contains("module-info.java:1:22: compiler.err.cyclic.requires: m3")) + if (!log.contains("module-info.java:1:23: compiler.err.cyclic.requires: m3x")) throw new Exception("expected output not found"); } @@ -206,12 +312,12 @@ @Test public void testRequiresTransitiveLoop(Path base) throws Exception { Path src = base.resolve("src"); - Path src_m1 = src.resolve("m1"); - tb.writeFile(src_m1.resolve("module-info.java"), "module m1 { requires m2; }"); - Path src_m2 = src.resolve("m2"); - tb.writeFile(src_m2.resolve("module-info.java"), "module m2 { requires transitive m3; }"); - Path src_m3 = src.resolve("m3"); - tb.writeFile(src_m3.resolve("module-info.java"), "module m3 { requires m1; }"); + Path src_m1 = src.resolve("m1x"); + tb.writeFile(src_m1.resolve("module-info.java"), "module m1x { requires m2x; }"); + Path src_m2 = src.resolve("m2x"); + tb.writeFile(src_m2.resolve("module-info.java"), "module m2x { requires transitive m3x; }"); + Path src_m3 = src.resolve("m3x"); + tb.writeFile(src_m3.resolve("module-info.java"), "module m3x { requires m1x; }"); Path classes = base.resolve("classes"); Files.createDirectories(classes); @@ -224,7 +330,7 @@ .writeAll() .getOutput(Task.OutputKind.DIRECT); - if (!log.contains("module-info.java:1:33: compiler.err.cyclic.requires: m3")) + if (!log.contains("module-info.java:1:34: compiler.err.cyclic.requires: m3x")) throw new Exception("expected output not found"); } @@ -234,10 +340,10 @@ @Test public void testDuplicateRequires(Path base) throws Exception { Path src = base.resolve("src"); - Path src_m1 = src.resolve("m1"); - tb.writeFile(src_m1.resolve("module-info.java"), "module m1 { }"); - Path src_m2 = src.resolve("m2"); - tb.writeFile(src_m2.resolve("module-info.java"), "module m2 { requires m1; requires m1; }"); + Path src_m1 = src.resolve("m1x"); + tb.writeFile(src_m1.resolve("module-info.java"), "module m1x { }"); + Path src_m2 = src.resolve("m2x"); + tb.writeFile(src_m2.resolve("module-info.java"), "module m2x { requires m1x; requires m1x; }"); Path classes = base.resolve("classes"); Files.createDirectories(classes); @@ -250,7 +356,7 @@ .writeAll() .getOutput(Task.OutputKind.DIRECT); - if (!log.contains("module-info.java:1:35: compiler.err.duplicate.requires: m1")) + if (!log.contains("module-info.java:1:37: compiler.err.duplicate.requires: m1x")) throw new Exception("expected output not found"); } @@ -260,10 +366,10 @@ @Test public void testDuplicateRequiresTransitiveStatic(Path base) throws Exception { Path src = base.resolve("src"); - Path src_m1 = src.resolve("m1"); - tb.writeFile(src_m1.resolve("module-info.java"), "module m1 { }"); - Path src_m2 = src.resolve("m2"); - tb.writeFile(src_m2.resolve("module-info.java"), "module m2 { requires transitive m1; requires static m1; }"); + Path src_m1 = src.resolve("m1x"); + tb.writeFile(src_m1.resolve("module-info.java"), "module m1x { }"); + Path src_m2 = src.resolve("m2x"); + tb.writeFile(src_m2.resolve("module-info.java"), "module m2x { requires transitive m1x; requires static m1x; }"); Path classes = base.resolve("classes"); Files.createDirectories(classes); @@ -276,7 +382,7 @@ .writeAll() .getOutput(Task.OutputKind.DIRECT); - if (!log.contains("module-info.java:1:53: compiler.err.duplicate.requires: m1")) + if (!log.contains("module-info.java:1:55: compiler.err.duplicate.requires: m1x")) throw new Exception("expected output not found"); } @@ -290,64 +396,64 @@ null); verifyConflictingExports_packages(base, "exports p; exports p;", - "module-info.java:1:32: compiler.err.conflicting.exports: p"); + "module-info.java:1:33: compiler.err.conflicting.exports: p"); verifyConflictingExports_packages(base, "exports p; opens p;", null); verifyConflictingExports_packages(base, - "exports p; exports p to m2;", - "module-info.java:1:32: compiler.err.conflicting.exports: p"); + "exports p; exports p to m2x;", + "module-info.java:1:33: compiler.err.conflicting.exports: p"); verifyConflictingExports_packages(base, - "exports p; opens p to m2;", + "exports p; opens p to m2x;", null); verifyConflictingExports_packages(base, "opens p; exports p;", null); verifyConflictingExports_packages(base, "opens p; opens p;", - "module-info.java:1:28: compiler.err.conflicting.opens: p"); + "module-info.java:1:29: compiler.err.conflicting.opens: p"); verifyConflictingExports_packages(base, - "opens p; exports p to m2;", + "opens p; exports p to m2x;", null); verifyConflictingExports_packages(base, - "opens p; opens p to m2;", - "module-info.java:1:28: compiler.err.conflicting.opens: p"); + "opens p; opens p to m2x;", + "module-info.java:1:29: compiler.err.conflicting.opens: p"); verifyConflictingExports_packages(base, - "exports p to m2; exports p;", - "module-info.java:1:38: compiler.err.conflicting.exports: p"); + "exports p to m2x; exports p;", + "module-info.java:1:40: compiler.err.conflicting.exports: p"); verifyConflictingExports_packages(base, - "exports p to m2; opens p;", + "exports p to m2x; opens p;", null); verifyConflictingExports_packages(base, - "exports p to m2; exports p to m2;", - "module-info.java:1:43: compiler.err.conflicting.exports.to.module: m2"); + "exports p to m2x; exports p to m2x;", + "module-info.java:1:45: compiler.err.conflicting.exports.to.module: m2x"); verifyConflictingExports_packages(base, - "exports p to m2; opens p to m2;", + "exports p to m2x; opens p to m2x;", null); verifyConflictingExports_packages(base, - "opens p to m2; exports p;", + "opens p to m2x; exports p;", null); verifyConflictingExports_packages(base, - "opens p to m2; opens p;", - "module-info.java:1:34: compiler.err.conflicting.opens: p"); + "opens p to m2x; opens p;", + "module-info.java:1:36: compiler.err.conflicting.opens: p"); verifyConflictingExports_packages(base, - "opens p to m2; exports p to m2;", + "opens p to m2x; exports p to m2x;", null); verifyConflictingExports_packages(base, - "opens p to m2; opens p to m2;", - "module-info.java:1:34: compiler.err.conflicting.opens: p"); + "opens p to m2x; opens p to m2x;", + "module-info.java:1:36: compiler.err.conflicting.opens: p"); verifyConflictingExports_packages(base, - "exports p to m2; exports p to m3;", - "module-info.java:1:38: compiler.err.conflicting.exports: p"); + "exports p to m2x; exports p to m3x;", + "module-info.java:1:40: compiler.err.conflicting.exports: p"); verifyConflictingExports_packages(base, - "exports p to m2; opens p to m3;", + "exports p to m2x; opens p to m3x;", null); verifyConflictingExports_packages(base, - "opens p to m2; exports p to m3;", + "opens p to m2x; exports p to m3x;", null); verifyConflictingExports_packages(base, - "opens p to m2; opens p to m3;", - "module-info.java:1:34: compiler.err.conflicting.opens: p"); + "opens p to m2x; opens p to m3x;", + "module-info.java:1:36: compiler.err.conflicting.opens: p"); } private void verifyConflictingExports_packages(Path base, String code, String expected) throws Exception { @@ -355,14 +461,14 @@ tb.cleanDirectory(base); Path src = base.resolve("src"); - tb.writeJavaFiles(src.resolve("m1"), - "module m1 { " + code + " }", + tb.writeJavaFiles(src.resolve("m1x"), + "module m1x { " + code + " }", "package p; public class P {}", "package q; public class Q {}"); - tb.writeJavaFiles(src.resolve("m2"), - "module m2 { requires m1; }"); - tb.writeJavaFiles(src.resolve("m3"), - "module m3 { requires m1; }"); + tb.writeJavaFiles(src.resolve("m2x"), + "module m2x { requires m1x; }"); + tb.writeJavaFiles(src.resolve("m3x"), + "module m3x { requires m1x; }"); Path classes = base.resolve("classes"); Files.createDirectories(classes); @@ -386,10 +492,10 @@ @Test public void testConflictingExports_modules(Path base) throws Exception { Path src = base.resolve("src"); - Path src_m1 = src.resolve("m1"); - tb.writeFile(src_m1.resolve("module-info.java"), "module m1 { }"); - Path src_m2 = src.resolve("m2"); - tb.writeFile(src_m2.resolve("module-info.java"), "module m2 { exports p to m1, m1; }"); + Path src_m1 = src.resolve("m1x"); + tb.writeFile(src_m1.resolve("module-info.java"), "module m1x { }"); + Path src_m2 = src.resolve("m2x"); + tb.writeFile(src_m2.resolve("module-info.java"), "module m2x { exports p to m1x, m1x; }"); Path classes = base.resolve("classes"); Files.createDirectories(classes); @@ -402,7 +508,7 @@ .writeAll() .getOutput(Task.OutputKind.DIRECT); - if (!log.contains("module-info.java:1:30: compiler.err.conflicting.exports.to.module: m1")) + if (!log.contains("module-info.java:1:32: compiler.err.conflicting.exports.to.module: m1x")) throw new Exception("expected output not found"); } @@ -413,7 +519,7 @@ @Test public void testAnnotations(Path base) throws Exception { Path src = base.resolve("src"); - Path src_m1 = src.resolve("m1.sub"); + Path src_m1 = src.resolve("m1x.sub"); Path classes = base.resolve("classes"); Files.createDirectories(classes);