MultiModuleModeTest.java revision 3294:9adfb22ff08f
159191Skris/*
259191Skris * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
359191Skris * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
459191Skris *
559191Skris * This code is free software; you can redistribute it and/or modify it
659191Skris * under the terms of the GNU General Public License version 2 only, as
759191Skris * published by the Free Software Foundation.
859191Skris *
959191Skris * This code is distributed in the hope that it will be useful, but WITHOUT
1059191Skris * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1159191Skris * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1259191Skris * version 2 for more details (a copy is included in the LICENSE file that
1359191Skris * accompanied this code).
1459191Skris *
1559191Skris * You should have received a copy of the GNU General Public License version
1659191Skris * 2 along with this work; if not, write to the Free Software Foundation,
1759191Skris * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1859191Skris *
1959191Skris * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2059191Skris * or visit www.oracle.com if you need additional information or have any
2159191Skris * questions.
2259191Skris */
2359191Skris
2459191Skris/*
2559191Skris * @test
2659191Skris * @summary tests for multi-module mode compilation
2759191Skris * @library /tools/lib
2859191Skris * @modules
2959191Skris *      jdk.compiler/com.sun.tools.javac.api
3059191Skris *      jdk.compiler/com.sun.tools.javac.main
3159191Skris *      jdk.jdeps/com.sun.tools.javap
3259191Skris * @build ToolBox ModuleTestBase
3359191Skris * @run main MultiModuleModeTest
34 */
35
36import java.nio.file.Files;
37import java.nio.file.Path;
38import java.util.ArrayList;
39import java.util.Arrays;
40import java.util.List;
41
42public class MultiModuleModeTest extends ModuleTestBase {
43
44    public static void main(String... args) throws Exception {
45        new MultiModuleModeTest().runTests();
46    }
47
48    @Test
49    void testDuplicateModules(Path base) throws Exception {
50        Path src = base.resolve("src");
51        Path src_m1 = src.resolve("m1");
52        tb.writeJavaFiles(src_m1, "module m1 { }");
53        Path src_m2 = src.resolve("m2");
54        tb.writeJavaFiles(src_m2, "module m1 { }");
55        Path classes = base.resolve("classes");
56        tb.createDirectories(classes);
57
58        String log = tb.new JavacTask()
59                .options("-XDrawDiagnostics",
60                        "-modulesourcepath", src.toString())
61                .outdir(classes)
62                .files(findJavaFiles(src))
63                .run(ToolBox.Expect.FAIL)
64                .writeAll()
65                .getOutput(ToolBox.OutputKind.DIRECT);
66
67        if (!log.contains("module-info.java:1:1: compiler.err.duplicate.module: m1"))
68            throw new Exception("expected output not found");
69    }
70
71    @Test
72    void testCantFindModule(Path base) throws Exception {
73        Path src = base.resolve("src");
74        Path src_m1 = src.resolve("m1");
75        tb.writeJavaFiles(src_m1, "module m1 { }");
76        Path misc = base.resolve("misc");
77        tb.writeJavaFiles(misc, "package p; class C { }");
78        Path classes = base.resolve("classes");
79        tb.createDirectories(classes);
80
81        String log = tb.new JavacTask()
82                .options("-XDrawDiagnostics",
83                        "-modulesourcepath", src.toString())
84                .outdir(classes)
85                .files(join(findJavaFiles(src), findJavaFiles(misc)))
86                .run(ToolBox.Expect.FAIL)
87                .writeAll()
88                .getOutput(ToolBox.OutputKind.DIRECT);
89
90        if (!log.contains("C.java:1:1: compiler.err.unnamed.pkg.not.allowed.named.modules"))
91            throw new Exception("expected output not found");
92    }
93
94    @Test
95    void testModuleNameMismatch(Path base) throws Exception {
96        Path src = base.resolve("src");
97        Path src_m1 = src.resolve("m1");
98        tb.writeJavaFiles(src_m1, "module m2 { }");
99        Path classes = base.resolve("classes");
100        tb.createDirectories(classes);
101
102        String log = tb.new JavacTask()
103                .options("-XDrawDiagnostics",
104                        "-modulesourcepath", src.toString())
105                .outdir(classes)
106                .files(findJavaFiles(src))
107                .run(ToolBox.Expect.FAIL)
108                .writeAll()
109                .getOutput(ToolBox.OutputKind.DIRECT);
110
111        if (!log.contains("module-info.java:1:8: compiler.err.module.name.mismatch: m2, m1"))
112            throw new Exception("expected output not found");
113    }
114
115    @Test
116    void testImplicitModuleSource(Path base) throws Exception {
117        Path src = base.resolve("src");
118        tb.writeJavaFiles(src.resolve("m1"), "module m1 { }");
119        tb.writeJavaFiles(src.resolve("m2"), "module m2 { requires m1; }");
120        Path modules = base.resolve("modules");
121        Files.createDirectories(modules);
122
123        tb.new JavacTask()
124                .options("-modulesourcepath", src.toString())
125                .outdir(modules)
126                .files(src.resolve("m2/module-info.java"))
127                .run()
128                .writeAll();
129    }
130
131    @Test
132    void testImplicitModuleClass(Path base) throws Exception {
133        Path src1 = base.resolve("src1");
134        tb.writeJavaFiles(src1.resolve("m1"), "module m1 { }");
135        Path modules1 = base.resolve("modules1");
136        Files.createDirectories(modules1);
137
138        tb.new JavacTask()
139                .options("-modulesourcepath", src1.toString())
140                .outdir(modules1)
141                .files(src1.resolve("m1/module-info.java"))
142                .run()
143                .writeAll();
144
145        Path src2= base.resolve("src2");
146        tb.writeJavaFiles(src2.resolve("m2"), "module m2 { requires m1; }");
147        Path modules2 = base.resolve("modules2");
148        Files.createDirectories(modules2);
149
150        tb.new JavacTask()
151                .options("-modulepath", modules1.toString(),
152                        "-modulesourcepath", src2.toString())
153                .outdir(modules2)
154                .files(src2.resolve("m2/module-info.java"))
155                .run()
156                .writeAll();
157    }
158
159    Path[] join(Path[] a, Path[] b) {
160        List<Path> result = new ArrayList<>();
161        result.addAll(Arrays.asList(a));
162        result.addAll(Arrays.asList(b));
163        return result.toArray(new Path[result.size()]);
164    }
165}
166