8170987: Module system implementation refresh (12/2016)

Co-authored-by: Jonathan Gibbons <jonathan.gibbons@oracle.com>
Co-authored-by: Jan Lahoda <jan.lahoda@oracle.com>
Co-authored-by: Srikanth Adayapalam <srikanth.adayapalam@oracle.com>
Co-authored-by: Mandy Chung <mandy.chung@oracle.com>
Reviewed-by: mcimadamore
This commit is contained in:
Alan Bateman 2016-12-16 05:47:58 +00:00
parent 353a59448d
commit 2381943e61
147 changed files with 2438 additions and 1528 deletions

View file

@ -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 @@ public class ModuleInfoTest extends ModuleTestBase {
}
/**
* 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 @@ public class ModuleInfoTest extends ModuleTestBase {
@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 @@ public class ModuleInfoTest extends ModuleTestBase {
.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 @@ public class ModuleInfoTest extends ModuleTestBase {
@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 @@ public class ModuleInfoTest extends ModuleTestBase {
.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 @@ public class ModuleInfoTest extends ModuleTestBase {
@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 @@ public class ModuleInfoTest extends ModuleTestBase {
.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 @@ public class ModuleInfoTest extends ModuleTestBase {
@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 @@ public class ModuleInfoTest extends ModuleTestBase {
.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 @@ public class ModuleInfoTest extends ModuleTestBase {
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 @@ public class ModuleInfoTest extends ModuleTestBase {
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 @@ public class ModuleInfoTest extends ModuleTestBase {
@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 @@ public class ModuleInfoTest extends ModuleTestBase {
.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 @@ public class ModuleInfoTest extends ModuleTestBase {
@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);