langtools/test/tools/javac/modules/AutomaticModules.java
changeset 45682 fc3b228b9e2a
parent 44576 9e18c9ce29e7
--- a/langtools/test/tools/javac/modules/AutomaticModules.java	Thu Jun 15 17:24:13 2017 +0000
+++ b/langtools/test/tools/javac/modules/AutomaticModules.java	Fri Jun 16 09:21:38 2017 -0700
@@ -34,14 +34,18 @@
  * @run main AutomaticModules
  */
 
+import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 import toolbox.JarTask;
 import toolbox.JavacTask;
 import toolbox.Task;
+import toolbox.Task.Mode;
 
 public class AutomaticModules extends ModuleTestBase {
 
@@ -614,4 +618,204 @@
         }
     }
 
+    @Test
+    public void testAutomaticModuleNameCorrect(Path base) throws Exception {
+        Path modulePath = base.resolve("module-path");
+
+        Files.createDirectories(modulePath);
+
+        Path automaticSrc = base.resolve("automaticSrc");
+        tb.writeJavaFiles(automaticSrc, "package api; public class Api {}");
+        Path automaticClasses = base.resolve("automaticClasses");
+        tb.createDirectories(automaticClasses);
+
+        String automaticLog = new JavacTask(tb)
+                                .outdir(automaticClasses)
+                                .files(findJavaFiles(automaticSrc))
+                                .run()
+                                .writeAll()
+                                .getOutput(Task.OutputKind.DIRECT);
+
+        if (!automaticLog.isEmpty())
+            throw new Exception("expected output not found: " + automaticLog);
+
+        Path automaticJar = modulePath.resolve("automatic-1.0.jar");
+
+        new JarTask(tb, automaticJar)
+          .baseDir(automaticClasses)
+          .files("api/Api.class")
+          .manifest("Automatic-Module-Name: custom.module.name\n\n")
+          .run();
+
+        Path src = base.resolve("src");
+
+        tb.writeJavaFiles(src,
+                          "module m { requires custom.module.name; }",
+                          "package impl; public class Impl { api.Api a; }");
+
+        Path classes = base.resolve("classes");
+
+        Files.createDirectories(classes);
+
+        new JavacTask(tb)
+                .options("--module-path", modulePath.toString(),
+                         "-XDrawDiagnostics")
+                .outdir(classes)
+                .files(findJavaFiles(src))
+                .run(Task.Expect.SUCCESS)
+                .writeAll()
+                .getOutputLines(Task.OutputKind.DIRECT);
+
+        tb.writeJavaFiles(src,
+                          "module m { requires automatic; }");
+
+        List<String> log = new JavacTask(tb)
+                .options("--module-path", modulePath.toString(),
+                         "-XDrawDiagnostics")
+                .outdir(classes)
+                .files(findJavaFiles(src))
+                .run(Task.Expect.FAIL)
+                .writeAll()
+                .getOutputLines(Task.OutputKind.DIRECT);
+
+        List<String> expected =
+                Arrays.asList("module-info.java:1:21: compiler.err.module.not.found: automatic",
+                              "1 error");
+
+        if (!expected.equals(log)) {
+            throw new Exception("expected output not found: " + log);
+        }
+    }
+
+    @Test
+    public void testAutomaticModuleNameIncorrect(Path base) throws Exception {
+        for (String name : new String[] {"", "999", "foo.class", "foo._"}) {
+            if (Files.isDirectory(base)) {
+                tb.cleanDirectory(base);
+            }
+            Path modulePath = base.resolve("module-path");
+
+            Files.createDirectories(modulePath);
+
+            Path automaticSrc = base.resolve("automaticSrc");
+            tb.writeJavaFiles(automaticSrc, "package api; public class Api {}");
+            Path automaticClasses = base.resolve("automaticClasses");
+            tb.createDirectories(automaticClasses);
+
+            String automaticLog = new JavacTask(tb)
+                                    .outdir(automaticClasses)
+                                    .files(findJavaFiles(automaticSrc))
+                                    .run()
+                                    .writeAll()
+                                    .getOutput(Task.OutputKind.DIRECT);
+
+            if (!automaticLog.isEmpty())
+                throw new Exception("expected output not found: " + automaticLog);
+
+            Path automaticJar = modulePath.resolve("automatic-1.0.jar");
+
+            new JarTask(tb, automaticJar)
+              .baseDir(automaticClasses)
+              .files("api/Api.class")
+              .manifest("Automatic-Module-Name: " + name + "\n\n")
+              .run();
+
+            Path src = base.resolve("src");
+
+            tb.writeJavaFiles(src,
+                              "package impl; public class Impl { api.Api a; }");
+
+            Path classes = base.resolve("classes");
+
+            Files.createDirectories(classes);
+
+            List<String> log = new JavacTask(tb, Mode.CMDLINE)
+                    .options("--module-path", modulePath.toString(),
+                             "--add-modules", "ALL-MODULE-PATH",
+                             "-XDrawDiagnostics")
+                    .outdir(classes)
+                    .files(findJavaFiles(src))
+                    .run(Task.Expect.FAIL)
+                    .writeAll()
+                    .getOutputLines(Task.OutputKind.DIRECT);
+
+            List<String> expected =
+                    Arrays.asList("- compiler.err.locn.cant.get.module.name.for.jar: " +
+                                      "testAutomaticModuleNameIncorrect/module-path/automatic-1.0.jar".replace("/", File.separator),
+                                  "1 error");
+
+            if (!expected.equals(log)) {
+                throw new Exception("expected output not found: " + log);
+            }
+        }
+    }
+
+    @Test
+    public void testAutomaticModuleNameBroken(Path base) throws Exception {
+        Path modulePath = base.resolve("module-path");
+
+        Files.createDirectories(modulePath);
+
+        Path automaticSrc = base.resolve("automaticSrc");
+        tb.writeJavaFiles(automaticSrc, "package api; public class Api {}");
+        Path automaticClasses = base.resolve("automaticClasses");
+        tb.createDirectories(automaticClasses);
+
+        String automaticLog = new JavacTask(tb)
+                                .outdir(automaticClasses)
+                                .files(findJavaFiles(automaticSrc))
+                                .run()
+                                .writeAll()
+                                .getOutput(Task.OutputKind.DIRECT);
+
+        if (!automaticLog.isEmpty())
+            throw new Exception("expected output not found: " + automaticLog);
+
+        Path automaticJar = modulePath.resolve("automatic-1.0.jar");
+
+        try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(automaticJar))) {
+            out.putNextEntry(new ZipEntry("api/Api.class"));
+            Files.copy(automaticClasses.resolve("api").resolve("Api.class"), out);
+        }
+
+        Path src = base.resolve("src");
+
+        tb.writeJavaFiles(src,
+                          "module m { requires automatic; }",
+                          "package impl; public class Impl { api.Api a; }");
+
+        Path classes = base.resolve("classes");
+
+        Files.createDirectories(classes);
+
+        new JavacTask(tb)
+                .options("--module-path", modulePath.toString(),
+                         "-XDrawDiagnostics")
+                .outdir(classes)
+                .files(findJavaFiles(src))
+                .run(Task.Expect.SUCCESS)
+                .writeAll()
+                .getOutputLines(Task.OutputKind.DIRECT);
+
+        tb.writeJavaFiles(src,
+                          "module m { requires custom.module.name; }");
+
+        List<String> log = new JavacTask(tb)
+                .options("--module-path", modulePath.toString(),
+                         "-XDrawDiagnostics")
+                .outdir(classes)
+                .files(findJavaFiles(src))
+                .run(Task.Expect.FAIL)
+                .writeAll()
+                .getOutputLines(Task.OutputKind.DIRECT);
+
+        List<String> expected =
+                Arrays.asList("module-info.java:1:34: compiler.err.module.not.found: custom.module.name",
+                              "1 error");
+
+        if (!expected.equals(log)) {
+            throw new Exception("expected output not found: " + log);
+        }
+    }
+
 }