test/jdk/tools/jlink/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/jlink/basic/BasicTest.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2015, 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
+ * @summary Basic test of jlink to create jmods and images
+ * @author Andrei Eremeev
+ * @library /lib/testlibrary /test/lib
+ * @modules java.base/jdk.internal.module
+ *          jdk.jlink
+ *          jdk.compiler
+ * @build jdk.testlibrary.ProcessTools
+ *        jdk.testlibrary.OutputAnalyzer
+ *        JarUtils jdk.test.lib.compiler.CompilerUtils
+ * @run main BasicTest
+ */
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.spi.ToolProvider;
+
+import jdk.test.lib.compiler.CompilerUtils;
+import jdk.testlibrary.OutputAnalyzer;
+import jdk.testlibrary.ProcessTools;
+
+public class BasicTest {
+    static final ToolProvider JMOD_TOOL = ToolProvider.findFirst("jmod")
+        .orElseThrow(() ->
+            new RuntimeException("jmod tool not found")
+        );
+
+    static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink")
+        .orElseThrow(() ->
+            new RuntimeException("jlink tool not found")
+        );
+
+    private final String TEST_MODULE = "test";
+    private final Path jdkHome = Paths.get(System.getProperty("test.jdk"));
+    private final Path jdkMods = jdkHome.resolve("jmods");
+    private final Path testSrc = Paths.get(System.getProperty("test.src"));
+    private final Path src = testSrc.resolve("src").resolve(TEST_MODULE);
+    private final Path classes = Paths.get("classes");
+    private final Path jmods = Paths.get("jmods");
+    private final Path jars = Paths.get("jars");
+
+    public static void main(String[] args) throws Throwable {
+        new BasicTest().run();
+    }
+
+    public void run() throws Throwable {
+        if (Files.notExists(jdkMods)) {
+            return;
+        }
+
+        if (!CompilerUtils.compile(src, classes)) {
+            throw new AssertionError("Compilation failure. See log.");
+        }
+
+        Files.createDirectories(jmods);
+        Files.createDirectories(jars);
+        Path jarfile = jars.resolve("test.jar");
+        JarUtils.createJarFile(jarfile, classes);
+
+        Path image = Paths.get("mysmallimage");
+        runJmod(jarfile.toString(), TEST_MODULE, true);
+        runJlink(image, TEST_MODULE, "--compress", "2", "--launcher", "foo=" + TEST_MODULE);
+        execute(image, "foo");
+
+        Files.delete(jmods.resolve(TEST_MODULE + ".jmod"));
+
+        image = Paths.get("myimage");
+        runJmod(classes.toString(), TEST_MODULE, true);
+        runJlink(image, TEST_MODULE, "--launcher", "bar=" + TEST_MODULE);
+        execute(image, "bar");
+
+        Files.delete(jmods.resolve(TEST_MODULE + ".jmod"));
+
+        image = Paths.get("myimage2");
+        runJmod(classes.toString(), TEST_MODULE, false /* no ModuleMainClass! */);
+        // specify main class in --launcher command line
+        runJlink(image, TEST_MODULE, "--launcher", "bar2=" + TEST_MODULE + "/jdk.test.Test");
+        execute(image, "bar2");
+
+    }
+
+    private void execute(Path image, String scriptName) throws Throwable {
+        String cmd = image.resolve("bin").resolve(scriptName).toString();
+        OutputAnalyzer analyzer;
+        if (System.getProperty("os.name").startsWith("Windows")) {
+            analyzer = ProcessTools.executeProcess("sh.exe", cmd, "1", "2", "3");
+        } else {
+            analyzer = ProcessTools.executeProcess(cmd, "1", "2", "3");
+        }
+        if (analyzer.getExitValue() != 0) {
+            throw new AssertionError("Image invocation failed: rc=" + analyzer.getExitValue());
+        }
+    }
+
+    private void runJlink(Path image, String modName, String... options) {
+        List<String> args = new ArrayList<>();
+        Collections.addAll(args,
+                "--module-path", jdkMods + File.pathSeparator + jmods,
+                "--add-modules", modName,
+                "--output", image.toString());
+        Collections.addAll(args, options);
+
+        PrintWriter pw = new PrintWriter(System.out);
+        int rc = JLINK_TOOL.run(pw, pw, args.toArray(new String[args.size()]));
+        if (rc != 0) {
+            throw new AssertionError("Jlink failed: rc = " + rc);
+        }
+    }
+
+    private void runJmod(String cp, String modName, boolean main) {
+        int rc;
+        if (main) {
+            rc = JMOD_TOOL.run(System.out, System.out, new String[] {
+                "create",
+                "--class-path", cp,
+                "--module-version", "1.0",
+                "--main-class", "jdk.test.Test",
+                jmods.resolve(modName + ".jmod").toString()
+            });
+        } else {
+            rc = JMOD_TOOL.run(System.out, System.out, new String[] {
+                "create",
+                "--class-path", cp,
+                "--module-version", "1.0",
+                jmods.resolve(modName + ".jmod").toString(),
+            });
+        }
+
+        if (rc != 0) {
+            throw new AssertionError("Jmod failed: rc = " + rc);
+        }
+    }
+}