< prev index next >
test/tools/javac/modules/XModuleTest.java
Print this page
*** 38,47 ****
--- 38,48 ----
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
+ import java.util.stream.Collectors;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.SourceVersion;
*** 165,191 ****
"package m2; public class Test { }");
Path classes = base.resolve("classes");
tb.createDirectories(classes);
List<String> log = new JavacTask(tb)
! .options("--patch-module", "m1x=" + m1.toString(),
! "--patch-module", "m2x=" + m2.toString(),
"--module-source-path", src.toString(),
"-XDrawDiagnostics")
.outdir(classes)
.files(findJavaFiles(src.resolve("m1x").resolve("m1"),
src.resolve("m2x").resolve("m2")))
.run(Expect.FAIL)
.writeAll()
.getOutputLines(Task.OutputKind.DIRECT);
List<String> expectedOut = Arrays.asList(
! "Test.java:1:1: compiler.err.file.patched.and.msp",
! "Test.java:1:1: compiler.err.file.patched.and.msp",
! "module-info.java:1:1: compiler.err.file.patched.and.msp",
! "- compiler.err.cant.access: m2x.module-info, (compiler.misc.cant.resolve.modules)",
! "4 errors"
);
if (!expectedOut.equals(log))
throw new Exception("expected output not found: " + log);
}
--- 166,188 ----
"package m2; public class Test { }");
Path classes = base.resolve("classes");
tb.createDirectories(classes);
List<String> log = new JavacTask(tb)
! .options("--patch-module", "m1x=" + m2.toString(),
"--module-source-path", src.toString(),
"-XDrawDiagnostics")
.outdir(classes)
.files(findJavaFiles(src.resolve("m1x").resolve("m1"),
src.resolve("m2x").resolve("m2")))
.run(Expect.FAIL)
.writeAll()
.getOutputLines(Task.OutputKind.DIRECT);
List<String> expectedOut = Arrays.asList(
! "Test.java:1:1: compiler.err.file.patched.and.msp: m1x, m2x",
! "1 error"
);
if (!expectedOut.equals(log))
throw new Exception("expected output not found: " + log);
}
*** 264,290 ****
@Test
public void testNoModuleInfoOnSourcePath(Path base) throws Exception {
//note: avoiding use of java.base, as that gets special handling on some places:
Path src = base.resolve("src");
tb.writeJavaFiles(src,
"package javax.lang.model.element; public interface Extra { }");
- Path srcPath = base.resolve("src-path");
- tb.writeJavaFiles(src,
- "module java.compiler {}");
Path classes = base.resolve("classes");
tb.createDirectories(classes);
! List<String> log = new JavacTask(tb)
.options("-XDrawDiagnostics",
"--patch-module", "java.compiler=" + src.toString())
.outdir(classes)
.files(findJavaFiles(src))
.run(Task.Expect.FAIL)
.writeAll()
.getOutputLines(Task.OutputKind.DIRECT);
! List<String> expected = Arrays.asList("Extra.java:1:1: compiler.err.module-info.with.patched.module.sourcepath",
"1 error");
if (!expected.equals(log))
throw new Exception("expected output not found: " + log);
}
--- 261,305 ----
@Test
public void testNoModuleInfoOnSourcePath(Path base) throws Exception {
//note: avoiding use of java.base, as that gets special handling on some places:
Path src = base.resolve("src");
tb.writeJavaFiles(src,
+ "module java.compiler {}",
"package javax.lang.model.element; public interface Extra { }");
Path classes = base.resolve("classes");
tb.createDirectories(classes);
! List<String> log;
! List<String> expected;
!
! log = new JavacTask(tb)
.options("-XDrawDiagnostics",
"--patch-module", "java.compiler=" + src.toString())
.outdir(classes)
.files(findJavaFiles(src))
.run(Task.Expect.FAIL)
.writeAll()
.getOutputLines(Task.OutputKind.DIRECT);
! expected = Arrays.asList("Extra.java:1:1: compiler.err.module-info.with.patched.module.sourcepath",
! "1 error");
!
! if (!expected.equals(log))
! throw new Exception("expected output not found: " + log);
!
! //multi-module mode:
! log = new JavacTask(tb)
! .options("-XDrawDiagnostics",
! "--patch-module", "java.compiler=" + src.toString(),
! "--module-source-path", "dummy")
! .outdir(classes)
! .files(findJavaFiles(src))
! .run(Task.Expect.FAIL)
! .writeAll()
! .getOutputLines(Task.OutputKind.DIRECT);
!
! expected = Arrays.asList("- compiler.err.locn.module-info.not.allowed.on.patch.path: module-info.java",
"1 error");
if (!expected.equals(log))
throw new Exception("expected output not found: " + log);
}
*** 293,303 ****
public void testNoModuleInfoInClassOutput(Path base) throws Exception {
//note: avoiding use of java.base, as that gets special handling on some places:
Path srcMod = base.resolve("src-mod");
tb.writeJavaFiles(srcMod,
"module mod {}");
! Path classes = base.resolve("classes");
tb.createDirectories(classes);
String logMod = new JavacTask(tb)
.options()
.outdir(classes)
--- 308,318 ----
public void testNoModuleInfoInClassOutput(Path base) throws Exception {
//note: avoiding use of java.base, as that gets special handling on some places:
Path srcMod = base.resolve("src-mod");
tb.writeJavaFiles(srcMod,
"module mod {}");
! Path classes = base.resolve("classes").resolve("java.compiler");
tb.createDirectories(classes);
String logMod = new JavacTask(tb)
.options()
.outdir(classes)
*** 312,331 ****
Path src = base.resolve("src");
tb.writeJavaFiles(src,
"package javax.lang.model.element; public interface Extra { }");
tb.createDirectories(classes);
! List<String> log = new JavacTask(tb)
.options("-XDrawDiagnostics",
"--patch-module", "java.compiler=" + src.toString())
.outdir(classes)
.files(findJavaFiles(src))
.run(Task.Expect.FAIL)
.writeAll()
.getOutputLines(Task.OutputKind.DIRECT);
! List<String> expected = Arrays.asList("Extra.java:1:1: compiler.err.module-info.with.patched.module.classpath",
"1 error");
if (!expected.equals(log))
throw new Exception("expected output not found: " + log);
}
--- 327,365 ----
Path src = base.resolve("src");
tb.writeJavaFiles(src,
"package javax.lang.model.element; public interface Extra { }");
tb.createDirectories(classes);
! List<String> log;
! List<String> expected;
!
! log = new JavacTask(tb)
.options("-XDrawDiagnostics",
"--patch-module", "java.compiler=" + src.toString())
.outdir(classes)
.files(findJavaFiles(src))
.run(Task.Expect.FAIL)
.writeAll()
.getOutputLines(Task.OutputKind.DIRECT);
! expected = Arrays.asList("Extra.java:1:1: compiler.err.module-info.with.patched.module.classoutput",
! "1 error");
!
! if (!expected.equals(log))
! throw new Exception("expected output not found: " + log);
!
! log = new JavacTask(tb)
! .options("-XDrawDiagnostics",
! "--patch-module", "java.compiler=" + src.toString(),
! "--module-source-path", "dummy")
! .outdir(classes.getParent())
! .files(findJavaFiles(src))
! .run(Task.Expect.FAIL)
! .writeAll()
! .getOutputLines(Task.OutputKind.DIRECT);
!
! expected = Arrays.asList("- compiler.err.locn.module-info.not.allowed.on.patch.path: module-info.class",
"1 error");
if (!expected.equals(log))
throw new Exception("expected output not found: " + log);
}
*** 494,503 ****
--- 528,691 ----
throw new AssertionError(msg);
}
}
}
+ @Test
+ public void testSingleModeIncremental(Path base) throws Exception {
+ //note: avoiding use of java.base, as that gets special handling on some places:
+ Path src = base.resolve("src");
+ tb.writeJavaFiles(src,
+ "package javax.lang.model.element; public interface Extra extends Element { }",
+ "package javax.lang.model.element; public interface Extra2 extends Extra { }");
+ Path classes = base.resolve("classes");
+ tb.createDirectories(classes);
+
+ Thread.sleep(2000); //ensure newer timestamps on classfiles:
+
+ new JavacTask(tb)
+ .options("--patch-module", "java.compiler=" + src.toString())
+ .outdir(classes)
+ .files(findJavaFiles(src))
+ .run()
+ .writeAll()
+ .getOutput(Task.OutputKind.DIRECT);
+
+ List<String> log = new JavacTask(tb)
+ .options("--patch-module", "java.compiler=" + src.toString(),
+ "-verbose")
+ .outdir(classes)
+ .files(findJavaFiles(src.resolve("javax/lang/model/element/Extra2.java"
+ .replace("/", src.getFileSystem().getSeparator()))))
+ .run()
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT)
+ .stream()
+ .filter(l -> l.contains("parsing"))
+ .collect(Collectors.toList());
+
+ boolean parsesExtra2 = log.stream()
+ .anyMatch(l -> l.contains("Extra2.java"));
+ boolean parsesExtra = log.stream()
+ .anyMatch(l -> l.contains("Extra.java"));
+
+ if (!parsesExtra2 || parsesExtra) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+ }
+
+ @Test
+ public void testComplexMSPAndPatch(Path base) throws Exception {
+ //note: avoiding use of java.base, as that gets special handling on some places:
+ Path src1 = base.resolve("src1");
+ Path src1ma = src1.resolve("ma");
+ tb.writeJavaFiles(src1ma,
+ "module ma { exports ma; }",
+ "package ma; public class C1 { public static void method() { } }",
+ "package ma.impl; public class C2 { }");
+ Path src1mb = src1.resolve("mb");
+ tb.writeJavaFiles(src1mb,
+ "module mb { requires ma; }",
+ "package mb.impl; public class C2 { public static void method() { } }");
+ Path src1mc = src1.resolve("mc");
+ tb.writeJavaFiles(src1mc,
+ "module mc { }");
+ Path classes1 = base.resolve("classes1");
+ tb.createDirectories(classes1);
+ tb.cleanDirectory(classes1);
+
+ new JavacTask(tb)
+ .options("--module-source-path", src1.toString())
+ .files(findJavaFiles(src1))
+ .outdir(classes1)
+ .run()
+ .writeAll();
+
+ //patching:
+ Path src2 = base.resolve("src2");
+ Path src2ma = src2.resolve("ma");
+ tb.writeJavaFiles(src2ma,
+ "package ma.impl; public class C2 { public static void extra() { ma.C1.method(); } }",
+ "package ma.impl; public class C3 { public void test() { C2.extra(); } }");
+ Path src2mb = src2.resolve("mb");
+ tb.writeJavaFiles(src2mb,
+ "package mb.impl; public class C3 { public void test() { C2.method(); ma.C1.method(); ma.impl.C2.extra(); } }");
+ Path src2mc = src2.resolve("mc");
+ tb.writeJavaFiles(src2mc,
+ "package mc.impl; public class C2 { public static void test() { } }",
+ //will require --add-reads ma:
+ "package mc.impl; public class C3 { public static void test() { ma.impl.C2.extra(); } }");
+ Path src2mt = src2.resolve("mt");
+ tb.writeJavaFiles(src2mt,
+ "module mt { requires ma; requires mb; }",
+ "package mt.impl; public class C2 { public static void test() { mb.impl.C2.method(); ma.impl.C2.extra(); } }",
+ "package mt.impl; public class C3 { public static void test() { C2.test(); mc.impl.C2.test(); } }");
+ Path classes2 = base.resolve("classes2");
+ tb.createDirectories(classes2);
+ tb.cleanDirectory(classes2);
+
+ Thread.sleep(2000); //ensure newer timestamps on classfiles:
+
+ new JavacTask(tb)
+ .options("--module-path", classes1.toString(),
+ "--patch-module", "ma=" + src2ma.toString(),
+ "--patch-module", "mb=" + src2mb.toString(),
+ "--add-exports", "ma/ma.impl=mb",
+ "--patch-module", "mc=" + src2mc.toString(),
+ "--add-reads", "mc=ma",
+ "--add-exports", "ma/ma.impl=mc",
+ "--add-exports", "ma/ma.impl=mt",
+ "--add-exports", "mb/mb.impl=mt",
+ "--add-exports", "mc/mc.impl=mt",
+ "--add-reads", "mt=mc",
+ "--module-source-path", src2.toString())
+ .outdir(classes2)
+ .files(findJavaFiles(src2))
+ .run()
+ .writeAll();
+
+ //incremental compilation (C2 mustn't be compiled, C3 must):
+ tb.writeJavaFiles(src2ma,
+ "package ma.impl; public class C3 { public void test() { ma.C1.method(); C2.extra(); } }");
+ tb.writeJavaFiles(src2mt,
+ "package mt.impl; public class C3 { public static void test() { mc.impl.C2.test(); C2.test(); } }");
+
+ List<String> log = new JavacTask(tb)
+ .options("--module-path", classes1.toString(),
+ "--patch-module", "ma=" + src2ma.toString(),
+ "--patch-module", "mb=" + src2mb.toString(),
+ "--add-exports", "ma/ma.impl=mb",
+ "--patch-module", "mc=" + src2mc.toString(),
+ "--add-reads", "mc=ma",
+ "--add-exports", "ma/ma.impl=mc",
+ "--add-exports", "ma/ma.impl=mt",
+ "--add-exports", "mb/mb.impl=mt",
+ "--add-exports", "mc/mc.impl=mt",
+ "--add-reads", "mt=mc",
+ "--module-source-path", src2.toString(),
+ "--add-modules", "mc",
+ "-verbose")
+ .outdir(classes2)
+ .files(src2ma.resolve("ma").resolve("impl").resolve("C3.java"),
+ src2mt.resolve("mt").resolve("impl").resolve("C3.java"))
+ .run()
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT)
+ .stream()
+ .filter(l -> l.contains("parsing"))
+ .collect(Collectors.toList());
+
+ boolean parsesC3 = log.stream()
+ .anyMatch(l -> l.contains("C3.java"));
+ boolean parsesC2 = log.stream()
+ .anyMatch(l -> l.contains("C2.java"));
+
+ if (!parsesC3 || parsesC2) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+ }
+
private void checkFileExists(Path dir, String path) {
Path toCheck = dir.resolve(path.replace("/", dir.getFileSystem().getSeparator()));
if (!Files.exists(toCheck)) {
throw new AssertionError(toCheck.toString() + " does not exist!");
< prev index next >