1 /*
   2  * Copyright (c) 2013, 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 module resolution
  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 ResolveTest
  33  */
  34 
  35 import java.nio.file.*;
  36 
  37 import toolbox.JavacTask;
  38 import toolbox.Task;
  39 import toolbox.ToolBox;
  40 
  41 public class ResolveTest extends ModuleTestBase {
  42     public static void main(String... args) throws Exception {
  43         ResolveTest t = new ResolveTest();
  44         t.runTests();
  45     }
  46 
  47     @Test
  48     public void testMissingSimpleTypeUnnamedModule(Path base) throws Exception {
  49         Path src = base.resolve("src");
  50         tb.writeJavaFiles(src, "class C { D d; }");
  51 
  52         String log = new JavacTask(tb)
  53                 .options("-XDrawDiagnostics")
  54                 .files(findJavaFiles(src))
  55                 .run(Task.Expect.FAIL)
  56                 .writeAll()
  57                 .getOutput(Task.OutputKind.DIRECT);
  58 
  59         if (!log.contains("C.java:1:11: compiler.err.cant.resolve.location: "
  60                 + "kindname.class, D, , , (compiler.misc.location: kindname.class, C, null)"))
  61             throw new Exception("expected output not found");
  62     }
  63 
  64     @Test
  65     public void testMissingSimpleTypeNamedModule(Path base) throws Exception {
  66         Path src = base.resolve("src");
  67         tb.writeJavaFiles(src,
  68                 "module m { }",
  69                 "class C { D d; }");
  70 
  71         String log = new JavacTask(tb)
  72                 .options("-XDrawDiagnostics")
  73                 .files(findJavaFiles(src))
  74                 .run(Task.Expect.FAIL)
  75                 .writeAll()
  76                 .getOutput(Task.OutputKind.DIRECT);
  77 
  78         if (!log.contains("C.java:1:11: compiler.err.cant.resolve.location: "
  79                 + "kindname.class, D, , , (compiler.misc.location: kindname.class, C, null)"))
  80             throw new Exception("expected output not found");
  81     }
  82 
  83     @Test
  84     public void testUnexportedTypeUnreadableModule(Path base) throws Exception {
  85         Path src = base.resolve("src");
  86         tb.writeJavaFiles(src.resolve("m1"),
  87                 "module m1 { }",
  88                 "package p1; public class C1 { }");
  89         tb.writeJavaFiles(src.resolve("m2"),
  90                 "module m2 { }",
  91                 "package p2; public class C2 { p1.C1 c; }");
  92         Path modules = base.resolve("modules");
  93         Files.createDirectories(modules);
  94 
  95         String log = new JavacTask(tb)
  96                 .options("-XDrawDiagnostics", "-modulesourcepath", src.toString())
  97                 .outdir(modules)
  98                 .files(findJavaFiles(src))
  99                 .run(Task.Expect.FAIL)
 100                 .writeAll()
 101                 .getOutput(Task.OutputKind.DIRECT);
 102 
 103         if (!log.contains("C2.java:1:33: compiler.err.not.def.access.package.cant.access: p1.C1, p1"))
 104             throw new Exception("expected output not found");
 105     }
 106 
 107     @Test
 108     public void testUnexportedTypeReadableModule(Path base) throws Exception {
 109         Path src = base.resolve("src");
 110         tb.writeJavaFiles(src.resolve("m1"),
 111                 "module m1 { }",
 112                 "package p1; public class C1 { }");
 113         tb.writeJavaFiles(src.resolve("m2"),
 114                 "module m2 { requires m1; }",
 115                 "package p2; public class C2 { p1.C1 c; }");
 116         Path modules = base.resolve("modules");
 117         Files.createDirectories(modules);
 118 
 119         String log = new JavacTask(tb)
 120                 .options("-XDrawDiagnostics", "-modulesourcepath", src.toString())
 121                 .outdir(modules)
 122                 .files(findJavaFiles(src))
 123                 .run(Task.Expect.FAIL)
 124                 .writeAll()
 125                 .getOutput(Task.OutputKind.DIRECT);
 126 
 127         if (!log.contains("C2.java:1:33: compiler.err.not.def.access.package.cant.access: p1.C1, p1"))
 128             throw new Exception("expected output not found");
 129     }
 130 
 131     @Test
 132     public void testQualifiedExportedTypeReadableModule(Path base) throws Exception {
 133         Path src = base.resolve("src");
 134         tb.writeJavaFiles(src.resolve("m1"),
 135                 "module m1 { exports p1 to m3; }",
 136                 "package p1; public class C1 { }");
 137         tb.writeJavaFiles(src.resolve("m2"),
 138                 "module m2 { requires m1; }",
 139                 "package p2; public class C2 { p1.C1 c; }");
 140         tb.writeJavaFiles(src.resolve("m3"),
 141                 "module m3 { requires m1; }");
 142         Path modules = base.resolve("modules");
 143         Files.createDirectories(modules);
 144 
 145         String log = new JavacTask(tb)
 146                 .options("-XDrawDiagnostics", "-modulesourcepath", src.toString())
 147                 .outdir(modules)
 148                 .files(findJavaFiles(src))
 149                 .run(Task.Expect.FAIL)
 150                 .writeAll()
 151                 .getOutput(Task.OutputKind.DIRECT);
 152 
 153         if (!log.contains("C2.java:1:33: compiler.err.not.def.access.package.cant.access: p1.C1, p1"))
 154             throw new Exception("expected output not found");
 155     }
 156 
 157     @Test
 158     public void testExportedTypeUnreadableModule(Path base) throws Exception {
 159         Path src = base.resolve("src");
 160         tb.writeJavaFiles(src.resolve("m1"),
 161                 "module m1 { exports p1; }",
 162                 "package p1; public class C1 { }");
 163         tb.writeJavaFiles(src.resolve("m2"),
 164                 "module m2 { }",
 165                 "package p2; public class C2 { p1.C1 c; }");
 166         Path modules = base.resolve("modules");
 167         Files.createDirectories(modules);
 168 
 169         String log = new JavacTask(tb)
 170                 .options("-XDrawDiagnostics", "-modulesourcepath", src.toString())
 171                 .outdir(modules)
 172                 .files(findJavaFiles(src))
 173                 .run(Task.Expect.FAIL)
 174                 .writeAll()
 175                 .getOutput(Task.OutputKind.DIRECT);
 176 
 177         if (!log.contains("C2.java:1:33: compiler.err.not.def.access.package.cant.access: p1.C1, p1"))
 178             throw new Exception("expected output not found");
 179     }
 180 
 181     @Test
 182     public void testExportedTypeReadableModule(Path base) throws Exception {
 183         Path src = base.resolve("src");
 184         tb.writeJavaFiles(src.resolve("m1"),
 185                 "module m1 { exports p1; }",
 186                 "package p1; public class C1 { }");
 187         tb.writeJavaFiles(src.resolve("m2"),
 188                 "module m2 { requires m1; }",
 189                 "package p2; public class C2 { p1.C1 c; }");
 190         Path modules = base.resolve("modules");
 191         Files.createDirectories(modules);
 192 
 193         new JavacTask(tb)
 194                 .options("-XDrawDiagnostics", "-modulesourcepath", src.toString())
 195                 .outdir(modules)
 196                 .files(findJavaFiles(src))
 197                 .run()
 198                 .writeAll();
 199     }
 200 
 201     @Test
 202     public void testExportedTypeReadableModule2(Path base) throws Exception {
 203         Path src = base.resolve("src");
 204         tb.writeJavaFiles(src.resolve("m1"),
 205                 "module m1 { exports p1 to m2; }",
 206                 "package p1; public class C1 { }");
 207         tb.writeJavaFiles(src.resolve("m2"),
 208                 "module m2 { requires m1; }",
 209                 "package p2; public class C2 { p1.C1 c; }");
 210         Path modules = base.resolve("modules");
 211         Files.createDirectories(modules);
 212 
 213         new JavacTask(tb)
 214                 .options("-XDrawDiagnostics", "-modulesourcepath", src.toString())
 215                 .outdir(modules)
 216                 .files(findJavaFiles(src))
 217                 .run()
 218                 .writeAll();
 219     }
 220 }