diff -r 640eb9781ce5 -r 0d00f3ea77bc langtools/test/tools/javac/modules/MissingModuleTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/MissingModuleTest.java Fri Feb 03 08:16:24 2017 -0800 @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8172240 + * @summary javac should not need the transitive closure to compile a module + * @library /tools/lib + * @modules + * jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.code + * jdk.compiler/com.sun.tools.javac.main + * jdk.compiler/com.sun.tools.javac.processing + * @build toolbox.ToolBox toolbox.JavacTask toolbox.ModuleBuilder ModuleTestBase + * @run main MissingModuleTest + */ + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; + +import toolbox.JavacTask; +import toolbox.Task; +import toolbox.Task.Expect; + +public class MissingModuleTest extends ModuleTestBase { + + public static void main(String... args) throws Exception { + new MissingModuleTest().runTests(); + } + + @Test + public void testMissingNotNeeded(Path base) throws Exception { + doTest(base, "m1x", new String[0]); + } + + @Test + public void testMissingNeededTransitive(Path base) throws Exception { + doTest(base, "m2x", "- compiler.err.module.not.found: m2x", "1 error"); + } + + @Test + public void testMissingNeededDirect(Path base) throws Exception { + doTest(base, "m3x", "module-info.java:1:24: compiler.err.module.not.found: m3x", "1 error"); + } + + @Test + public void testMultipleErrors(Path base) throws Exception { + doTest(base, "m4x", "module-info.java:1:38: compiler.err.module.not.found: m4x", "1 error"); + } + + private void doTest(Path base, String toDelete, String... errors) throws Exception { + //note: avoiding use of java.base, as that gets special handling on some places: + Path srcMP = base.resolve("src-mp"); + Path m1x = srcMP.resolve("m1x"); + tb.writeJavaFiles(m1x, + "module m1x { exports api1; }", + "package api1; public interface Api { }"); + Path m2x = srcMP.resolve("m2x"); + tb.writeJavaFiles(m2x, + "module m2x { requires m1x; exports api2; }", + "package api2; public interface Api { }"); + Path m3x = srcMP.resolve("m3x"); + tb.writeJavaFiles(m3x, + "module m3x { requires transitive m2x; }"); + Path m4x = srcMP.resolve("m4x"); + tb.writeJavaFiles(m4x, + "module m4x { requires transitive m2x; }"); + Path m5x = srcMP.resolve("m5x"); + tb.writeJavaFiles(m5x, + "module m5x { requires transitive m4x; }"); + Path classesMP = base.resolve("classes-mp"); + tb.createDirectories(classesMP); + + new JavacTask(tb) + .options("--module-source-path", srcMP.toString()) + .outdir(classesMP) + .files(findJavaFiles(srcMP)) + .run() + .writeAll(); + + tb.cleanDirectory(classesMP.resolve(toDelete)); + Files.delete(classesMP.resolve(toDelete)); + + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + "module test { requires m3x; requires m4x; requires m5x; } "); + Path classes = base.resolve("classes"); + tb.createDirectories(classes); + + List log = new JavacTask(tb) + .options("--module-path", classesMP.toString(), + "-XDrawDiagnostics") + .outdir(classes) + .files(findJavaFiles(src)) + .run(errors.length > 0 ? Expect.FAIL : Expect.SUCCESS) + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + + if (errors.length == 0) { + errors = new String[] {""}; + } + + if (!log.equals(Arrays.asList(errors))) + throw new Exception("expected output not found: " + log); + } + +}