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 tests for -upgrademodulepath
  27  * @library /tools/lib
  28  * @modules
  29  *      jdk.compiler/com.sun.tools.javac.api
  30  *      jdk.compiler/com.sun.tools.javac.main
  31  * @build toolbox.ToolBox toolbox.JavacTask toolbox.ModuleBuilder ModuleTestBase
  32  * @run main UpgradeModulePathTest
  33  */
  34 
  35 import java.io.File;
  36 import java.nio.file.Path;
  37 
  38 import toolbox.JavacTask;
  39 import toolbox.ModuleBuilder;
  40 import toolbox.Task;
  41 import toolbox.ToolBox;
  42 
  43 public class UpgradeModulePathTest extends ModuleTestBase {
  44 
  45     public static void main(String... args) throws Exception {
  46         UpgradeModulePathTest t = new UpgradeModulePathTest();
  47         t.runTests();
  48     }
  49 
  50     @Test
  51     public void simpleUsage(Path base) throws Exception {
  52         Path modules = base.resolve("modules");
  53         new ModuleBuilder(tb, "m1")
  54                 .exports("pkg1")
  55                 .classes("package pkg1; public class E { }")
  56                 .build(modules);
  57 
  58         final Path upgradeModules = base.resolve("upgradeModules");
  59         new ModuleBuilder(tb, "m1")
  60                 .exports("pkg2")
  61                 .classes("package pkg2; public class E { }")
  62                 .build(upgradeModules);
  63 
  64         Path src = base.resolve("src");
  65         tb.writeJavaFiles(src, "module m2 { requires m1; }",
  66                 "package p; class A { void main() { pkg2.E.class.getName(); } }");
  67 
  68         new JavacTask(tb, Task.Mode.CMDLINE)
  69                 .options("-modulepath", modules.toString(),
  70                         "-upgrademodulepath", upgradeModules.toString())
  71                 .files(findJavaFiles(src))
  72                 .run()
  73                 .writeAll();
  74     }
  75 
  76     @Test
  77     public void onlyUpgradeModulePath(Path base) throws Exception {
  78         final Path module = base.resolve("modules");
  79         new ModuleBuilder(tb, "m1")
  80                 .exports("pkg1")
  81                 .classes("package pkg1; public class E { }")
  82                 .build(module);
  83 
  84         final Path upgradeModule = base.resolve("upgradeModule");
  85         new ModuleBuilder(tb, "m1")
  86                 .exports("pkg2")
  87                 .classes("package pkg2; public class E { }")
  88                 .build(upgradeModule);
  89 
  90         Path src = base.resolve("src");
  91         tb.writeJavaFiles(src, "module m2 { requires m1; }",
  92                 "package p; class A { void main() { pkg2.E.class.getName(); } }");
  93 
  94         new JavacTask(tb, Task.Mode.CMDLINE)
  95                 .options("-upgrademodulepath", upgradeModule + File.pathSeparator + module)
  96                 .files(findJavaFiles(src))
  97                 .run()
  98                 .writeAll();
  99     }
 100 
 101     @Test
 102     public void withModuleSourcePath(Path base) throws Exception {
 103         final Path module = base.resolve("modules");
 104         new ModuleBuilder(tb, "m1")
 105                 .exports("pkg1")
 106                 .classes("package pkg1; public class E { }")
 107                 .build(module);
 108 
 109         final Path upgradeModule = base.resolve("upgradeModule");
 110         new ModuleBuilder(tb, "m1")
 111                 .exports("pkg2")
 112                 .classes("package pkg2; public class E { }")
 113                 .build(upgradeModule);
 114 
 115         final Path s = base.resolve("source");
 116         tb.writeJavaFiles(s.resolve("m3"), "module m3 { }");
 117 
 118         final Path upgradeModule3 = base.resolve("upgradeModule");
 119         new ModuleBuilder(tb, "m3")
 120                 .exports("pkg3")
 121                 .classes("package pkg3; public class E { }")
 122                 .build(upgradeModule);
 123 
 124         Path src = base.resolve("src");
 125         tb.writeJavaFiles(src.resolve("m2"), "module m2 { requires m1; requires m3; }",
 126                 "package p; class A { void main() { pkg2.E.class.getName(); } }");
 127 
 128         new JavacTask(tb, Task.Mode.CMDLINE)
 129                 .options("-modulepath", module.toString(),
 130                         "-modulesourcepath", src + File.pathSeparator + s,
 131                         "-upgrademodulepath", upgradeModule + File.pathSeparator + upgradeModule3)
 132                 .outdir(module)
 133                 .files(findJavaFiles(src))
 134                 .run()
 135                 .writeAll();
 136     }
 137 
 138     @Test
 139     public void sameUpgradeAndModulePath(Path base) throws Exception {
 140         final Path module = base.resolve("modules");
 141         new ModuleBuilder(tb, "m1")
 142                 .exports("pkg1")
 143                 .classes("package pkg1; public class E { }")
 144                 .build(module);
 145 
 146         final Path upgradeModule = base.resolve("upgradeModule");
 147         new ModuleBuilder(tb, "m1")
 148                 .exports("pkg2")
 149                 .classes("package pkg2; public class E { }")
 150                 .build(upgradeModule);
 151 
 152         Path src = base.resolve("src");
 153         tb.writeJavaFiles(src, "module m2 { requires m1; }",
 154                 "package p; class A { void main() { pkg2.E.class.getName(); } }");
 155 
 156         new JavacTask(tb, Task.Mode.CMDLINE)
 157                 .options("-modulepath", upgradeModule + File.pathSeparator + module,
 158                         "-upgrademodulepath", upgradeModule.toString())
 159                 .files(findJavaFiles(src))
 160                 .run()
 161                 .writeAll();
 162     }
 163 
 164     @Test
 165     public void dummyFileInUpgradeModulePath(Path base) throws Exception {
 166         final Path module = base.resolve("modules");
 167         new ModuleBuilder(tb, "m1")
 168                 .exports("pkg1")
 169                 .classes("package pkg1; public class E { }")
 170                 .build(module);
 171 
 172         Path dummy = base.resolve("dummy.txt");
 173         tb.writeFile(dummy, "");
 174 
 175         Path src = base.resolve("src");
 176         tb.writeJavaFiles(src, "module m2 { requires m1; }",
 177                 "package p; class A { void main() { pkg2.E.class.getName(); } }");
 178 
 179         String output = new JavacTask(tb, Task.Mode.CMDLINE)
 180                 .options("-XDrawDiagnostics",
 181                         "-modulepath", module.toString(),
 182                         "-upgrademodulepath", dummy.toString())
 183                 .files(findJavaFiles(src))
 184                 .run(Task.Expect.FAIL)
 185                 .writeAll()
 186                 .getOutput(Task.OutputKind.DIRECT);
 187         if (!output.contains("compiler.err.illegal.argument.for.option: -upgrademodulepath, " + dummy)) {
 188             throw new Exception("Expected output was not found");
 189         }
 190     }
 191 
 192     @Test
 193     public void severalUpgradeModules(Path base) throws Exception {
 194         final Path module = base.resolve("modules");
 195         new ModuleBuilder(tb, "m1")
 196                 .exports("pkg1")
 197                 .classes("package pkg1; public class A { }")
 198                 .build(module);
 199 
 200         new ModuleBuilder(tb, "m2")
 201                 .exports("pkg2")
 202                 .classes("package pkg2; public class B { }")
 203                 .build(module);
 204 
 205         Path upgradeModule = base.resolve("upgradeModule");
 206         new ModuleBuilder(tb, "m2")
 207                 .exports("pkg2")
 208                 .classes("package pkg2; public class BC { }")
 209                 .build(upgradeModule);
 210         new ModuleBuilder(tb, "m3")
 211                 .exports("pkg3")
 212                 .classes("package pkg3; public class DC { }")
 213                 .build(upgradeModule);
 214 
 215         Path src = base.resolve("src");
 216         tb.writeJavaFiles(src, "module m4 { requires m1; requires m2; requires m3; }",
 217                 "package p; class A { void main() { pkg1.A.class.getName(); pkg2.BC.class.getName(); pkg3.DC.class.getName(); } }");
 218 
 219         new JavacTask(tb, Task.Mode.CMDLINE)
 220                 .options("-modulepath", module.toString(),
 221                         "-upgrademodulepath", upgradeModule.toString())
 222                 .files(findJavaFiles(src))
 223                 .run()
 224                 .writeAll();
 225 
 226         Path src2 = base.resolve("src2");
 227         tb.writeJavaFiles(src2, "module m4 { requires m1; }",
 228                 "package p; class A { void main() { pkg2.B.class.getName(); } }");
 229 
 230         String log = new JavacTask(tb, Task.Mode.CMDLINE)
 231                 .options("-XDrawDiagnostics",
 232                         "-modulepath", module.toString(),
 233                         "-upgrademodulepath", upgradeModule.toString())
 234                 .files(findJavaFiles(src2))
 235                 .run(Task.Expect.FAIL)
 236                 .writeAll()
 237                 .getOutput(Task.OutputKind.DIRECT);
 238         if (!log.contains("compiler.err.doesnt.exist: pkg2")) {
 239             throw new Exception("Expected output was not found");
 240         }
 241     }
 242 
 243     @Test
 244     public void severalUpgradeModulePathsLastWin(Path base) throws Exception {
 245         final Path module = base.resolve("modules");
 246         new ModuleBuilder(tb, "m1")
 247                 .exports("pkg1")
 248                 .classes("package pkg1; public class E { }")
 249                 .build(module);
 250 
 251         final Path upgradeModule1 = base.resolve("upgradeModule1");
 252         new ModuleBuilder(tb, "m1")
 253                 .exports("pkg2")
 254                 .classes("package pkg2; public class EC1 { }")
 255                 .build(upgradeModule1);
 256 
 257         final Path upgradeModule2 = base.resolve("upgradeModule2");
 258         new ModuleBuilder(tb, "m1")
 259                 .exports("pkg2")
 260                 .classes("package pkg2; public class EC2 { }")
 261                 .build(upgradeModule2);
 262 
 263         Path src = base.resolve("src");
 264         tb.writeJavaFiles(src, "module m2 { requires m1; }",
 265                 "package p; class A { void main() { pkg2.EC2.class.getName(); } }");
 266 
 267         new JavacTask(tb, Task.Mode.CMDLINE)
 268                 .options("-modulepath", module.toString(),
 269                         "-upgrademodulepath", upgradeModule1.toString(),
 270                         "-upgrademodulepath", upgradeModule2.toString())
 271                 .files(findJavaFiles(src))
 272                 .run()
 273                 .writeAll();
 274 
 275         Path src2 = base.resolve("src2");
 276         tb.writeJavaFiles(src2, "module m2 { requires m1; }",
 277                 "package p; class A { void main() { pkg2.EC1.class.getName(); } }");
 278 
 279         final String log = new JavacTask(tb, Task.Mode.CMDLINE)
 280                 .options("-XDrawDiagnostics",
 281                         "-modulepath", module.toString(),
 282                         "-upgrademodulepath", upgradeModule1.toString(),
 283                         "-upgrademodulepath", upgradeModule2.toString())
 284                 .files(findJavaFiles(src2))
 285                 .run(Task.Expect.FAIL)
 286                 .writeAll()
 287                 .getOutput(Task.OutputKind.DIRECT);
 288 
 289         if (!log.contains("compiler.err.cant.resolve.location: kindname.class, EC1, , , (compiler.misc.location: kindname.package, pkg2, null)")) {
 290             throw new Exception("Expected output was not found");
 291         }
 292     }
 293 }