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 ModuleTestBase
  32  * @run main MultiModuleModeTest
  33  */
  34 
  35 import java.nio.file.Files;
  36 import java.nio.file.Path;
  37 import java.util.ArrayList;
  38 import java.util.Arrays;
  39 import java.util.List;
  40 
  41 import toolbox.JavacTask;
  42 import toolbox.Task;
  43 import toolbox.ToolBox;
  44 
  45 public class MultiModuleModeTest extends ModuleTestBase {
  46 
  47     public static void main(String... args) throws Exception {
  48         new MultiModuleModeTest().runTests();
  49     }
  50 
  51     @Test
  52     public void testDuplicateModules(Path base) throws Exception {
  53         Path src = base.resolve("src");
  54         Path src_m1 = src.resolve("m1");
  55         tb.writeJavaFiles(src_m1, "module m1 { }");
  56         Path src_m2 = src.resolve("m2");
  57         tb.writeJavaFiles(src_m2, "module m1 { }");
  58         Path classes = base.resolve("classes");
  59         tb.createDirectories(classes);
  60 
  61         String log = new JavacTask(tb)
  62                 .options("-XDrawDiagnostics",
  63                         "--module-source-path", src.toString())
  64                 .outdir(classes)
  65                 .files(findJavaFiles(src))
  66                 .run(Task.Expect.FAIL)
  67                 .writeAll()
  68                 .getOutput(Task.OutputKind.DIRECT);
  69 
  70         if (!log.contains("module-info.java:1:1: compiler.err.duplicate.module: m1"))
  71             throw new Exception("expected output not found");
  72     }
  73 
  74     @Test
  75     public void testCantFindModule(Path base) throws Exception {
  76         Path src = base.resolve("src");
  77         Path src_m1 = src.resolve("m1");
  78         tb.writeJavaFiles(src_m1, "module m1 { }");
  79         Path misc = base.resolve("misc");
  80         tb.writeJavaFiles(misc, "package p; class C { }");
  81         Path classes = base.resolve("classes");
  82         tb.createDirectories(classes);
  83 
  84         String log = new JavacTask(tb)
  85                 .options("-XDrawDiagnostics",
  86                         "--module-source-path", src.toString())
  87                 .outdir(classes)
  88                 .files(join(findJavaFiles(src), findJavaFiles(misc)))
  89                 .run(Task.Expect.FAIL)
  90                 .writeAll()
  91                 .getOutput(Task.OutputKind.DIRECT);
  92 
  93         if (!log.contains("C.java:1:1: compiler.err.unnamed.pkg.not.allowed.named.modules"))
  94             throw new Exception("expected output not found");
  95     }
  96 
  97     @Test
  98     public void testModuleNameMismatch(Path base) throws Exception {
  99         Path src = base.resolve("src");
 100         Path src_m1 = src.resolve("m1");
 101         tb.writeJavaFiles(src_m1, "module m2 { }");
 102         Path classes = base.resolve("classes");
 103         tb.createDirectories(classes);
 104 
 105         String log = new JavacTask(tb)
 106                 .options("-XDrawDiagnostics",
 107                         "--module-source-path", src.toString())
 108                 .outdir(classes)
 109                 .files(findJavaFiles(src))
 110                 .run(Task.Expect.FAIL)
 111                 .writeAll()
 112                 .getOutput(Task.OutputKind.DIRECT);
 113 
 114         if (!log.contains("module-info.java:1:8: compiler.err.module.name.mismatch: m2, m1"))
 115             throw new Exception("expected output not found");
 116     }
 117 
 118     @Test
 119     public void testImplicitModuleSource(Path base) throws Exception {
 120         Path src = base.resolve("src");
 121         tb.writeJavaFiles(src.resolve("m1"), "module m1 { }");
 122         tb.writeJavaFiles(src.resolve("m2"), "module m2 { requires m1; }");
 123         Path modules = base.resolve("modules");
 124         Files.createDirectories(modules);
 125 
 126         new JavacTask(tb)
 127                 .options("--module-source-path", src.toString())
 128                 .outdir(modules)
 129                 .files(src.resolve("m2/module-info.java"))
 130                 .run()
 131                 .writeAll();
 132     }
 133 
 134     @Test
 135     public void testImplicitModuleClass(Path base) throws Exception {
 136         Path src1 = base.resolve("src1");
 137         tb.writeJavaFiles(src1.resolve("m1"), "module m1 { }");
 138         Path modules1 = base.resolve("modules1");
 139         Files.createDirectories(modules1);
 140 
 141         new JavacTask(tb)
 142                 .options("--module-source-path", src1.toString())
 143                 .outdir(modules1)
 144                 .files(src1.resolve("m1/module-info.java"))
 145                 .run()
 146                 .writeAll();
 147 
 148         Path src2= base.resolve("src2");
 149         tb.writeJavaFiles(src2.resolve("m2"), "module m2 { requires m1; }");
 150         Path modules2 = base.resolve("modules2");
 151         Files.createDirectories(modules2);
 152 
 153         new JavacTask(tb)
 154                 .options("--module-path", modules1.toString(),
 155                         "--module-source-path", src2.toString())
 156                 .outdir(modules2)
 157                 .files(src2.resolve("m2/module-info.java"))
 158                 .run()
 159                 .writeAll();
 160     }
 161 
 162     Path[] join(Path[] a, Path[] b) {
 163         List<Path> result = new ArrayList<>();
 164         result.addAll(Arrays.asList(a));
 165         result.addAll(Arrays.asList(b));
 166         return result.toArray(new Path[result.size()]);
 167     }
 168 }