mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
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:
parent
353a59448d
commit
2381943e61
147 changed files with 2438 additions and 1528 deletions
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue