--- /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;
+ }
+}