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 multi-module mode compilation
  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 XModuleTest
  33  */
  34 
  35 import java.nio.file.Path;
  36 import java.util.Arrays;
  37 import java.util.List;
  38 
  39 import toolbox.JavacTask;
  40 import toolbox.ModuleBuilder;
  41 import toolbox.Task;
  42 import toolbox.TestRunner;
  43 import toolbox.ToolBox;
  44 
  45 public class XModuleTest extends ModuleTestBase {
  46 
  47     public static void main(String... args) throws Exception {
  48         new XModuleTest().runTests();
  49     }
  50 
  51     @Test
  52     public void testCorrectXModule(Path base) throws Exception {
  53         //note: avoiding use of java.base, as that gets special handling on some places:
  54         Path src = base.resolve("src");
  55         tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element { }");
  56         Path classes = base.resolve("classes");
  57         tb.createDirectories(classes);
  58 
  59         String log = new JavacTask(tb)
  60                 .options("-Xmodule:java.compiler")
  61                 .outdir(classes)
  62                 .files(findJavaFiles(src))
  63                 .run()
  64                 .writeAll()
  65                 .getOutput(Task.OutputKind.DIRECT);
  66 
  67         if (!log.isEmpty())
  68             throw new Exception("expected output not found: " + log);
  69     }
  70 
  71     @Test
  72     public void testSourcePath(Path base) throws Exception {
  73         //note: avoiding use of java.base, as that gets special handling on some places:
  74         Path src = base.resolve("src");
  75         tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element, Other { }", "package javax.lang.model.element; interface Other { }");
  76         Path classes = base.resolve("classes");
  77         tb.createDirectories(classes);
  78 
  79         String log = new JavacTask(tb)
  80                 .options("-Xmodule:java.compiler", "-sourcepath", src.toString())
  81                 .outdir(classes)
  82                 .files(src.resolve("javax/lang/model/element/Extra.java"))
  83                 .run()
  84                 .writeAll()
  85                 .getOutput(Task.OutputKind.DIRECT);
  86 
  87         if (!log.isEmpty())
  88             throw new Exception("expected output not found: " + log);
  89     }
  90 
  91     @Test
  92     public void testClassPath(Path base) throws Exception {
  93         Path cpSrc = base.resolve("cpSrc");
  94         tb.writeJavaFiles(cpSrc, "package p; public interface Other { }");
  95         Path cpClasses = base.resolve("cpClasses");
  96         tb.createDirectories(cpClasses);
  97 
  98         String cpLog = new JavacTask(tb)
  99                 .outdir(cpClasses)
 100                 .files(findJavaFiles(cpSrc))
 101                 .run()
 102                 .writeAll()
 103                 .getOutput(Task.OutputKind.DIRECT);
 104 
 105         if (!cpLog.isEmpty())
 106             throw new Exception("expected output not found: " + cpLog);
 107 
 108         Path src = base.resolve("src");
 109         //note: avoiding use of java.base, as that gets special handling on some places:
 110         tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element, p.Other { }");
 111         Path classes = base.resolve("classes");
 112         tb.createDirectories(classes);
 113 
 114         String log = new JavacTask(tb)
 115                 .options("-Xmodule:java.compiler", "-classpath", cpClasses.toString())
 116                 .outdir(classes)
 117                 .files(src.resolve("javax/lang/model/element/Extra.java"))
 118                 .run()
 119                 .writeAll()
 120                 .getOutput(Task.OutputKind.DIRECT);
 121 
 122         if (!log.isEmpty())
 123             throw new Exception("expected output not found: " + log);
 124     }
 125 
 126     @Test
 127     public void testNoModuleInfoOnSourcePath(Path base) throws Exception {
 128         //note: avoiding use of java.base, as that gets special handling on some places:
 129         Path src = base.resolve("src");
 130         tb.writeJavaFiles(src,
 131                           "module java.compiler {}",
 132                           "package javax.lang.model.element; public interface Extra { }");
 133         Path classes = base.resolve("classes");
 134         tb.createDirectories(classes);
 135 
 136         List<String> log = new JavacTask(tb)
 137                 .options("-XDrawDiagnostics", "-Xmodule:java.compiler")
 138                 .outdir(classes)
 139                 .files(findJavaFiles(src))
 140                 .run(Task.Expect.FAIL)
 141                 .writeAll()
 142                 .getOutputLines(Task.OutputKind.DIRECT);
 143 
 144         List<String> expected = Arrays.asList("Extra.java:1:1: compiler.err.module-info.with.xmodule.sourcepath",
 145                                               "1 error");
 146 
 147         if (!expected.equals(log))
 148             throw new Exception("expected output not found: " + log);
 149     }
 150 
 151     @Test
 152     public void testNoModuleInfoInClassOutput(Path base) throws Exception {
 153         //note: avoiding use of java.base, as that gets special handling on some places:
 154         Path srcMod = base.resolve("src-mod");
 155         tb.writeJavaFiles(srcMod,
 156                           "module mod {}");
 157         Path classes = base.resolve("classes");
 158         tb.createDirectories(classes);
 159 
 160         String logMod = new JavacTask(tb)
 161                 .options()
 162                 .outdir(classes)
 163                 .files(findJavaFiles(srcMod))
 164                 .run()
 165                 .writeAll()
 166                 .getOutput(Task.OutputKind.DIRECT);
 167 
 168         if (!logMod.isEmpty())
 169             throw new Exception("unexpected output found: " + logMod);
 170 
 171         Path src = base.resolve("src");
 172         tb.writeJavaFiles(src,
 173                           "package javax.lang.model.element; public interface Extra { }");
 174         tb.createDirectories(classes);
 175 
 176         List<String> log = new JavacTask(tb)
 177                 .options("-XDrawDiagnostics", "-Xmodule:java.compiler")
 178                 .outdir(classes)
 179                 .files(findJavaFiles(src))
 180                 .run(Task.Expect.FAIL)
 181                 .writeAll()
 182                 .getOutputLines(Task.OutputKind.DIRECT);
 183 
 184         List<String> expected = Arrays.asList("Extra.java:1:1: compiler.err.module-info.with.xmodule.classpath",
 185                                               "1 error");
 186 
 187         if (!expected.equals(log))
 188             throw new Exception("expected output not found: " + log);
 189     }
 190 
 191     @Test
 192     public void testModuleSourcePathXModule(Path base) throws Exception {
 193         //note: avoiding use of java.base, as that gets special handling on some places:
 194         Path src = base.resolve("src");
 195         tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element { }");
 196         Path classes = base.resolve("classes");
 197         tb.createDirectories(classes);
 198 
 199         List<String> log = new JavacTask(tb)
 200                 .options("-XDrawDiagnostics", "-Xmodule:java.compiler", "-modulesourcepath", src.toString())
 201                 .outdir(classes)
 202                 .files(findJavaFiles(src))
 203                 .run(Task.Expect.FAIL)
 204                 .writeAll()
 205                 .getOutputLines(Task.OutputKind.DIRECT);
 206 
 207         List<String> expected = Arrays.asList("- compiler.err.xmodule.no.module.sourcepath",
 208                                               "1 error");
 209 
 210         if (!expected.equals(log))
 211             throw new Exception("expected output not found: " + log);
 212     }
 213 
 214     @Test
 215     public void testXModuleTooMany(Path base) throws Exception {
 216         //note: avoiding use of java.base, as that gets special handling on some places:
 217         Path src = base.resolve("src");
 218         tb.writeJavaFiles(src, "package javax.lang.model.element; public interface Extra extends Element { }");
 219         Path classes = base.resolve("classes");
 220         tb.createDirectories(classes);
 221 
 222         List<String> log = new JavacTask(tb, Task.Mode.CMDLINE)
 223                 .options("-XDrawDiagnostics", "-Xmodule:java.compiler", "-Xmodule:java.compiler")
 224                 .outdir(classes)
 225                 .files(findJavaFiles(src))
 226                 .run(Task.Expect.FAIL)
 227                 .writeAll()
 228                 .getOutputLines(Task.OutputKind.DIRECT);
 229 
 230         List<String> expected = Arrays.asList("javac: option -Xmodule: can only be specified once",
 231                                               "Usage: javac <options> <source files>",
 232                                               "use -help for a list of possible options");
 233 
 234         if (!expected.equals(log))
 235             throw new Exception("expected output not found: " + log);
 236     }
 237 
 238     @Test
 239     public void testWithModulePath(Path base) throws Exception {
 240         Path modSrc = base.resolve("modSrc");
 241         Path modules = base.resolve("modules");
 242         new ModuleBuilder(tb, "m1")
 243                 .classes("package pkg1; public interface E { }")
 244                 .build(modSrc, modules);
 245 
 246         Path src = base.resolve("src");
 247         tb.writeJavaFiles(src, "package p; interface A extends pkg1.E { }");
 248 
 249         new JavacTask(tb, Task.Mode.CMDLINE)
 250                 .options("-modulepath", modules.toString(),
 251                         "-Xmodule:m1")
 252                 .files(findJavaFiles(src))
 253                 .run()
 254                 .writeAll();
 255 
 256         //checks module bounds still exist
 257         new ModuleBuilder(tb, "m2")
 258                 .classes("package pkg2; public interface D { }")
 259                 .build(modSrc, modules);
 260 
 261         Path src2 = base.resolve("src2");
 262         tb.writeJavaFiles(src2, "package p; interface A extends pkg2.D { }");
 263 
 264         List<String> log = new JavacTask(tb, Task.Mode.CMDLINE)
 265                 .options("-XDrawDiagnostics",
 266                         "-modulepath", modules.toString(),
 267                         "-Xmodule:m1")
 268                 .files(findJavaFiles(src2))
 269                 .run(Task.Expect.FAIL)
 270                 .writeAll()
 271                 .getOutputLines(Task.OutputKind.DIRECT);
 272 
 273         List<String> expected = Arrays.asList("A.java:1:36: compiler.err.doesnt.exist: pkg2",
 274                 "1 error");
 275 
 276         if (!expected.equals(log))
 277             throw new Exception("expected output not found: " + log);
 278     }
 279 
 280     @Test
 281     public void testWithUpgradeModulePath(Path base) throws Exception {
 282         Path modSrc = base.resolve("modSrc");
 283         Path modules = base.resolve("modules");
 284         new ModuleBuilder(tb, "m1")
 285                 .classes("package pkg1; public interface E { }")
 286                 .build(modSrc, modules);
 287 
 288         Path upgrSrc = base.resolve("upgradeSrc");
 289         Path upgrade = base.resolve("upgrade");
 290         new ModuleBuilder(tb, "m1")
 291                 .classes("package pkg1; public interface D { }")
 292                 .build(upgrSrc, upgrade);
 293 
 294         Path src = base.resolve("src");
 295         tb.writeJavaFiles(src, "package p; interface A extends pkg1.D { }");
 296 
 297         new JavacTask(tb, Task.Mode.CMDLINE)
 298                 .options("-modulepath", modules.toString(),
 299                         "-upgrademodulepath", upgrade.toString(),
 300                         "-Xmodule:m1")
 301                 .files(findJavaFiles(src))
 302                 .run()
 303                 .writeAll();
 304     }
 305 }