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