UpgradeModulePathTest.java revision 3822:d8766c39123a
1144518Sdavidxu/*
2144518Sdavidxu * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
3144518Sdavidxu * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4144518Sdavidxu *
5144518Sdavidxu * This code is free software; you can redistribute it and/or modify it
6144518Sdavidxu * under the terms of the GNU General Public License version 2 only, as
7144518Sdavidxu * published by the Free Software Foundation.
8144518Sdavidxu *
9144518Sdavidxu * This code is distributed in the hope that it will be useful, but WITHOUT
10144518Sdavidxu * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11144518Sdavidxu * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12144518Sdavidxu * version 2 for more details (a copy is included in the LICENSE file that
13144518Sdavidxu * accompanied this code).
14144518Sdavidxu *
15144518Sdavidxu * You should have received a copy of the GNU General Public License version
16144518Sdavidxu * 2 along with this work; if not, write to the Free Software Foundation,
17144518Sdavidxu * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18144518Sdavidxu *
19144518Sdavidxu * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20144518Sdavidxu * or visit www.oracle.com if you need additional information or have any
21144518Sdavidxu * questions.
22144518Sdavidxu */
23144518Sdavidxu
24144518Sdavidxu/*
25144518Sdavidxu * @test
26144518Sdavidxu * @summary tests for --upgrade-module-path
27144518Sdavidxu * @library /tools/lib
28144518Sdavidxu * @modules
29144518Sdavidxu *      jdk.compiler/com.sun.tools.javac.api
30144518Sdavidxu *      jdk.compiler/com.sun.tools.javac.main
31144518Sdavidxu * @build toolbox.ToolBox toolbox.JavacTask toolbox.ModuleBuilder ModuleTestBase
32162061Sdavidxu * @run main UpgradeModulePathTest
33144518Sdavidxu */
34144518Sdavidxu
35300043Skibimport java.io.File;
36300043Skibimport java.nio.file.Path;
37300043Skib
38300043Skibimport toolbox.JavacTask;
39300043Skibimport toolbox.ModuleBuilder;
40212077Sdavidxuimport toolbox.Task;
41162061Sdavidxu
42233912Sdavidxupublic class UpgradeModulePathTest extends ModuleTestBase {
43179970Sdavidxu
44216641Sdavidxu    public static void main(String... args) throws Exception {
45179970Sdavidxu        UpgradeModulePathTest t = new UpgradeModulePathTest();
46161680Sdavidxu        t.runTests();
47319430Svangyzen    }
48163334Sdavidxu
49161680Sdavidxu    @Test
50161680Sdavidxu    public void simpleUsage(Path base) throws Exception {
51161680Sdavidxu        Path modules = base.resolve("modules");
52163334Sdavidxu        new ModuleBuilder(tb, "m1x")
53212077Sdavidxu                .exports("pkg1")
54212077Sdavidxu                .classes("package pkg1; public class E { }")
55173801Sdavidxu                .build(modules);
56162061Sdavidxu
57173801Sdavidxu        final Path upgradeModules = base.resolve("upgradeModules");
58178647Sdavidxu        new ModuleBuilder(tb, "m1x")
59216641Sdavidxu                .exports("pkg2")
60216641Sdavidxu                .classes("package pkg2; public class E { }")
61178647Sdavidxu                .build(upgradeModules);
62164877Sdavidxu
63249985Sjilles        Path src = base.resolve("src");
64164902Sdavidxu        tb.writeJavaFiles(src, "module m2x { requires m1x; }",
65164902Sdavidxu                "package p; class A { void main() { pkg2.E.class.getName(); } }");
66164902Sdavidxu
67162061Sdavidxu        new JavacTask(tb, Task.Mode.CMDLINE)
68232209Sdavidxu                .options("--module-path", modules.toString(),
69232209Sdavidxu                        "--upgrade-module-path", upgradeModules.toString())
70232209Sdavidxu                .files(findJavaFiles(src))
71232209Sdavidxu                .run()
72177850Sdavidxu                .writeAll();
73177850Sdavidxu    }
74212076Sdavidxu
75212076Sdavidxu    @Test
76212076Sdavidxu    public void onlyUpgradeModulePath(Path base) throws Exception {
77212076Sdavidxu        final Path module = base.resolve("modules");
78212076Sdavidxu        new ModuleBuilder(tb, "m1x")
79144518Sdavidxu                .exports("pkg1")
80161680Sdavidxu                .classes("package pkg1; public class E { }")
81161680Sdavidxu                .build(module);
82300043Skib
83300043Skib        final Path upgradeModule = base.resolve("upgradeModule");
84300043Skib        new ModuleBuilder(tb, "m1x")
85300043Skib                .exports("pkg2")
86300043Skib                .classes("package pkg2; public class E { }")
87300043Skib                .build(upgradeModule);
88300043Skib
89300043Skib        Path src = base.resolve("src");
90300043Skib        tb.writeJavaFiles(src, "module m2x { requires m1x; }",
91300043Skib                "package p; class A { void main() { pkg2.E.class.getName(); } }");
92300043Skib
93300043Skib        new JavacTask(tb, Task.Mode.CMDLINE)
94161680Sdavidxu                .options("--upgrade-module-path", upgradeModule + File.pathSeparator + module)
95161680Sdavidxu                .files(findJavaFiles(src))
96161680Sdavidxu                .run()
97165206Sdavidxu                .writeAll();
98165206Sdavidxu    }
99300043Skib
100300043Skib    @Test
101179970Sdavidxu    public void withModuleSourcePath(Path base) throws Exception {
102300043Skib        final Path module = base.resolve("modules");
103300043Skib        new ModuleBuilder(tb, "m1x")
104300043Skib                .exports("pkg1")
105300043Skib                .classes("package pkg1; public class E { }")
106300043Skib                .build(module);
107300043Skib
108300043Skib        final Path upgradeModule = base.resolve("upgradeModule");
109300043Skib        new ModuleBuilder(tb, "m1x")
110300043Skib                .exports("pkg2")
111300043Skib                .classes("package pkg2; public class E { }")
112300043Skib                .build(upgradeModule);
113300043Skib
114300043Skib        final Path s = base.resolve("source");
115165206Sdavidxu        tb.writeJavaFiles(s.resolve("m3x"), "module m3x { }");
116165206Sdavidxu
117165206Sdavidxu        final Path upgradeModule3 = base.resolve("upgradeModule");
118161680Sdavidxu        new ModuleBuilder(tb, "m3x")
119161680Sdavidxu                .exports("pkg3")
120300043Skib                .classes("package pkg3; public class E { }")
121300043Skib                .build(upgradeModule);
122300043Skib
123300043Skib        Path src = base.resolve("src");
124161680Sdavidxu        tb.writeJavaFiles(src.resolve("m2x"), "module m2x { requires m1x; requires m3x; }",
125161680Sdavidxu                "package p; class A { void main() { pkg2.E.class.getName(); } }");
126161680Sdavidxu
127216641Sdavidxu        new JavacTask(tb, Task.Mode.CMDLINE)
128216641Sdavidxu                .options("--module-path", module.toString(),
129300043Skib                        "--module-source-path", src + File.pathSeparator + s,
130300043Skib                        "--upgrade-module-path", upgradeModule + File.pathSeparator + upgradeModule3)
131300043Skib                .outdir(module)
132300043Skib                .files(findJavaFiles(src))
133216641Sdavidxu                .run()
134216641Sdavidxu                .writeAll();
135216641Sdavidxu    }
136161680Sdavidxu
137300043Skib    @Test
138161680Sdavidxu    public void sameUpgradeAndModulePath(Path base) throws Exception {
139300043Skib        final Path module = base.resolve("modules");
140300043Skib        new ModuleBuilder(tb, "m1x")
141300043Skib                .exports("pkg1")
142300043Skib                .classes("package pkg1; public class E { }")
143161680Sdavidxu                .build(module);
144161680Sdavidxu
145161680Sdavidxu        final Path upgradeModule = base.resolve("upgradeModule");
146239200Sdavidxu        new ModuleBuilder(tb, "m1x")
147161680Sdavidxu                .exports("pkg2")
148300043Skib                .classes("package pkg2; public class E { }")
149300043Skib                .build(upgradeModule);
150233912Sdavidxu
151300043Skib        Path src = base.resolve("src");
152300043Skib        tb.writeJavaFiles(src, "module m2x { requires m1x; }",
153300043Skib                "package p; class A { void main() { pkg2.E.class.getName(); } }");
154300043Skib
155300043Skib        new JavacTask(tb, Task.Mode.CMDLINE)
156300043Skib                .options("--module-path", upgradeModule + File.pathSeparator + module,
157300043Skib                        "--upgrade-module-path", upgradeModule.toString())
158319430Svangyzen                .files(findJavaFiles(src))
159233912Sdavidxu                .run()
160300043Skib                .writeAll();
161300043Skib    }
162300043Skib
163300043Skib    @Test
164300043Skib    public void dummyFileInUpgradeModulePath(Path base) throws Exception {
165300043Skib        final Path module = base.resolve("modules");
166300043Skib        new ModuleBuilder(tb, "m1x")
167300043Skib                .exports("pkg1")
168300043Skib                .classes("package pkg1; public class E { }")
169300043Skib                .build(module);
170300043Skib
171300043Skib        Path dummy = base.resolve("dummy.txt");
172300043Skib        tb.writeFile(dummy, "");
173300043Skib
174300043Skib        Path src = base.resolve("src");
175161680Sdavidxu        tb.writeJavaFiles(src, "module m2x { requires m1x; }",
176161680Sdavidxu                "package p; class A { void main() { pkg2.E.class.getName(); } }");
177177850Sdavidxu
178239200Sdavidxu        String output = new JavacTask(tb, Task.Mode.CMDLINE)
179239200Sdavidxu                .options("-XDrawDiagnostics",
180300043Skib                        "--module-path", module.toString(),
181300043Skib                        "--upgrade-module-path", dummy.toString())
182239200Sdavidxu                .files(findJavaFiles(src))
183239200Sdavidxu                .run(Task.Expect.FAIL)
184239200Sdavidxu                .writeAll()
185177850Sdavidxu                .getOutput(Task.OutputKind.DIRECT);
186177850Sdavidxu        if (!output.contains("compiler.err.illegal.argument.for.option: --upgrade-module-path, " + dummy)) {
187300043Skib            throw new Exception("Expected output was not found");
188177850Sdavidxu        }
189300043Skib    }
190300043Skib
191177850Sdavidxu    @Test
192177850Sdavidxu    public void severalUpgradeModules(Path base) throws Exception {
193177850Sdavidxu        final Path module = base.resolve("modules");
194177850Sdavidxu        new ModuleBuilder(tb, "m1x")
195177850Sdavidxu                .exports("pkg1")
196300043Skib                .classes("package pkg1; public class A { }")
197300043Skib                .build(module);
198177850Sdavidxu
199177850Sdavidxu        new ModuleBuilder(tb, "m2x")
200177850Sdavidxu                .exports("pkg2")
201177850Sdavidxu                .classes("package pkg2; public class B { }")
202177850Sdavidxu                .build(module);
203177850Sdavidxu
204177850Sdavidxu        Path upgradeModule = base.resolve("upgradeModule");
205177850Sdavidxu        new ModuleBuilder(tb, "m2x")
206177850Sdavidxu                .exports("pkg2")
207177850Sdavidxu                .classes("package pkg2; public class BC { }")
208177850Sdavidxu                .build(upgradeModule);
209177850Sdavidxu        new ModuleBuilder(tb, "m3x")
210177850Sdavidxu                .exports("pkg3")
211177850Sdavidxu                .classes("package pkg3; public class DC { }")
212177850Sdavidxu                .build(upgradeModule);
213300043Skib
214300043Skib        Path src = base.resolve("src");
215300043Skib        tb.writeJavaFiles(src, "module m4x { requires m1x; requires m2x; requires m3x; }",
216300043Skib                "package p; class A { void main() { pkg1.A.class.getName(); pkg2.BC.class.getName(); pkg3.DC.class.getName(); } }");
217177850Sdavidxu
218177850Sdavidxu        new JavacTask(tb, Task.Mode.CMDLINE)
219177850Sdavidxu                .options("--module-path", module.toString(),
220177850Sdavidxu                        "--upgrade-module-path", upgradeModule.toString())
221177850Sdavidxu                .files(findJavaFiles(src))
222177850Sdavidxu                .run()
223177850Sdavidxu                .writeAll();
224177850Sdavidxu
225177850Sdavidxu        Path src2 = base.resolve("src2");
226177850Sdavidxu        tb.writeJavaFiles(src2, "module m4x { requires m1x; }",
227300043Skib                "package p; class A { void main() { pkg2.B.class.getName(); } }");
228177850Sdavidxu
229177850Sdavidxu        String log = new JavacTask(tb, Task.Mode.CMDLINE)
230177850Sdavidxu                .options("-XDrawDiagnostics",
231177850Sdavidxu                        "--module-path", module.toString(),
232177850Sdavidxu                        "--upgrade-module-path", upgradeModule.toString())
233177850Sdavidxu                .files(findJavaFiles(src2))
234177850Sdavidxu                .run(Task.Expect.FAIL)
235177850Sdavidxu                .writeAll()
236300043Skib                .getOutput(Task.OutputKind.DIRECT);
237177850Sdavidxu        if (!log.contains("compiler.err.doesnt.exist: pkg2")) {
238177850Sdavidxu            throw new Exception("Expected output was not found");
239177850Sdavidxu        }
240177850Sdavidxu    }
241177850Sdavidxu
242177850Sdavidxu    @Test
243177850Sdavidxu    public void severalUpgradeModulePathsLastWin(Path base) throws Exception {
244177850Sdavidxu        final Path module = base.resolve("modules");
245177850Sdavidxu        new ModuleBuilder(tb, "m1x")
246177850Sdavidxu                .exports("pkg1")
247177850Sdavidxu                .classes("package pkg1; public class E { }")
248300043Skib                .build(module);
249300043Skib
250300043Skib        final Path upgradeModule1 = base.resolve("upgradeModule1");
251177850Sdavidxu        new ModuleBuilder(tb, "m1x")
252177850Sdavidxu                .exports("pkg2")
253177850Sdavidxu                .classes("package pkg2; public class EC1 { }")
254177850Sdavidxu                .build(upgradeModule1);
255177850Sdavidxu
256197445Sattilio        final Path upgradeModule2 = base.resolve("upgradeModule2");
257300043Skib        new ModuleBuilder(tb, "m1x")
258197445Sattilio                .exports("pkg2")
259197445Sattilio                .classes("package pkg2; public class EC2 { }")
260300043Skib                .build(upgradeModule2);
261177850Sdavidxu
262177850Sdavidxu        Path src = base.resolve("src");
263177850Sdavidxu        tb.writeJavaFiles(src, "module m2x { requires m1x; }",
264177850Sdavidxu                "package p; class A { void main() { pkg2.EC2.class.getName(); } }");
265177850Sdavidxu
266177850Sdavidxu        new JavacTask(tb, Task.Mode.CMDLINE)
267177850Sdavidxu                .options("--module-path", module.toString(),
268177850Sdavidxu                        "--upgrade-module-path", upgradeModule1.toString(),
269177850Sdavidxu                        "--upgrade-module-path", upgradeModule2.toString())
270144518Sdavidxu                .files(findJavaFiles(src))
271                .run()
272                .writeAll();
273
274        Path src2 = base.resolve("src2");
275        tb.writeJavaFiles(src2, "module m2x { requires m1x; }",
276                "package p; class A { void main() { pkg2.EC1.class.getName(); } }");
277
278        final String log = new JavacTask(tb, Task.Mode.CMDLINE)
279                .options("-XDrawDiagnostics",
280                        "--module-path", module.toString(),
281                        "--upgrade-module-path", upgradeModule1.toString(),
282                        "--upgrade-module-path", upgradeModule2.toString())
283                .files(findJavaFiles(src2))
284                .run(Task.Expect.FAIL)
285                .writeAll()
286                .getOutput(Task.OutputKind.DIRECT);
287
288        if (!log.contains("compiler.err.cant.resolve.location: kindname.class, EC1, , , (compiler.misc.location: kindname.package, pkg2, null)")) {
289            throw new Exception("Expected output was not found");
290        }
291    }
292}
293