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