test/jdk/tools/launcher/modules/basic/BasicTest.java
changeset 47216 71c04702a3d5
parent 45393 de4e1efc8eec
child 51675 b487c1e914d0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/tools/launcher/modules/basic/BasicTest.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @library /lib/testlibrary /test/lib
+ * @modules jdk.compiler
+ *          jdk.jartool
+ *          jdk.jlink
+ * @build BasicTest jdk.test.lib.compiler.CompilerUtils jdk.testlibrary.*
+ * @run testng BasicTest
+ * @summary Basic test of starting an application as a module
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.spi.ToolProvider;
+
+import jdk.test.lib.compiler.CompilerUtils;
+import jdk.testlibrary.ProcessTools;
+
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+
+@Test
+public class BasicTest {
+    private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar")
+        .orElseThrow(() ->
+            new RuntimeException("jar tool not found")
+        );
+    private static final ToolProvider JMOD_TOOL = ToolProvider.findFirst("jmod")
+        .orElseThrow(() ->
+            new RuntimeException("jmod tool not found")
+        );
+
+    private static final Path USER_DIR = Paths.get(System.getProperty("user.dir"));
+
+    private static final String TEST_SRC = System.getProperty("test.src");
+
+    private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
+    private static final Path MODS_DIR = Paths.get("mods");
+
+    // the module name of the test module
+    private static final String TEST_MODULE = "test";
+
+    // the module main class
+    private static final String MAIN_CLASS = "jdk.test.Main";
+
+
+    @BeforeTest
+    public void compileTestModule() throws Exception {
+
+        // javac -d mods/$TESTMODULE src/$TESTMODULE/**
+        boolean compiled
+            = CompilerUtils.compile(SRC_DIR.resolve(TEST_MODULE),
+                                    MODS_DIR.resolve(TEST_MODULE));
+
+        assertTrue(compiled, "test module did not compile");
+    }
+
+    /**
+     * Execute "java" with the given arguments, returning the exit code.
+     */
+    private int exec(String... args) throws Exception {
+       return ProcessTools.executeTestJava(args)
+                .outputTo(System.out)
+                .errorTo(System.out)
+                .getExitValue();
+    }
+
+
+    /**
+     * The initial module is loaded from an exploded module
+     */
+    public void testRunWithExplodedModule() throws Exception {
+        String dir = MODS_DIR.toString();
+        String subdir = MODS_DIR.resolve(TEST_MODULE).toString();
+        String mid = TEST_MODULE + "/" + MAIN_CLASS;
+
+        // java --module-path mods -module $TESTMODULE/$MAINCLASS
+        int exitValue = exec("--module-path", dir, "--module", mid);
+        assertTrue(exitValue == 0);
+
+        // java --module-path mods/$TESTMODULE --module $TESTMODULE/$MAINCLASS
+        exitValue = exec("--module-path", subdir, "--module", mid);
+        assertTrue(exitValue == 0);
+
+        // java --module-path=mods --module=$TESTMODULE/$MAINCLASS
+        exitValue = exec("--module-path=" + dir, "--module=" + mid);
+        assertTrue(exitValue == 0);
+
+        // java --module-path=mods/$TESTMODULE --module=$TESTMODULE/$MAINCLASS
+        exitValue = exec("--module-path=" + subdir, "--module=" + mid);
+        assertTrue(exitValue == 0);
+
+        // java -p mods -m $TESTMODULE/$MAINCLASS
+        exitValue = exec("-p", dir, "-m", mid);
+        assertTrue(exitValue == 0);
+
+        // java -p mods/$TESTMODULE -m $TESTMODULE/$MAINCLASS
+        exitValue = exec("-p", subdir, "-m", mid);
+        assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * The initial module is loaded from a modular JAR file
+     */
+    public void testRunWithModularJar() throws Exception {
+        Path dir = Files.createTempDirectory(USER_DIR, "mlib");
+        Path jar = dir.resolve("m.jar");
+
+        // jar --create ...
+        String classes = MODS_DIR.resolve(TEST_MODULE).toString();
+        String[] args = {
+            "--create",
+            "--file=" + jar,
+            "--main-class=" + MAIN_CLASS,
+            "-C", classes, "."
+        };
+        int rc = JAR_TOOL.run(System.out, System.out, args);
+        assertTrue(rc == 0);
+
+        // java --module-path mlib -module $TESTMODULE
+        int exitValue = exec("--module-path", dir.toString(),
+                             "--module", TEST_MODULE);
+        assertTrue(exitValue == 0);
+
+        // java --module-path mlib/m.jar -module $TESTMODULE
+        exitValue = exec("--module-path", jar.toString(),
+                         "--module", TEST_MODULE);
+        assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * Attempt to run with the initial module packaged as a JMOD file.
+     */
+    public void testTryRunWithJMod() throws Exception {
+        Path dir = Files.createTempDirectory(USER_DIR, "mlib");
+
+        // jmod create ...
+        String cp = MODS_DIR.resolve(TEST_MODULE).toString();
+        String jmod = dir.resolve("m.jmod").toString();
+        String[] args = {
+            "create",
+            "--class-path", cp,
+            "--main-class", MAIN_CLASS,
+            jmod
+        };
+
+        assertEquals(JMOD_TOOL.run(System.out, System.out, args), 0);
+
+        // java --module-path mods --module $TESTMODULE
+        int exitValue = exec("--module-path", dir.toString(),
+                             "--module", TEST_MODULE);
+        assertTrue(exitValue != 0);
+    }
+
+
+    /**
+     * Run the test with a non-existent file on the application module path.
+     * It should be silently ignored.
+     */
+    public void testRunWithNonExistentEntry() throws Exception {
+        String mp = "DoesNotExist" + File.pathSeparator + MODS_DIR.toString();
+        String mid = TEST_MODULE + "/" + MAIN_CLASS;
+
+        // java --module-path mods --module $TESTMODULE/$MAINCLASS
+        int exitValue = exec("--module-path", mp, "--module", mid);
+        assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * Attempt to run an unknown initial module
+     */
+    public void testTryRunWithBadModule() throws Exception {
+        String modulepath = MODS_DIR.toString();
+
+        // java --module-path mods -m $TESTMODULE
+        int exitValue = exec("--module-path", modulepath, "-m", "rhubarb");
+        assertTrue(exitValue != 0);
+    }
+
+
+    /**
+     * Attempt to run with -m specifying a main class that does not
+     * exist.
+     */
+    public void testTryRunWithBadMainClass() throws Exception {
+        String modulepath = MODS_DIR.toString();
+        String mid = TEST_MODULE + "/p.rhubarb";
+
+        // java --module-path mods -m $TESTMODULE/$MAINCLASS
+        int exitValue = exec("--module-path", modulepath, "-m", mid);
+        assertTrue(exitValue != 0);
+    }
+
+
+    /**
+     * Attempt to run with -m specifying a modular JAR that does not have
+     * a MainClass attribute
+     */
+    public void testTryRunWithMissingMainClass() throws Exception {
+        Path dir = Files.createTempDirectory(USER_DIR, "mlib");
+
+        // jar --create ...
+        String classes = MODS_DIR.resolve(TEST_MODULE).toString();
+        String jar = dir.resolve("m.jar").toString();
+        String[] args = {
+            "--create",
+            "--file=" + jar,
+            "-C", classes, "."
+        };
+        int rc = JAR_TOOL.run(System.out, System.out, args);
+        assertTrue(rc == 0);
+
+        // java --module-path mods -m $TESTMODULE
+        int exitValue = exec("--module-path", dir.toString(), "-m", TEST_MODULE);
+        assertTrue(exitValue != 0);
+    }
+
+
+    /**
+     * Attempt to run with -m specifying a main class that is a different
+     * module to that specified to -m
+     */
+    public void testTryRunWithMainClassInWrongModule() throws Exception {
+        String modulepath = MODS_DIR.toString();
+        String mid = "java.base/" + MAIN_CLASS;
+
+        // java --module-path mods --module $TESTMODULE/$MAINCLASS
+        int exitValue = exec("--module-path", modulepath, "--module", mid);
+        assertTrue(exitValue != 0);
+    }
+
+}