1 /*
   2  * Copyright (c) 2015, 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  * @summary Module attribute tests
  27  * @bug 8080878 8161906 8162713
  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 
  43     public static void main(String[] args) throws Exception {
  44         new ModuleTest().run();
  45     }
  46 
  47     @Test
  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
  56     public void testExports(Path base) throws Exception {
  57         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
  58                 .exports("pack")
  59                 .write(base);
  60         tb.writeJavaFiles(base, "package pack; public class C extends java.util.ArrayList{ }");
  61         compile(base);
  62         testModuleAttribute(base, moduleDescriptor);
  63     }
  64 
  65     @Test
  66     public void testSeveralExports(Path base) throws Exception {
  67         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
  68                 .exports("pack")
  69                 .exports("pack2")
  70                 .exports("pack3")
  71                 .exports("pack4")
  72                 .exports("pack5")
  73                 .write(base);
  74         tb.writeJavaFiles(base,
  75                 "package pack; public class A { }",
  76                 "package pack2; public class B { }",
  77                 "package pack3; public class C { }",
  78                 "package pack4; public class C { }",
  79                 "package pack5; public class C { }");
  80         compile(base);
  81         testModuleAttribute(base, moduleDescriptor);
  82     }
  83 
  84     @Test
  85     public void testQualifiedExports(Path base) throws Exception {
  86         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
  87                 .exportsTo("pack", "jdk.compiler")
  88                 .write(base);
  89         tb.writeJavaFiles(base, "package pack; public class A { }");
  90         compile(base);
  91         testModuleAttribute(base, moduleDescriptor);
  92     }
  93 
  94     @Test
  95     public void testQualifiedDynamicExports(Path base) throws Exception {
  96         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
  97                 .exportsTo("pack", "jdk.compiler")
  98                 .write(base);
  99         tb.writeJavaFiles(base, "package pack; public class A { }");
 100         compile(base);
 101         testModuleAttribute(base, moduleDescriptor);
 102     }
 103 
 104     @Test
 105     public void testSeveralQualifiedExports(Path base) throws Exception {
 106         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
 107                 .exportsTo("pack", "jdk.compiler, jdk.jdeps")
 108                 .exportsTo("pack2", "jdk.jdeps")
 109                 .exportsTo("pack3", "jdk.compiler")
 110                 .exportsTo("pack4", "jdk.compiler, jdk.jdeps")
 111                 .exportsTo("pack5", "jdk.compiler")
 112                 .write(base);
 113         tb.writeJavaFiles(base,
 114                 "package pack; public class A {}",
 115                 "package pack2; public class B {}",
 116                 "package pack3; public class C {}",
 117                 "package pack4; public class C {}",
 118                 "package pack5; public class C {}");
 119         compile(base);
 120         testModuleAttribute(base, moduleDescriptor);
 121     }
 122 
 123     @Test
 124     public void testRequires(Path base) throws Exception {
 125         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
 126                 .requires("jdk.compiler")
 127                 .write(base);
 128         compile(base);
 129         testModuleAttribute(base, moduleDescriptor);
 130     }
 131 
 132     @Test
 133     public void testRequiresTransitive(Path base) throws Exception {
 134         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
 135                 .requires("jdk.jdeps", RequiresFlag.TRANSITIVE)
 136                 .write(base);
 137         compile(base);
 138         testModuleAttribute(base, moduleDescriptor);
 139     }
 140 
 141     @Test
 142     public void testRequiresStatic(Path base) throws Exception {
 143         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
 144                 .requires("jdk.jdeps", RequiresFlag.STATIC)
 145                 .write(base);
 146         compile(base);
 147         testModuleAttribute(base, moduleDescriptor);
 148     }
 149 
 150     @Test
 151     public void testSeveralRequires(Path base) throws Exception {
 152         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m1x")
 153                 .requires("jdk.jdeps", RequiresFlag.TRANSITIVE)
 154                 .requires("jdk.compiler")
 155                 .requires("m2x", RequiresFlag.STATIC)
 156                 .requires("m3x")
 157                 .requires("m4x", RequiresFlag.TRANSITIVE)
 158                 .requires("m5x", RequiresFlag.STATIC, RequiresFlag.TRANSITIVE)
 159                 .write(base.resolve("m1x"));
 160         tb.writeJavaFiles(base.resolve("m2x"), "module m2x { }");
 161         tb.writeJavaFiles(base.resolve("m3x"), "module m3x { }");
 162         tb.writeJavaFiles(base.resolve("m4x"), "module m4x { }");
 163         tb.writeJavaFiles(base.resolve("m5x"), "module m5x { }");
 164         compile(base, "--module-source-path", base.toString(),
 165                 "-d", base.toString());
 166         testModuleAttribute(base.resolve("m1x"), moduleDescriptor);
 167     }
 168 
 169     @Test
 170     public void testProvides(Path base) throws Exception {
 171         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
 172                 .provides("java.util.Collection", "pack2.D")
 173                 .write(base);
 174         tb.writeJavaFiles(base, "package pack2; public class D extends java.util.ArrayList{ }");
 175         compile(base);
 176         testModuleAttribute(base, moduleDescriptor);
 177     }
 178 
 179     @Test
 180     public void testSeveralProvides(Path base) throws Exception {
 181         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
 182                 .provides("java.util.Collection", "pack2.D")
 183                 .provides("java.util.List", "pack2.D")
 184                 .requires("jdk.compiler")
 185                 .provides("com.sun.tools.javac.Main", "pack2.C")
 186                 .write(base);
 187         tb.writeJavaFiles(base, "package pack2; public class D extends java.util.ArrayList{ }",
 188                 "package pack2; public class C extends com.sun.tools.javac.Main{ }");
 189         compile(base);
 190         testModuleAttribute(base, moduleDescriptor);
 191     }
 192 
 193     @Test
 194     public void testUses(Path base) throws Exception {
 195         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
 196                 .uses("java.util.List")
 197                 .write(base);
 198         compile(base);
 199         testModuleAttribute(base, moduleDescriptor);
 200     }
 201 
 202     @Test
 203     public void testSeveralUses(Path base) throws Exception {
 204         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m")
 205                 .uses("java.util.List")
 206                 .uses("java.util.Collection")
 207                 .requires("jdk.compiler")
 208                 .uses("javax.tools.JavaCompiler")
 209                 .write(base);
 210         compile(base);
 211         testModuleAttribute(base, moduleDescriptor);
 212     }
 213 
 214     @Test
 215     public void testComplex(Path base) throws Exception {
 216         Path m1 = base.resolve("m1x");
 217         ModuleDescriptor moduleDescriptor = new ModuleDescriptor("m1x")
 218                 .exports("pack1")
 219                 .exports("pack3")
 220                 .exportsTo("packTo1", "m2x")
 221                 .exportsTo("packTo3", "m3x")
 222                 .requires("jdk.compiler")
 223                 .requires("m2x", RequiresFlag.TRANSITIVE)
 224                 .requires("m3x", RequiresFlag.STATIC)
 225                 .requires("m4x", RequiresFlag.TRANSITIVE, RequiresFlag.STATIC)
 226                 .provides("java.util.List", "pack1.C", "pack2.D")
 227                 .uses("java.util.List")
 228                 .uses("java.nio.file.Path")
 229                 .requires("jdk.jdeps", RequiresFlag.STATIC, RequiresFlag.TRANSITIVE)
 230                 .requires("m5x", RequiresFlag.STATIC)
 231                 .requires("m6x", RequiresFlag.TRANSITIVE)
 232                 .requires("java.compiler")
 233                 .exportsTo("packTo4", "java.compiler")
 234                 .exportsTo("packTo2", "java.compiler")
 235                 .exports("pack4")
 236                 .exports("pack2")
 237                 .write(m1);
 238         tb.writeJavaFiles(m1, "package pack1; public class C extends java.util.ArrayList{ }",
 239                 "package pack2; public class D extends java.util.ArrayList{ }",
 240                 "package pack3; public class D extends java.util.ArrayList{ }",
 241                 "package pack4; public class D extends java.util.ArrayList{ }");
 242         tb.writeJavaFiles(m1,
 243                 "package packTo1; public class T1 {}",
 244                 "package packTo2; public class T2 {}",
 245                 "package packTo3; public class T3 {}",
 246                 "package packTo4; public class T4 {}");
 247         tb.writeJavaFiles(base.resolve("m2x"), "module m2x { }");
 248         tb.writeJavaFiles(base.resolve("m3x"), "module m3x { }");
 249         tb.writeJavaFiles(base.resolve("m4x"), "module m4x { }");
 250         tb.writeJavaFiles(base.resolve("m5x"), "module m5x { }");
 251         tb.writeJavaFiles(base.resolve("m6x"), "module m6x { }");
 252         compile(base, "--module-source-path", base.toString(),
 253                 "-d", base.toString());
 254         testModuleAttribute(m1, moduleDescriptor);
 255     }
 256 }