PackageOptions.java revision 3595:81692f730015
1/*
2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * @test
26 * @bug 8159305
27 * @summary Test modules with packages and subpackages filtering
28 * @modules
29 *      jdk.javadoc/jdk.javadoc.internal.api
30 *      jdk.javadoc/jdk.javadoc.internal.doclets.standard
31 *      jdk.javadoc/jdk.javadoc.internal.tool
32 *      jdk.compiler/com.sun.tools.javac.api
33 *      jdk.compiler/com.sun.tools.javac.main
34 * @library /tools/lib
35 * @build toolbox.ToolBox toolbox.TestRunner
36 * @run main PackageOptions
37 */
38
39import java.io.IOException;
40import java.nio.file.DirectoryIteratorException;
41import java.nio.file.DirectoryStream;
42import java.nio.file.Files;
43import java.nio.file.Path;
44
45import toolbox.*;
46
47public class PackageOptions extends ModuleTestBase {
48
49    public static void main(String... args) throws Exception {
50        new PackageOptions().runTests();
51    }
52
53    @Test
54    public void testExportedNonQualifiedPackagesLegacyMode(Path base)  throws Exception {
55        execTask("-modulesourcepath", createSources(base.resolve("src")),
56                "-addmods", "m1",
57                "m1pub");
58
59        checkModulesNotSpecified("m1");
60        checkModulesIncluded("m1");
61        checkPackagesSpecified("m1pub");
62        checkPackagesIncluded("m1pub");
63    }
64
65    @Test
66    public void testExportedQualifiedPackagesLegacyMode(Path base)  throws Exception {
67        execTask("-modulesourcepath", createSources(base.resolve("src")),
68                "-addmods", "m1",
69                "m1/m1pub");
70
71        checkModulesNotSpecified("m1");
72        checkModulesIncluded("m1");
73        checkPackagesSpecified("m1pub");
74        checkPackagesIncluded("m1pub");
75    }
76
77    @Test
78    public void testNonExportedQualifedPackagesLegacyMode(Path base)  throws Exception {
79        execTask("-modulesourcepath", createSources(base.resolve("src")),
80                "-addmods", "m1",
81                "m1/m1pro.pro1" /* not exported, therefore qualify with module */);
82
83        checkModulesNotSpecified("m1");
84        checkModulesIncluded("m1");
85        checkPackagesSpecified("m1pro.pro1");
86        checkPackagesIncluded("m1pro.pro1");
87        checkPackagesNotIncluded("m1pro.pro2");
88        checkPackagesNotIncluded("m1pub");
89    }
90
91    @Test
92    public void testTypesLegacyMode(Path base) throws Exception {
93        Path srcPath = base.resolve("src");
94        Path typPath = srcPath.resolve("m1/m1pub/A.java");
95        execTask("-modulesourcepath", createSources(srcPath),
96                "-addmods", "m1",
97                typPath.toString());
98        checkModulesNotSpecified("m1");
99        checkModulesIncluded("m1");
100        checkPackagesIncluded("m1pub");
101        checkPackagesNotIncluded("m1pro");
102        checkTypesSpecified("m1pub.A");
103        checkTypesIncluded("m1pub.A");
104        checkTypesNotIncluded("m1pub.B");
105        checkTypesNotIncluded("m1pub.C");
106    }
107
108    @Test
109    public void testSubclassedTypesLegacyMode(Path base) throws Exception {
110        Path srcPath = base.resolve("src");
111        Path typPath = srcPath.resolve("m1/m1pub/B.java");
112        execTask("-modulesourcepath", createSources(srcPath),
113                "-addmods", "m1",
114                typPath.toString());
115        checkModulesNotSpecified("m1");
116        checkModulesIncluded("m1");
117        checkPackagesIncluded("m1pub");
118        checkPackagesNotIncluded("m1pro");
119        checkTypesSpecified("m1pub.B");
120        checkTypesIncluded("m1pub.B");
121        checkTypesNotIncluded("m1pub.A");
122        checkTypesNotIncluded("m1pub.C");
123    }
124
125    @Test
126    public void testDefaultPackages(Path base) throws Exception {
127        execTask("-modulesourcepath", createSources(base.resolve("src")),
128                "--module", "m1");
129
130        checkModulesSpecified("m1");
131
132        checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
133                              "m1pub.pub1.pub12", "m1pub.pub2.pub21");
134    }
135
136    @Test
137    public void testEmptyPackageDirectory(Path base) throws Exception {
138        Path src = base.resolve("src");
139        createSources(src);
140
141        // need an empty package directory, to check whether
142        // the behavior of subpackage and package
143        Path pkgdir = src.resolve("m1/m1pro/");
144        try (DirectoryStream<Path> stream = Files.newDirectoryStream(pkgdir, "*.java")) {
145            for (Path entry : stream) {
146                Files.deleteIfExists(entry);
147            }
148        } catch (DirectoryIteratorException ex) {
149            // I/O error encounted during the iteration
150            throw ex.getCause();
151        }
152        execTask("-modulesourcepath", src.toString(),
153                "-subpackages", "m1/m1pro");
154
155        checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2");
156
157        // empty package directory should cause an error
158        execNegativeTask("-modulesourcepath", src.toString(),
159                         "m1/m1pro");
160
161    }
162
163    @Test
164    public void testExportedQualifiedSubpackageWithMultipleModules(Path base) throws Exception {
165        execTask("-modulesourcepath", createSources(base.resolve("src"), 2),
166                "--module", "m1",
167                "-subpackages", "m1/m1pro.pro1:m1/m1pro.pro2:m2/m2pub.pub1");
168
169        checkModulesSpecified("m1");
170        checkPackagesSpecified("m1pro", "m1pro.pro2");
171        checkPackagesSpecified("m2pub.pub1");
172
173        checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
174                              "m1pub.pub1.pub12", "m1pub.pub2.pub21");
175        checkPackagesIncluded("m2pub.pub1");
176    }
177
178    @Test
179    public void testUnexportedUnqualifiedSubpackages(Path base) throws Exception {
180        execNegativeTask("-modulesourcepath", createSources(base.resolve("src")),
181                         "--module", "m1",
182                         "-subpackages", "m1pub.pub1:pro");
183
184        assertErrorPresent("javadoc: error - No source files for package pro");
185    }
186
187    @Test
188    public void testUnexportedQualifiedPackage(Path base) throws Exception {
189        execTask("-modulesourcepath", createSources(base.resolve("src")),
190                "--module", "m1",
191                "m1/m1pro");
192
193        checkModulesSpecified("m1");
194        checkPackagesSpecified("m1pro");
195
196        checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
197                              "m1pub.pub1.pub12", "m1pub.pub2.pub21");
198
199        checkTypesIncluded("m1pro.L");
200    }
201
202    @Test
203    public void testUnexportedQualifiedSubpackage(Path base) throws Exception {
204        execTask("-modulesourcepath", createSources(base.resolve("src")),
205                "--module", "m1",
206                "-subpackages", "m1/m1pro");
207
208        checkModulesSpecified("m1");
209        checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2");
210
211        checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
212                              "m1pub.pub1.pub12", "m1pub.pub2.pub21");
213
214        checkTypesIncluded("m1pro.L", "m1pro.pro1.M", "m1pro.pro2.O");
215    }
216
217    @Test
218    public void testUnexportedQualifiedSubpackageExcludeQualified(Path base) throws Exception {
219        execTask("-modulesourcepath", createSources(base.resolve("src")),
220                "--module", "m1",
221                "-subpackages", "m1/m1pro",
222                "-exclude", "m1/m1pro.pro1.pro11:m1/m1pro.pro2.pro21");
223
224        checkModulesSpecified("m1");
225        checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2");
226
227        checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
228                              "m1pub.pub1.pub12", "m1pub.pub2.pub21");
229
230        checkTypesIncluded("m1pro.L", "m1pro.pro1.M", "m1pro.pro2.O");
231        checkPackagesNotSpecified(".*pro11.*", ".*pro21.*");
232    }
233
234    @Test
235    public void testUnexportedQualifiedSubpackageExcludeUnqualified(Path base) throws Exception {
236        execTask("-modulesourcepath", createSources(base.resolve("src")),
237                "--module", "m1",
238                "-subpackages", "m1/m1pro",
239                "-exclude", "m1pro.pro1.pro11:m1pro.pro2.pro21");
240
241        checkModulesSpecified("m1");
242        checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2");
243
244        checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
245                              "m1pub.pub1.pub12", "m1pub.pub2.pub21");
246
247        checkTypesIncluded("m1pro.L", "m1pro.pro1.M", "m1pro.pro2.O");
248        checkPackagesNotSpecified(".*pro11.*", ".*pro21.*");
249    }
250
251    @Test
252    public void testUnexportedQualifiedSubpackages(Path base) throws Exception {
253        execTask("-modulesourcepath", createSources(base.resolve("src")),
254                "--module", "m1",
255                "-subpackages", "m1/m1pro.pro1:m1/m1pro.pro2");
256
257        checkModulesSpecified("m1");
258        checkPackagesSpecified("m1pro.pro1.pro11");
259
260        checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
261                               "m1pub.pub1.pub12", "m1pub.pub2.pub21");
262        checkTypesIncluded("m1pro.pro1.pro11.N", "m1pro.pro2.pro21.P");
263        checkTypesNotIncluded("m1pro.L");
264    }
265
266    String createSources(Path src) throws IOException {
267        return createSources0(src, 1);
268    }
269
270    String createSources(Path src, int n) throws IOException {
271        for (int i = 1 ; i <= n ; i++) {
272            createSources0(src, i);
273        }
274        return src.toString();
275    }
276
277    String createSources0(Path src, int n) throws IOException {
278        String mn = "m" + n;
279        String pn = "package " + mn;
280
281        ModuleBuilder mb1 = new ModuleBuilder(tb, mn);
282        mb1.comment("The module #" + n)
283                .classes(pn + "pub; /** Klass A */ public class A {}")
284                .classes(pn + "pub; /** Klass B */ public class B extends A{}")
285                .classes(pn + "pub; /** Klass C */ public class C {}")
286                .classes(pn + "pub;")
287                .classes(pn + "pub.pub1; /** Klass B */ public class B {}")
288                .classes(pn + "pub.pub1.pub11; /** Klass C */ public class C {}")
289                .classes(pn + "pub.pub1.pub12; /** Klass C */ public class C {}")
290                .classes(pn + "pub.pub2.pub21; /** Klass C */ public class C {}")
291                .classes(pn + "pro; /** Klass L */ public class L {}")
292                .classes(pn + "pro.pro1; /** Klass M */ public class M {}")
293                .classes(pn + "pro.pro1.pro11; /** Klass N */ public class N {}")
294                .classes(pn + "pro.pro2; /** Klass O */ public class O {}")
295                .classes(pn + "pro.pro2.pro21; /** Klass P */ public class P {}")
296                .exports(mn + "pub")
297                .exports(mn + "pub.pub1")
298                .exports(mn + "pub.pub1.pub11")
299                .exports(mn + "pub.pub1.pub12")
300                .exports(mn + "pub.pub2.pub21")
301                .write(src);
302        return src.toString();
303    }
304}
305