test/jdk/tools/jpackage/share/AdditionalLaunchersTest.java
branchJDK-8200758-branch
changeset 58301 e0efb29609bd
child 58416 f09bf58c1f17
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/tools/jpackage/share/AdditionalLaunchersTest.java	Tue Sep 24 13:41:16 2019 -0400
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2018, 2019, 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.
+ */
+
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.List;
+import java.util.Optional;
+import java.lang.invoke.MethodHandles;
+import jdk.jpackage.test.HelloApp;
+import jdk.jpackage.test.PackageTest;
+import jdk.jpackage.test.PackageType;
+import jdk.jpackage.test.FileAssociations;
+import jdk.jpackage.test.Test;
+
+/**
+ * Test --add-launcher parameter. Output of the test should be
+ * additionallauncherstest*.* installer. The output installer should provide the
+ * same functionality as the default installer (see description of the default
+ * installer in SimplePackageTest.java) plus install three extra application
+ * launchers.
+ */
+
+/*
+ * @test
+ * @summary jpackage with --add-launcher
+ * @library ../helpers
+ * @modules jdk.jpackage/jdk.jpackage.internal
+ * @run main/othervm/timeout=360 -Xmx512m AdditionalLaunchersTest
+ */
+public class AdditionalLaunchersTest {
+
+    public static void main(String[] args) {
+        Test.run(args, () -> {
+            FileAssociations fa = new FileAssociations(
+                    MethodHandles.lookup().lookupClass().getSimpleName());
+
+            // Configure a bunch of additional launchers and also setup
+            // file association to make sure it will be linked only to the main
+            // launcher.
+
+            PackageTest packageTest = new PackageTest().configureHelloApp()
+            .addInitializer(cmd -> {
+                fa.createFile();
+                cmd.addArguments("--file-associations", fa.getPropertiesFile());
+                cmd.addArguments("--arguments", "Duke", "--arguments", "is",
+                        "--arguments", "the", "--arguments", "King");
+            });
+
+            packageTest.addHelloAppFileAssociationsVerifier(fa);
+
+            new AdditionalLauncher("Baz2").setArguments().applyTo(packageTest);
+            new AdditionalLauncher("foo").setArguments("yep!").applyTo(packageTest);
+
+            AdditionalLauncher barLauncher = new AdditionalLauncher("Bar").setArguments(
+                    "one", "two", "three");
+            packageTest.forTypes(PackageType.LINUX).addInitializer(cmd -> {
+                barLauncher.setIcon(Test.TEST_SRC_ROOT.resolve("apps/dukeplug.png"));
+            });
+            barLauncher.applyTo(packageTest);
+
+            packageTest.run();
+        });
+    }
+
+    private static Path replaceFileName(Path path, String newFileName) {
+        String fname = path.getFileName().toString();
+        int lastDotIndex = fname.lastIndexOf(".");
+        if (lastDotIndex != -1) {
+            fname = newFileName + fname.substring(lastDotIndex);
+        }
+        return path.getParent().resolve(fname);
+    }
+
+    static class AdditionalLauncher {
+
+        AdditionalLauncher(String name) {
+            this.name = name;
+        }
+
+        AdditionalLauncher setArguments(String... args) {
+            arguments = List.of(args);
+            return this;
+        }
+
+        AdditionalLauncher setIcon(Path iconPath) {
+            icon = iconPath;
+            return this;
+        }
+
+        void applyTo(PackageTest test) {
+            final Path propsFile = Test.workDir().resolve(name + ".properties");
+
+            test.addInitializer(cmd -> {
+                cmd.addArguments("--add-launcher", String.format("%s=%s", name,
+                        propsFile));
+
+                Map<String, String> properties = new HashMap<>();
+                if (arguments != null) {
+                    properties.put("arguments", String.join(" ",
+                            arguments.toArray(String[]::new)));
+                }
+
+                if (icon != null) {
+                    properties.put("icon", icon.toAbsolutePath().toString());
+                }
+
+                Test.createPropertiesFile(propsFile, properties);
+            });
+            test.addInstallVerifier(cmd -> {
+                Path launcherPath = replaceFileName(
+                        cmd.launcherInstallationPath(), name);
+
+                Test.assertExecutableFileExists(launcherPath, true);
+
+                if (cmd.isFakeRuntimeInstalled(String.format(
+                        "Not running %s launcher", launcherPath))) {
+                    return;
+                }
+                HelloApp.executeAndVerifyOutput(launcherPath,
+                        Optional.ofNullable(arguments).orElse(List.of()).toArray(
+                                String[]::new));
+            });
+            test.addUninstallVerifier(cmd -> {
+                Path launcherPath = replaceFileName(
+                        cmd.launcherInstallationPath(), name);
+
+                Test.assertExecutableFileExists(launcherPath, false);
+            });
+        }
+
+        private List<String> arguments;
+        private Path icon;
+        private final String name;
+    }
+}