1 /* 2 * Copyright (c) 2015, 2017, 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 * @summary Module attribute tests 27 * @bug 8080878 8161906 8162713 8170250 28 * @modules java.compiler 29 * jdk.compiler/com.sun.tools.javac.api 30 * jdk.compiler/com.sun.tools.javac.main 31 * jdk.compiler/com.sun.tools.javac.util 32 * jdk.jdeps/com.sun.tools.classfile 33 * @library /tools/lib ../lib /tools/javac/lib 34 * @build toolbox.ToolBox toolbox.JavacTask toolbox.ToolBox 35 * TestBase TestResult ModuleTestBase 36 * @run main ModuleTest 37 */ 38 39 import java.nio.file.Path; 40 41 public class ModuleTest extends ModuleTestBase { 42 main(String[] args)43 public static void main(String[] args) throws Exception { 44 new ModuleTest().run(); 45 } 46 47 @Test testEmptyModule(Path base)48 public void testEmptyModule(Path base) throws Exception { 49 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 50 .write(base); 51 compile(base); 52 testModuleAttribute(base, moduleDescriptor); 53 } 54 55 @Test testOpenEmptyModule(Path base)56 public void testOpenEmptyModule(Path base) throws Exception { 57 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m", ModuleFlag.OPEN) 58 .write(base); 59 compile(base); 60 testModuleAttribute(base, moduleDescriptor); 61 } 62 63 @Test testModuleName(Path base)64 public void testModuleName(Path base) throws Exception { 65 testName("module.name", base.resolve("dot")); 66 testName("module.exports.component.subcomponent.more.dots", base.resolve("dots")); 67 testName("moduleName", base.resolve("noDots")); 68 } 69 testName(String name, Path path)70 private void testName(String name, Path path) throws Exception{ 71 ModuleDescriptor moduleDescriptor = new ModuleDescriptor(name) 72 .write(path); 73 compile(path); 74 testModuleAttribute(path, moduleDescriptor); 75 } 76 77 @Test testExports(Path base)78 public void testExports(Path base) throws Exception { 79 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 80 .exports("pack") 81 .write(base); 82 tb.writeJavaFiles(base, "package pack; public class C extends java.util.ArrayList{ }"); 83 compile(base); 84 testModuleAttribute(base, moduleDescriptor); 85 } 86 87 @Test testSeveralExports(Path base)88 public void testSeveralExports(Path base) throws Exception { 89 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 90 .exports("pack") 91 .exports("pack2") 92 .exports("pack3") 93 .exports("pack4") 94 .exports("pack5") 95 .write(base); 96 tb.writeJavaFiles(base, 97 "package pack; public class A { }", 98 "package pack2; public class B { }", 99 "package pack3; public class C { }", 100 "package pack4; public class C { }", 101 "package pack5; public class C { }"); 102 compile(base); 103 testModuleAttribute(base, moduleDescriptor); 104 } 105 106 @Test testQualifiedExports(Path base)107 public void testQualifiedExports(Path base) throws Exception { 108 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 109 .exportsTo("pack", "jdk.compiler") 110 .write(base); 111 tb.writeJavaFiles(base, "package pack; public class A { }"); 112 compile(base); 113 testModuleAttribute(base, moduleDescriptor); 114 } 115 116 @Test testSeveralQualifiedExports(Path base)117 public void testSeveralQualifiedExports(Path base) throws Exception { 118 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 119 .exportsTo("pack", "jdk.compiler, jdk.jdeps") 120 .exportsTo("pack2", "jdk.jdeps") 121 .exportsTo("pack3", "jdk.compiler") 122 .exportsTo("pack4", "jdk.compiler, jdk.jdeps") 123 .exportsTo("pack5", "jdk.compiler") 124 .write(base); 125 tb.writeJavaFiles(base, 126 "package pack; public class A {}", 127 "package pack2; public class B {}", 128 "package pack3; public class C {}", 129 "package pack4; public class C {}", 130 "package pack5; public class C {}"); 131 compile(base); 132 testModuleAttribute(base, moduleDescriptor); 133 } 134 135 @Test testOpens(Path base)136 public void testOpens(Path base) throws Exception { 137 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("module.name") 138 .opens("pack") 139 .write(base); 140 tb.writeJavaFiles(base, "package pack; public class C extends java.util.ArrayList{ }"); 141 compile(base); 142 testModuleAttribute(base, moduleDescriptor); 143 } 144 145 @Test testQualifiedOpens(Path base)146 public void testQualifiedOpens(Path base) throws Exception { 147 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 148 .opensTo("pack", "jdk.compiler") 149 .write(base); 150 tb.writeJavaFiles(base, "package pack; public class A { }"); 151 compile(base); 152 testModuleAttribute(base, moduleDescriptor); 153 } 154 155 @Test testSeveralOpens(Path base)156 public void testSeveralOpens(Path base) throws Exception { 157 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("module.m1.name") 158 .opensTo("pack", "jdk.compiler, jdk.jdeps") 159 .opensTo("pack2", "jdk.jdeps") 160 .opensTo("pack3", "jdk.compiler") 161 .opensTo("pack4", "jdk.compiler, jdk.jdeps") 162 .opensTo("pack5", "jdk.compiler") 163 .opens("pack6") 164 .write(base); 165 tb.writeJavaFiles(base, 166 "package pack; public class A {}", 167 "package pack2; public class B {}", 168 "package pack3; public class C {}", 169 "package pack4; public class C {}", 170 "package pack5; public class C {}", 171 "package pack6; public class C {}"); 172 compile(base); 173 testModuleAttribute(base, moduleDescriptor); 174 } 175 176 @Test testRequires(Path base)177 public void testRequires(Path base) throws Exception { 178 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 179 .requires("jdk.compiler") 180 .write(base); 181 compile(base); 182 testModuleAttribute(base, moduleDescriptor); 183 } 184 185 @Test testRequiresTransitive(Path base)186 public void testRequiresTransitive(Path base) throws Exception { 187 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 188 .requires("jdk.jdeps", RequiresFlag.TRANSITIVE) 189 .write(base); 190 compile(base); 191 testModuleAttribute(base, moduleDescriptor); 192 } 193 194 @Test testRequiresStatic(Path base)195 public void testRequiresStatic(Path base) throws Exception { 196 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 197 .requires("jdk.jdeps", RequiresFlag.STATIC) 198 .write(base); 199 compile(base); 200 testModuleAttribute(base, moduleDescriptor); 201 } 202 203 @Test testSeveralRequires(Path base)204 public void testSeveralRequires(Path base) throws Exception { 205 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m1x") 206 .requires("jdk.jdeps", RequiresFlag.TRANSITIVE) 207 .requires("jdk.compiler") 208 .requires("m2x", RequiresFlag.STATIC) 209 .requires("m3x") 210 .requires("m4x", RequiresFlag.TRANSITIVE) 211 .requires("m5x", RequiresFlag.STATIC, RequiresFlag.TRANSITIVE) 212 .write(base.resolve("m1x")); 213 tb.writeJavaFiles(base.resolve("m2x"), "module m2x { }"); 214 tb.writeJavaFiles(base.resolve("m3x"), "module m3x { }"); 215 tb.writeJavaFiles(base.resolve("m4x"), "module m4x { }"); 216 tb.writeJavaFiles(base.resolve("m5x"), "module m5x { }"); 217 compile(base, "--module-source-path", base.toString(), 218 "-d", base.toString()); 219 testModuleAttribute(base.resolve("m1x"), moduleDescriptor); 220 } 221 222 @Test testProvides(Path base)223 public void testProvides(Path base) throws Exception { 224 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 225 .provides("java.util.Collection", "pack2.D") 226 .write(base); 227 tb.writeJavaFiles(base, "package pack2; public class D extends java.util.ArrayList{ }"); 228 compile(base); 229 testModuleAttribute(base, moduleDescriptor); 230 } 231 232 @Test testSeveralProvides(Path base)233 public void testSeveralProvides(Path base) throws Exception { 234 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 235 .provides("java.util.Collection", "pack2.D") 236 .provides("java.util.List", "pack2.D") 237 .requires("jdk.compiler") 238 .provides("javax.tools.FileObject", "pack2.E") 239 .provides("com.sun.tools.javac.Main", "pack2.C") 240 .write(base); 241 tb.writeJavaFiles(base, "package pack2; public class D extends java.util.ArrayList{ }", 242 "package pack2; public class C extends com.sun.tools.javac.Main{ }", 243 "package pack2; public class E extends javax.tools.SimpleJavaFileObject{ public E(){ super(null,null); } }"); 244 compile(base); 245 testModuleAttribute(base, moduleDescriptor); 246 } 247 248 @Test testUses(Path base)249 public void testUses(Path base) throws Exception { 250 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 251 .uses("java.util.List") 252 .write(base); 253 compile(base); 254 testModuleAttribute(base, moduleDescriptor); 255 } 256 257 @Test testSeveralUses(Path base)258 public void testSeveralUses(Path base) throws Exception { 259 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m") 260 .uses("java.util.List") 261 .uses("java.util.Collection") // from java.base 262 .requires("jdk.compiler") 263 .uses("javax.tools.JavaCompiler") // from java.compiler 264 .uses("com.sun.tools.javac.Main") // from jdk.compiler 265 .write(base); 266 compile(base); 267 testModuleAttribute(base, moduleDescriptor); 268 } 269 270 @Test testComplex(Path base)271 public void testComplex(Path base) throws Exception { 272 Path m1 = base.resolve("m1x"); 273 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m1x") 274 .exports("pack1") 275 .opens("pack3") 276 .exportsTo("packTo1", "m2x") 277 .opensTo("packTo1", "m2x") // the same as exportsTo 278 .opensTo("packTo3", "m3x") 279 .requires("jdk.compiler") 280 .requires("m2x", RequiresFlag.TRANSITIVE) 281 .requires("m3x", RequiresFlag.STATIC) 282 .requires("m4x", RequiresFlag.TRANSITIVE, RequiresFlag.STATIC) 283 .provides("java.util.List", "pack1.C", "pack2.D") 284 .uses("java.util.List") 285 .uses("java.nio.file.Path") 286 .requires("jdk.jdeps", RequiresFlag.STATIC, RequiresFlag.TRANSITIVE) 287 .requires("m5x", RequiresFlag.STATIC) 288 .requires("m6x", RequiresFlag.TRANSITIVE) 289 .requires("java.compiler") 290 .opensTo("packTo4", "java.compiler") 291 .exportsTo("packTo2", "java.compiler") 292 .opens("pack2") // same as exports 293 .opens("pack4") 294 .exports("pack2") 295 .write(m1); 296 tb.writeJavaFiles(m1, "package pack1; public class C extends java.util.ArrayList{ }", 297 "package pack2; public class D extends java.util.ArrayList{ }", 298 "package pack3; public class D extends java.util.ArrayList{ }", 299 "package pack4; public class D extends java.util.ArrayList{ }"); 300 tb.writeJavaFiles(m1, 301 "package packTo1; public class T1 {}", 302 "package packTo2; public class T2 {}", 303 "package packTo3; public class T3 {}", 304 "package packTo4; public class T4 {}"); 305 tb.writeJavaFiles(base.resolve("m2x"), "module m2x { }"); 306 tb.writeJavaFiles(base.resolve("m3x"), "module m3x { }"); 307 tb.writeJavaFiles(base.resolve("m4x"), "module m4x { }"); 308 tb.writeJavaFiles(base.resolve("m5x"), "module m5x { }"); 309 tb.writeJavaFiles(base.resolve("m6x"), "module m6x { }"); 310 compile(base, "--module-source-path", base.toString(), 311 "-d", base.toString()); 312 testModuleAttribute(m1, moduleDescriptor); 313 } 314 315 @Test testOpenComplexModule(Path base)316 public void testOpenComplexModule(Path base) throws Exception { 317 Path m1 = base.resolve("m1x"); 318 ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m1x", ModuleFlag.OPEN) 319 .exports("pack1") 320 .exportsTo("packTo1", "m2x") 321 .requires("jdk.compiler") 322 .requires("m2x", RequiresFlag.TRANSITIVE) 323 .requires("m3x", RequiresFlag.STATIC) 324 .requires("m4x", RequiresFlag.TRANSITIVE, RequiresFlag.STATIC) 325 .provides("java.util.List", "pack1.C", "pack2.D") 326 .uses("java.util.List") 327 .uses("java.nio.file.Path") 328 .requires("jdk.jdeps", RequiresFlag.STATIC, RequiresFlag.TRANSITIVE) 329 .requires("m5x", RequiresFlag.STATIC) 330 .requires("m6x", RequiresFlag.TRANSITIVE) 331 .requires("java.compiler") 332 .exportsTo("packTo2", "java.compiler") 333 .exports("pack2") 334 .write(m1); 335 tb.writeJavaFiles(m1, "package pack1; public class C extends java.util.ArrayList{ }", 336 "package pack2; public class D extends java.util.ArrayList{ }", 337 "package pack3; public class D extends java.util.ArrayList{ }", 338 "package pack4; public class D extends java.util.ArrayList{ }"); 339 tb.writeJavaFiles(m1, 340 "package packTo1; public class T1 {}", 341 "package packTo2; public class T2 {}", 342 "package packTo3; public class T3 {}", 343 "package packTo4; public class T4 {}"); 344 tb.writeJavaFiles(base.resolve("m2x"), "module m2x { }"); 345 tb.writeJavaFiles(base.resolve("m3x"), "module m3x { }"); 346 tb.writeJavaFiles(base.resolve("m4x"), "module m4x { }"); 347 tb.writeJavaFiles(base.resolve("m5x"), "module m5x { }"); 348 tb.writeJavaFiles(base.resolve("m6x"), "module m6x { }"); 349 compile(base, "--module-source-path", base.toString(), 350 "-d", base.toString()); 351 testModuleAttribute(m1, moduleDescriptor); 352 } 353 } 354