Modules.java revision 3595:81692f730015
1259698Sdim/*
2259698Sdim * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3259698Sdim * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4259698Sdim *
5259698Sdim * This code is free software; you can redistribute it and/or modify it
6259698Sdim * under the terms of the GNU General Public License version 2 only, as
7259698Sdim * published by the Free Software Foundation.
8259698Sdim *
9259698Sdim * This code is distributed in the hope that it will be useful, but WITHOUT
10259698Sdim * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11259698Sdim * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12259698Sdim * version 2 for more details (a copy is included in the LICENSE file that
13259698Sdim * accompanied this code).
14259698Sdim *
15259698Sdim * You should have received a copy of the GNU General Public License version
16259698Sdim * 2 along with this work; if not, write to the Free Software Foundation,
17259698Sdim * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18259698Sdim *
19259698Sdim * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20259698Sdim * or visit www.oracle.com if you need additional information or have any
21259698Sdim * questions.
22259698Sdim */
23259698Sdim
24259698Sdim/**
25259698Sdim * @test
26259698Sdim * @bug 8159305
27259698Sdim * @summary Tests primarily the module graph computations.
28259698Sdim * @modules
29259698Sdim *      jdk.javadoc/jdk.javadoc.internal.api
30259698Sdim *      jdk.javadoc/jdk.javadoc.internal.doclets.standard
31259698Sdim *      jdk.javadoc/jdk.javadoc.internal.tool
32259698Sdim *      jdk.compiler/com.sun.tools.javac.api
33259698Sdim *      jdk.compiler/com.sun.tools.javac.main
34259698Sdim * @library /tools/lib
35259698Sdim * @build toolbox.ToolBox toolbox.TestRunner
36259698Sdim * @run main Modules
37259698Sdim */
38259698Sdim
39259698Sdimimport java.io.IOException;
40259698Sdimimport java.nio.file.Files;
41259698Sdimimport java.nio.file.Path;
42259698Sdim
43259698Sdimimport toolbox.*;
44259698Sdim
45259698Sdimpublic class Modules extends ModuleTestBase {
46259698Sdim
47259698Sdim    public static void main(String... args) throws Exception {
48259698Sdim        new Modules().runTests();
49259698Sdim    }
50259698Sdim
51259698Sdim    @Test
52259698Sdim    public void testBasicMoption(Path base) throws Exception {
53259698Sdim        Files.createDirectory(base);
54259698Sdim        Path src = base.resolve("src");
55259698Sdim        ModuleBuilder mb = new ModuleBuilder(tb, "m1");
56259698Sdim        mb.comment("The first module.")
57259698Sdim                .exports("pub")
58259698Sdim                .classes("package pub; /** Klass A */ public class A {}")
59259698Sdim                .classes("package pro; /** Klass B */ public class B {}")
60259698Sdim                .write(src);
61259698Sdim        execTask("-modulesourcepath", src.toString(),
62259698Sdim                 "--module", "m1");
63259698Sdim        checkModulesSpecified("m1");
64259698Sdim        checkPackagesIncluded("pub");
65259698Sdim        checkTypesIncluded("pub.A");
66259698Sdim    }
67259698Sdim
68259698Sdim    @Test
69259698Sdim    public void testMultipleModulesOption1(Path base) throws Exception {
70259698Sdim        Path src = base.resolve("src");
71259698Sdim
72259698Sdim        ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
73259698Sdim        mb1.comment("The first module.")
74259698Sdim                .exports("m1pub")
75259698Sdim                .requires("m2")
76259698Sdim                .classes("package m1pub; /** Klass A */ public class A {}")
77259698Sdim                .classes("package m1pro; /** Klass B */ public class B {}")
78259698Sdim                .write(src);
79259698Sdim
80259698Sdim        ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
81259698Sdim        mb2.comment("The second module.")
82259698Sdim                .exports("m2pub")
83259698Sdim                .classes("package m2pub; /** Klass A */ public class A {}")
84259698Sdim                .classes("package m2pro; /** Klass B */ public class B {}")
85259698Sdim                .write(src);
86259698Sdim        execTask("-modulesourcepath", src.toString(),
87259698Sdim            "--module", "m1,m2");
88259698Sdim        checkModulesSpecified("m1", "m2");
89259698Sdim        checkPackagesIncluded("m1pub", "m2pub");
90259698Sdim        checkTypesIncluded("m1pub.A", "m2pub.A");
91259698Sdim
92259698Sdim    }
93259698Sdim
94259698Sdim    @Test
95259698Sdim    public void testMultipleModulesAggregatedModuleOption(Path base) throws Exception {
96259698Sdim        Path src = base.resolve("src");
97259698Sdim
98259698Sdim        ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
99259698Sdim        mb1.comment("The first module.")
100259698Sdim                .exports("m1pub")
101259698Sdim                .requires("m2")
102259698Sdim                .classes("package m1pub; /** Klass A */ public class A {}")
103259698Sdim                .classes("package m1pro; /** Klass B */ public class B {}")
104259698Sdim                .write(src);
105259698Sdim
106259698Sdim        ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
107259698Sdim        mb2.comment("The second module.")
108259698Sdim                .exports("m2pub")
109259698Sdim                .classes("package m2pub; /** Klass A */ public class A {}")
110259698Sdim                .classes("package m2pro; /** Klass B */ public class B {}")
111259698Sdim                .write(src);
112259698Sdim        execTask("-modulesourcepath", src.toString(),
113259698Sdim            "--module", "m1",
114259698Sdim            "--module", "m2");
115259698Sdim        checkModulesSpecified("m1", "m2");
116259698Sdim        checkPackagesIncluded("m1pub", "m2pub");
117259698Sdim        checkTypesIncluded("m1pub.A", "m2pub.A");
118259698Sdim
119    }
120
121   /**
122     * Tests diamond graph, inspired by javac diamond tests.
123     *
124     *
125     * Module M : test module, with variable requires
126     *
127     * Module N :
128     *     requires public O  --->   Module O:
129     *                                 requires J   ---->   Module J:
130     *                                 exports openO          exports openJ
131     *
132     *
133     * Module L :
134     *     requires public P  --->   Module P:
135     *                                 exports openP
136     *
137     *
138     */
139
140    @Test
141    public void testExpandRequiresNone(Path base) throws Exception {
142        Path src = base.resolve("src");
143
144        createAuxiliaryModules(src);
145
146        new ModuleBuilder(tb, "M")
147                .comment("The M module.")
148                .requires("N", src)
149                .requires("L", src)
150                .requires("O", src)
151                .exports("p")
152                .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
153                .write(src);
154
155        execTask("-modulesourcepath", src.toString(),
156                "--module", "M");
157
158        checkModulesSpecified("M");
159        checkModulesIncluded("M");
160        checkPackagesIncluded("p");
161        checkTypesIncluded("p.Main");
162        checkPackagesNotIncluded(".*open.*");
163    }
164
165    @Test
166    public void testExpandRequiresPublic(Path base) throws Exception {
167        Path src = base.resolve("src");
168
169        createAuxiliaryModules(src);
170
171        new ModuleBuilder(tb, "M")
172                .comment("The M module.")
173                .requiresPublic("N", src)
174                .requires("L", src)
175                .exports("p")
176                .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
177                .write(src);
178
179        execTask("-modulesourcepath", src.toString(),
180                "--module", "M",
181                "--expand-requires:public");
182
183        checkModulesSpecified("M", "N", "O");
184        checkModulesIncluded("M", "N", "O");
185        checkPackagesIncluded("p", "openN", "openO");
186        checkTypesIncluded("p.Main", "openN.N", "openO.O");
187    }
188
189    @Test
190    public void testExpandRequiresAll(Path base) throws Exception {
191        Path src = base.resolve("src");
192
193        createAuxiliaryModules(src);
194
195        new ModuleBuilder(tb, "M")
196                .comment("The M module.")
197                .requiresPublic("N", src)
198                .requires("L", src)
199                .requires("O", src)
200                .exports("p")
201                .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
202                .write(src);
203
204        execTask("-modulesourcepath", src.toString(),
205                "--module", "M",
206                "--expand-requires:all");
207
208        checkModulesSpecified("M", "java.base", "N", "L", "O");
209        checkModulesIncluded("M", "java.base", "N", "L", "O");
210        checkModulesNotIncluded("P", "J", "Q");
211        checkPackagesIncluded("p", "openN", "openL", "openO");
212        checkPackagesNotIncluded(".*openP.*", ".*openJ.*");
213        checkTypesIncluded("p.Main", "openN.N", "openL.L", "openO.O");
214        checkTypesNotIncluded(".*openP.*", ".*openJ.*");
215    }
216
217    @Test
218    public void testMissingModule(Path base) throws Exception {
219        Path src = base.resolve("src");
220
221        createAuxiliaryModules(src);
222
223        new ModuleBuilder(tb, "M")
224                .comment("The M module.")
225                .requiresPublic("N", src)
226                .requires("L", src)
227                .requires("O", src)
228                .exports("p")
229                .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
230                .write(src);
231
232        execNegativeTask("-modulesourcepath", src.toString(),
233                "--module", "MIA",
234                "--expand-requires:all");
235
236        assertErrorPresent("javadoc: error - module MIA not found.");
237    }
238
239    @Test
240    public void testMissingModuleMultiModuleCmdline(Path base) throws Exception {
241        Path src = base.resolve("src");
242
243        createAuxiliaryModules(src);
244
245        new ModuleBuilder(tb, "M")
246                .comment("The M module.")
247                .requiresPublic("N", src)
248                .requires("L", src)
249                .requires("O", src)
250                .exports("p")
251                .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
252                .write(src);
253
254        execNegativeTask("-modulesourcepath", src.toString(),
255                "--module", "M,N,L,MIA,O,P",
256                "--expand-requires:all");
257
258        assertErrorPresent("javadoc: error - module MIA not found");
259    }
260
261    void createAuxiliaryModules(Path src) throws IOException {
262
263        new ModuleBuilder(tb, "J")
264                .comment("The J module.")
265                .exports("openJ")
266                .classes("package openJ;  /** Klass J open. */ public class J { }")
267                .classes("package closedJ; /** Klass J closed. */ public class J  { }")
268                .write(src);
269
270        new ModuleBuilder(tb, "L")
271                .comment("The L module.")
272                .exports("openL")
273                .requiresPublic("P")
274                .classes("package openL; /** Klass L open */ public class L { }")
275                .classes("package closedL;  /** Klass L closed */ public class L { }")
276                .write(src);
277
278        new ModuleBuilder(tb, "N")
279                .comment("The N module.")
280                .exports("openN")
281                .requiresPublic("O")
282                .classes("package openN; /** Klass N open */ public class N  { }")
283                .classes("package closedN; /** Klass N closed */ public class N { }")
284                .write(src);
285
286        new ModuleBuilder(tb, "O")
287                .comment("The O module.")
288                .exports("openO")
289                .requires("J")
290                .classes("package openO; /** Klass O open. */ public class O { openJ.J j; }")
291                .classes("package closedO;  /** Klass O closed. */ public class O { }")
292                .write(src);
293
294        new ModuleBuilder(tb, "P")
295                .comment("The O module.")
296                .exports("openP")
297                .requires("J")
298                .classes("package openP; /** Klass O open. */ public class O { openJ.J j; }")
299                .classes("package closedP;  /** Klass O closed. */ public class O { }")
300                .write(src);
301
302        new ModuleBuilder(tb, "Q")
303                .comment("The Q module.")
304                .exports("openQ")
305                .requires("J")
306                .classes("package openQ; /** Klass Q open. */ public class Q { openJ.J j; }")
307                .classes("package closedQ;  /** Klass Q closed. */ public class Q { }")
308                .write(src);
309
310    }
311}
312