From df75426b4f70b942dafeb156a0b89dcaa05e4497 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Tue, 17 Dec 2019 15:52:20 -0500 Subject: [PATCH] 8236134: files missing in putback to JDK-8233270 Reviewed-by: herrick, prr, almatvee --- .../apps/com.other/com/other/Other.java | 64 ----- .../jpackage/apps/com.other/module-info.java | 26 -- .../jdk/jpackage/test/AdditionalLauncher.java | 239 ++++++++++++++++++ .../jpackage/test/LauncherIconVerifier.java | 93 +++++++ .../jpackage/test/RunnablePackageTest.java | 153 +++++++++++ test/jdk/tools/jpackage/manage_packages.sh | 231 ----------------- test/jdk/tools/jpackage/resources/icon2.icns | Bin 0 -> 58934 bytes test/jdk/tools/jpackage/resources/icon2.ico | Bin 0 -> 17542 bytes test/jdk/tools/jpackage/resources/icon2.png | Bin 0 -> 7270 bytes test/jdk/tools/jpackage/resources/icon3.ico | Bin 0 -> 17542 bytes test/jdk/tools/jpackage/resources/icon3.png | Bin 0 -> 7291 bytes test/jdk/tools/jpackage/resources/icon4.ico | Bin 0 -> 17542 bytes test/jdk/tools/jpackage/resources/icon4.png | Bin 0 -> 4799 bytes .../query-msi-property.js} | 64 +++-- .../tools/jpackage/share/AddLauncherBase.java | 193 -------------- .../tools/jpackage/share/AddLauncherTest.java | 83 ------ .../jpackage/share/AddLaunchersTest.java | 83 ------ 17 files changed, 524 insertions(+), 705 deletions(-) delete mode 100644 test/jdk/tools/jpackage/apps/com.other/com/other/Other.java delete mode 100644 test/jdk/tools/jpackage/apps/com.other/module-info.java create mode 100644 test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java create mode 100644 test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java create mode 100644 test/jdk/tools/jpackage/helpers/jdk/jpackage/test/RunnablePackageTest.java delete mode 100644 test/jdk/tools/jpackage/manage_packages.sh create mode 100644 test/jdk/tools/jpackage/resources/icon2.icns create mode 100644 test/jdk/tools/jpackage/resources/icon2.ico create mode 100644 test/jdk/tools/jpackage/resources/icon2.png create mode 100644 test/jdk/tools/jpackage/resources/icon3.ico create mode 100644 test/jdk/tools/jpackage/resources/icon3.png create mode 100644 test/jdk/tools/jpackage/resources/icon4.ico create mode 100644 test/jdk/tools/jpackage/resources/icon4.png rename test/jdk/tools/jpackage/{share/AddLauncherModuleTest.java => resources/query-msi-property.js} (51%) delete mode 100644 test/jdk/tools/jpackage/share/AddLauncherBase.java delete mode 100644 test/jdk/tools/jpackage/share/AddLauncherTest.java delete mode 100644 test/jdk/tools/jpackage/share/AddLaunchersTest.java diff --git a/test/jdk/tools/jpackage/apps/com.other/com/other/Other.java b/test/jdk/tools/jpackage/apps/com.other/com/other/Other.java deleted file mode 100644 index fffe54b8634..00000000000 --- a/test/jdk/tools/jpackage/apps/com.other/com/other/Other.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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. - */ - -package com.other; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.PrintWriter; - -public class Other { - - private static final String MSG = "other jpackage test application"; - private static final int EXPECTED_NUM_OF_PARAMS = 3; // Starts at 1 - - public static void main(String[] args) { - String outputFile = "appOutput.txt"; - File file = new File(outputFile); - - try (PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)))) { - System.out.println(MSG); - out.println(MSG); - - System.out.println("args.length: " + args.length); - out.println("args.length: " + args.length); - - for (String arg : args) { - System.out.println(arg); - out.println(arg); - } - - for (int index = 1; index <= EXPECTED_NUM_OF_PARAMS; index++) { - String value = System.getProperty("param" + index); - if (value != null) { - System.out.println("-Dparam" + index + "=" + value); - out.println("-Dparam" + index + "=" + value); - } - } - } catch (Exception ex) { - System.err.println(ex.toString()); - } - } - -} diff --git a/test/jdk/tools/jpackage/apps/com.other/module-info.java b/test/jdk/tools/jpackage/apps/com.other/module-info.java deleted file mode 100644 index b5dfa3eeede..00000000000 --- a/test/jdk/tools/jpackage/apps/com.other/module-info.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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. - */ - -module com.other { - exports com.other; -} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java new file mode 100644 index 00000000000..f7d8e72e015 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java @@ -0,0 +1,239 @@ +/* + * Copyright (c) 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. + */ +package jdk.jpackage.test; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.stream.Stream; +import jdk.jpackage.test.Functional.ThrowingBiConsumer; + +public final class AdditionalLauncher { + + public AdditionalLauncher(String name) { + this.name = name; + this.rawProperties = new ArrayList<>(); + setPersistenceHandler(null); + } + + public AdditionalLauncher setDefaultArguments(String... v) { + defaultArguments = new ArrayList<>(List.of(v)); + return this; + } + + public AdditionalLauncher addDefaultArguments(String... v) { + if (defaultArguments == null) { + return setDefaultArguments(v); + } + + defaultArguments.addAll(List.of(v)); + return this; + } + + public AdditionalLauncher setJavaOptions(String... v) { + javaOptions = new ArrayList<>(List.of(v)); + return this; + } + + public AdditionalLauncher addJavaOptions(String... v) { + if (javaOptions == null) { + return setJavaOptions(v); + } + + javaOptions.addAll(List.of(v)); + return this; + } + + public AdditionalLauncher addRawProperties(Map.Entry... v) { + return addRawProperties(List.of(v)); + } + + public AdditionalLauncher addRawProperties( + Collection> v) { + rawProperties.addAll(v); + return this; + } + + public AdditionalLauncher setIcon(Path iconPath) { + if (iconPath == NO_ICON) { + throw new IllegalArgumentException(); + } + + icon = iconPath; + return this; + } + + public AdditionalLauncher setNoIcon() { + icon = NO_ICON; + return this; + } + + public AdditionalLauncher setPersistenceHandler( + ThrowingBiConsumer>> handler) { + if (handler != null) { + createFileHandler = ThrowingBiConsumer.toBiConsumer(handler); + } else { + createFileHandler = TKit::createPropertiesFile; + } + return this; + } + + public void applyTo(JPackageCommand cmd) { + cmd.addPrerequisiteAction(this::initialize); + cmd.addVerifyAction(this::verify); + } + + public void applyTo(PackageTest test) { + test.addInitializer(this::initialize); + test.addInstallVerifier(this::verify); + } + + private void initialize(JPackageCommand cmd) { + final Path propsFile = TKit.workDir().resolve(name + ".properties"); + + cmd.addArguments("--add-launcher", String.format("%s=%s", name, + propsFile)); + + List> properties = new ArrayList<>(); + if (defaultArguments != null) { + properties.add(Map.entry("arguments", + JPackageCommand.escapeAndJoin(defaultArguments))); + } + + if (javaOptions != null) { + properties.add(Map.entry("java-options", + JPackageCommand.escapeAndJoin(javaOptions))); + } + + if (icon != null) { + final String iconPath; + if (icon == NO_ICON) { + iconPath = ""; + } else { + iconPath = icon.toAbsolutePath().toString().replace('\\', '/'); + } + properties.add(Map.entry("icon", iconPath)); + } + + properties.addAll(rawProperties); + + createFileHandler.accept(propsFile, properties); + } + + private static Path iconInResourceDir(JPackageCommand cmd, + String launcherName) { + Path resourceDir = cmd.getArgumentValue("--resource-dir", () -> null, + Path::of); + if (resourceDir != null) { + Path icon = resourceDir.resolve( + Optional.ofNullable(launcherName).orElseGet(() -> cmd.name()) + + TKit.ICON_SUFFIX); + if (Files.exists(icon)) { + return icon; + } + } + return null; + } + + private void verifyIcon(JPackageCommand cmd) throws IOException { + var verifier = new LauncherIconVerifier().setLauncherName(name); + + if (TKit.isOSX()) { + // On Mac should be no icon files for additional launchers. + verifier.applyTo(cmd); + return; + } + + boolean withLinuxDesktopFile = false; + + final Path effectiveIcon = Optional.ofNullable(icon).orElseGet( + () -> iconInResourceDir(cmd, name)); + while (effectiveIcon != NO_ICON) { + if (effectiveIcon != null) { + withLinuxDesktopFile = true; + verifier.setExpectedIcon(effectiveIcon); + break; + } + + Path customMainLauncherIcon = cmd.getArgumentValue("--icon", + () -> iconInResourceDir(cmd, null), Path::of); + if (customMainLauncherIcon != null) { + withLinuxDesktopFile = true; + verifier.setExpectedIcon(customMainLauncherIcon); + break; + } + + verifier.setExpectedDefaultIcon(); + break; + } + + if (TKit.isLinux() && !cmd.isImagePackageType()) { + if (effectiveIcon != NO_ICON && !withLinuxDesktopFile) { + withLinuxDesktopFile = Stream.of("--linux-shortcut").anyMatch( + cmd::hasArgument); + verifier.setExpectedDefaultIcon(); + } + Path desktopFile = LinuxHelper.getDesktopFile(cmd, name); + if (withLinuxDesktopFile) { + TKit.assertFileExists(desktopFile); + } else { + TKit.assertPathExists(desktopFile, false); + } + } + + verifier.applyTo(cmd); + } + + private void verify(JPackageCommand cmd) throws IOException { + verifyIcon(cmd); + + Path launcherPath = cmd.appLauncherPath(name); + + TKit.assertExecutableFileExists(launcherPath); + + if (cmd.isFakeRuntime(String.format( + "Not running %s launcher", launcherPath))) { + return; + } + + HelloApp.assertApp(launcherPath) + .addDefaultArguments(Optional + .ofNullable(defaultArguments) + .orElseGet(() -> List.of(cmd.getAllArgumentValues("--arguments")))) + .addJavaOptions(Optional + .ofNullable(javaOptions) + .orElseGet(() -> List.of(cmd.getAllArgumentValues("--java-options")))) + .executeAndVerifyOutput(); + } + + private List javaOptions; + private List defaultArguments; + private Path icon; + private final String name; + private final List> rawProperties; + private BiConsumer>> createFileHandler; + + private final static Path NO_ICON = Path.of(""); +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java new file mode 100644 index 00000000000..4ef62b28fc0 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 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. + */ + +package jdk.jpackage.test; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public final class LauncherIconVerifier { + public LauncherIconVerifier() { + } + + public LauncherIconVerifier setLauncherName(String v) { + launcherName = v; + return this; + } + + public LauncherIconVerifier setExpectedIcon(Path v) { + expectedIcon = v; + return this; + } + + public LauncherIconVerifier setExpectedDefaultIcon() { + expectedIcon = getDefaultIcon(); + return this; + } + + public void applyTo(JPackageCommand cmd) throws IOException { + final String curLauncherName; + final String label; + if (launcherName == null) { + curLauncherName = cmd.name(); + label = "main"; + } else { + curLauncherName = launcherName; + label = String.format("[%s]", launcherName); + } + + Path iconPath = cmd.appLayout().destktopIntegrationDirectory().resolve( + curLauncherName + TKit.ICON_SUFFIX); + + if (expectedIcon == null) { + TKit.assertPathExists(iconPath, false); + return; + } + + TKit.assertFileExists(iconPath); + TKit.assertTrue(-1 == Files.mismatch(expectedIcon, iconPath), + String.format( + "Check icon file [%s] of %s launcher is a copy of source icon file [%s]", + iconPath, label, expectedIcon)); + } + + public static Path getDefaultIcon() { + final String[] components; + if (TKit.isOSX()) { + components = new String[] { "macosx", "java.icns" }; + } else if (TKit.isLinux()) { + components = new String[] { "linux", "java32.png" }; + } else if (TKit.isWindows()) { + components = new String[] { "windows", "java48.ico" }; + } else { + throw TKit.throwUnknownPlatformError(); + } + + return TKit.SRC_ROOT.resolve(Path.of(components[0], + "classes/jdk/incubator/jpackage/internal/resources", components[1])); + } + + private String launcherName; + private Path expectedIcon; +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/RunnablePackageTest.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/RunnablePackageTest.java new file mode 100644 index 00000000000..6f98cfc234d --- /dev/null +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/RunnablePackageTest.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 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. + */ + +package jdk.jpackage.test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public abstract class RunnablePackageTest { + public final void run(Action... actions) { + final List actionList = new ArrayList<>(); + actionList.add(Action.INITIALIZE); + if (actions.length == 0) { + actionList.addAll(DEFAULT_ACTIONS); + } else { + actionList.addAll(Stream.of(actions) + .filter(Predicate.not(Action.INITIALIZE::equals)) + .filter(Predicate.not(Action.FINALIZE::equals)) + .collect(Collectors.toList())); + } + actionList.add(Action.FINALIZE); + + var actionGroups = groupActions(actionList); + TKit.trace(String.format("Actions: " + Arrays.deepToString( + actionGroups.toArray(Action[][]::new)))); + + runActions(actionGroups); + } + + protected void runActions(List actions) { + actions.forEach(this::runAction); + } + + protected abstract void runAction(Action... action); + + /** + * Test action. + */ + static public enum Action { + /** + * Init test. + */ + INITIALIZE, + /** + * Create bundle. + */ + CREATE, + /** + * Verify unpacked/installed package. + */ + VERIFY_INSTALL, + /** + * Verify uninstalled package. + */ + VERIFY_UNINSTALL, + /** + * Unpack package bundle. + */ + UNPACK, + /** + * Install package. + */ + INSTALL, + /** + * Uninstall package. + */ + UNINSTALL, + /** + * Finalize test. + */ + FINALIZE; + + @Override + public String toString() { + return name().toLowerCase().replace('_', '-'); + } + + public final static Action[] CREATE_AND_UNPACK = new Action[] { + CREATE, UNPACK, VERIFY_INSTALL + }; + }; + + private List groupActions(List actions) { + List groups = new ArrayList<>(); + List group = null; + for (var action: actions) { + if (group == null) { + group = new ArrayList<>(); + group.add(action); + } else if (group.get(group.size() - 1) == Action.INSTALL + && action == Action.VERIFY_INSTALL) { + // Group `install` and `verify install` actions together + group.add(action); + } else { + groups.add(group.toArray(Action[]::new)); + group.clear(); + group.add(action); + } + } + if (group != null) { + groups.add(group.toArray(Action[]::new)); + } + + return groups; + } + + private final static List DEFAULT_ACTIONS; + + static { + final String propertyName = "action"; + List actions = TKit.tokenizeConfigPropertyAsList(propertyName); + if (actions == null || actions.isEmpty()) { + DEFAULT_ACTIONS = List.of(Action.CREATE_AND_UNPACK); + } else { + try { + DEFAULT_ACTIONS = actions.stream() + .map(String::toUpperCase) + .map(v -> v.replace('-', '_')) + .map(Action::valueOf) + .collect(Collectors.toUnmodifiableList()); + } catch (IllegalArgumentException ex) { + throw new IllegalArgumentException(String.format( + "Unrecognized value of %s property: [%s]", + TKit.getConfigPropertyName(propertyName), + TKit.getConfigProperty(propertyName)), ex); + } + } + } +} diff --git a/test/jdk/tools/jpackage/manage_packages.sh b/test/jdk/tools/jpackage/manage_packages.sh deleted file mode 100644 index b6dce9dea05..00000000000 --- a/test/jdk/tools/jpackage/manage_packages.sh +++ /dev/null @@ -1,231 +0,0 @@ -#!/bin/bash - -# -# Script to install/uninstall packages produced by jpackage jtreg -# tests doing platform specific packaging. -# -# The script will install/uninstall all packages from the files -# found in the current directory or the one specified with command line option. -# -# When jtreg jpackage tests are executed with jpackage.test.output -# Java property set, produced package files (msi, exe, deb, rpm, etc.) will -# be saved in the directory specified with this property. -# -# Usage example: -# # Set directory where to save package files from jtreg jpackage tests -# JTREG_OUTPUT_DIR=/tmp/jpackage_jtreg_packages -# -# # Run tests and fill $JTREG_OUTPUT_DIR directory with package files -# jtreg -Djpackage.test.output=$JTREG_OUTPUT_DIR ... -# -# # Install all packages -# manage_pachages.sh -d $JTREG_OUTPUT_DIR -# -# # Uninstall all packages -# manage_pachages.sh -d $JTREG_OUTPUT_DIR -u -# - -# -# When using with MSI installers, Cygwin shell from which this script is -# executed should be started as administrator. Otherwise silent installation -# won't work. -# - -# Fail fast -set -e; set -o pipefail; - - -help_usage () -{ - echo "Usage: `basename $0` [OPTION]" - echo "Options:" - echo " -h - print this message" - echo " -v - verbose output" - echo " -d - path to directory where to look for package files" - echo " -u - uninstall packages instead of the default install" - echo " -t - dry run, print commands but don't execute them" -} - -error () -{ - echo "$@" > /dev/stderr -} - -fatal () -{ - error "$@" - exit 1 -} - -fatal_with_help_usage () -{ - error "$@" - help_usage - exit 1 -} - -# For macOS -if !(type "tac" &> /dev/null;) then - tac_cmd='tail -r' -else - tac_cmd=tac -fi - -# Directory where to look for package files. -package_dir=$PWD - -# Script debug. -verbose= - -# Operation mode. -mode=install - -dryrun= - -while getopts "vhd:ut" argname; do - case "$argname" in - v) verbose=yes;; - t) dryrun=yes;; - u) mode=uninstall;; - d) package_dir="$OPTARG";; - h) help_usage; exit 0;; - ?) help_usage; exit 1;; - esac -done -shift $(( OPTIND - 1 )) - -[ -d "$package_dir" ] || fatal_with_help_usage "Package directory [$package_dir] is not a directory" - -[ -z "$verbose" ] || set -x - - -function find_packages_of_type () -{ - # sort output alphabetically - find "$package_dir" -maxdepth 1 -type f -name '*.'"$1" | sort -} - -function find_packages () -{ - local package_suffixes=(deb rpm msi exe pkg dmg) - for suffix in "${package_suffixes[@]}"; do - if [ "$mode" == "uninstall" ]; then - packages=$(find_packages_of_type $suffix | $tac_cmd) - else - packages=$(find_packages_of_type $suffix) - fi - if [ -n "$packages" ]; then - package_type=$suffix - break; - fi - done -} - - -# RPM -install_cmd_rpm () -{ - echo sudo rpm --install "$@" -} -uninstall_cmd_rpm () -{ - local package_name=$(rpm -qp --queryformat '%{Name}' "$@") - echo sudo rpm -e "$package_name" -} - -# DEB -install_cmd_deb () -{ - echo sudo dpkg -i "$@" -} -uninstall_cmd_deb () -{ - local package_name=$(dpkg-deb -f "$@" Package) - echo sudo dpkg -r "$package_name" -} - -# MSI -install_cmd_msi () -{ - echo msiexec /qn /norestart /i $(cygpath -w "$@") -} -uninstall_cmd_msi () -{ - echo msiexec /qn /norestart /x $(cygpath -w "$@") -} - -# EXE -install_cmd_exe () -{ - echo "$@" -} -uninstall_cmd_exe () -{ - error No implemented -} - -# PKG -install_cmd_pkg () -{ - echo sudo /usr/sbin/installer -allowUntrusted -pkg "\"$@\"" -target / -} -uninstall_cmd_pkg () -{ - local pname=`basename $@` - local appname="$(cut -d'-' -f1 <<<"$pname")" - if [ "$appname" = "CommonInstallDirTest" ]; then - echo sudo rm -rf "/Applications/jpackage/\"$appname.app\"" - else - echo sudo rm -rf "/Applications/\"$appname.app\"" - fi -} - -# DMG -install_cmd_dmg () -{ - local pname=`basename $@` - local appname="$(cut -d'-' -f1 <<<"$pname")" - local command=() - if [ "$appname" = "CommonLicenseTest" ]; then - command+=("{" yes "|" hdiutil attach "\"$@\"" ">" /dev/null) - else - command+=("{" hdiutil attach "\"$@\"" ">" /dev/null) - fi - - command+=(";" sudo cp -R "\"/Volumes/$appname/$appname.app\"" /Applications ">" /dev/null) - command+=(";" hdiutil detach "\"/Volumes/$appname\"" ">" /dev/null ";}") - - echo "${command[@]}" -} -uninstall_cmd_dmg () -{ - local pname=`basename $@` - local appname="$(cut -d'-' -f1 <<<"$pname")" - echo sudo rm -rf "/Applications/\"$appname.app\"" -} - -# Find packages -packages= -find_packages -if [ -z "$packages" ]; then - echo "No packages found in $package_dir directory" - exit -fi - -# Build list of commands to execute -declare -a commands -IFS=$'\n' -for p in $packages; do - commands[${#commands[@]}]=$(${mode}_cmd_${package_type} "$p") -done - -if [ -z "$dryrun" ]; then - # Run commands - for cmd in "${commands[@]}"; do - echo Running: $cmd - eval $cmd || true; - done -else - # Print commands - for cmd in "${commands[@]}"; do echo $cmd; done -fi diff --git a/test/jdk/tools/jpackage/resources/icon2.icns b/test/jdk/tools/jpackage/resources/icon2.icns new file mode 100644 index 0000000000000000000000000000000000000000..23b8e9288cd4038d15fe0b5218169df1b3ce1ca0 GIT binary patch literal 58934 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 AxBvhE literal 0 HcmV?d00001 diff --git a/test/jdk/tools/jpackage/resources/icon3.ico b/test/jdk/tools/jpackage/resources/icon3.ico new file mode 100644 index 0000000000000000000000000000000000000000..68a1824a2f529c830407f433863b101338c8478d GIT binary patch literal 17542 zcmdU$S&U836UUnoGxlBV`x=DA10fzH z#Mt*GVqeD=BK9W_qW|Y}?$rJFZD+l6?&UY~Ro&IqU3JdA_jFZt9i^(N8md(*<W^8@7_hmph1Il{rdG? z(2g?~U8Zi@)2C0@H*en5Z{NO+gmL4>>5d&cx}Y6(9y-uv>!&|s#ti-X_3Oykzkk05 zaps`IOEWJco7K)4jj-Rsyu54>1J%soH_c^ zrAzwRvuB~GSFfH1QDj+@wZrr?URGA7pFDXIit5#?YY;`2HKXW8X5PGc`oe_^`tjq( zzBqdHX!`e0J4lwbSTm}Ar^H!`_;rZE)7%@UOZrs=fZLiOtxmD54+*PYq>GS8$>qn0s zWnk#gp}Iwj7A|Pp3FxFWt6nTNku#{me;1H*2h2yY{!|L8nfg zv7_xzx?t+qP}f zSFT+7&F6r}Sg!T6{*E0xbVWr)2H@pGH#&Ci+?nAg;@82;mwxo@+OCqo>PC$k zxjsoyT+Ujo$^Dl<;?p;8-uQxNy!buWu3ht$V-2rZH%g3q;=~Dk?%cV+7&s`FCC>BP zBjNL%xPAL}piEG#NGxaiBI0`p?cTk+9y@ky+9wgdQ09ikgY)Ol_l@a@IniPId}f=u z@_G8vg$ozD_t?vCC$7V%^%~=IVXoi0Cf_T5I(6!lu2ZLuZqlU5Z!uNecnQBxo*5GN zkdKkPl<LrH!Gi~N)22;bu>Y9%2-&dp>~Z1*Grl25(xy!t7l#fV zO2-w*WE)cu3&{6_??&g&on0J0d^pXoO1vPxIWYjfe~%tLT%0_4(tXY);gjQ6%kSs- z@#FgR>C@?c5Tot&eP=yM7RYfj-sFn)+RDE6iQl$!L`8U^Tfpe93r`_|S zV&_ZM%0bw95$7h^fbT56N_ly?zI*qs{`BcnBp}Ni=90T-?|lFMeJn6X^8S84Mzdzk z^zh-sJ$(w(m*5#`e$VCm&Yrq{{rdFxU--z{xo2eMc_Q@Kv19HTg!F}a?bYNo&F41x zp8*2~=rLo)q@UUFknziZvOmh+1nt?gr|UPEyrBFc`89L@>(HTt?$@thdQHZ{a&TsD zi~B!#@ZhxlQT7|2_mZn_-@d(@6JoD{7c~zg&-VWP`)hJ}-1j)obbL}XFG4$RE`sNz zJe#w5W)cJQJp*v@Z&{W{-u4OP`AxfJZ@Tq|x}L{LtJ_=LE&TD58}Xu}Jd6K4!tu^HRt zkNizsU&&9NT#cN$3WetO2P>#tQ8#r*FE-o(406bGB+cq|ee<`*L z81tFo5NHDe30*QPUP&UAe{iGBYTioc0%w!L0`a<38- z{Vg=C9?858VmQ;!56bc8V+>pDxYD%Ot4&@x>ICZHW88#We{>Fu_*On zlJB+Ys8OTbnl;W4Xxrma`q|WznfB8r4{g`XMCr3_3R4rd`| z{y$0^n`_jl;evLQIi?Ic{qjk+jbVMxam-v(ly<|04bwg-?I?3hnW$$+VYV~Ac=2L4 z|K(M8=f|s6tClw5C+Ec{pN7sTwndfkIwSMa4UZZZsd*F%&rjaw2jvo@+H1=#UAiRxM~-8!m#lrx>SYJ<9d!*R;CacKyll>8y=)BP`PHeK zdk<#=a&|1#J})rkX>)#%R2^%O{fwDs0k$3VhYT5#5&IGg!}F3AUX(M0FuS6TuUWGu zeHP*6#|#@bOt)^`Is@>$WZ~iGux3>KNyu>yZ~BR5yQHK` zZQF@skWET&lIu_p5SA~^re+{X8-v!e-xsiR*W{3MQOgx%Q`|AL?##CTZ?~Omr6z=$ zHaT+;3NPDwk+}D;s`Aw1iQPhTRijr`TfOFED>b|FzBcWDll@$i)CdXny3QncWh`RU z8u_g$aze`yq#mh~RzRsss-(_)EY6!OPJL1(b>3%j-e_^^lq#w7UW;I0JL>5Rt#H)S7wRZ3qA%1@+>*XfUaX-nR9>(V%2)iUcR9(loxR53*}`T`a*djhrUo=&Qa=rl`>vm literal 0 HcmV?d00001 diff --git a/test/jdk/tools/jpackage/resources/icon3.png b/test/jdk/tools/jpackage/resources/icon3.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8f7231d081021ff3e00bdc1adb7e28c24d9c4a GIT binary patch literal 7291 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 arguments = new ArrayList<>(); - - private static final String PARAM1 = "-Dparam1=Some Param 1"; - private static final String PARAM2 = "-Dparam2=Some Param 2"; - private static final String PARAM3 = "-Dparam3=Some Param 3"; - - private static final List vmArguments = new ArrayList<>(); - private static final List empty = new ArrayList<>(); - - private static void validateResult(List args, List vmArgs) - throws Exception { - File outfile = new File(appOutput); - if (!outfile.exists()) { - throw new AssertionError(appOutput + " was not created"); - } - - String output = Files.readString(outfile.toPath()); - String[] result = output.split("\n"); - - int expected = 2 + args.size() + vmArgs.size(); - - if (result.length != expected) { - throw new AssertionError("Unexpected number of lines: " - + result.length + " expected: " + expected + " - results: " + output); - } - - if (!result[0].trim().endsWith("jpackage test application")) { - throw new AssertionError("Unexpected result[0]: " + result[0]); - } - - if (!result[1].trim().equals("args.length: " + args.size())) { - throw new AssertionError("Unexpected result[1]: " + result[1]); - } - - int index = 2; - for (String arg : args) { - if (!result[index].trim().equals(arg)) { - throw new AssertionError("Unexpected result[" - + index + "]: " + result[index]); - } - index++; - } - - for (String vmArg : vmArgs) { - if (!result[index].trim().equals(vmArg)) { - throw new AssertionError("Unexpected result[" - + index + "]: " + result[index]); - } - index++; - } - } - - private static void validate(boolean includeArgs, String name) - throws Exception { - int retVal = JPackageHelper.execute(null, app); - if (retVal != 0) { - throw new AssertionError("Test application " + app - + " exited with error: " + retVal); - } - validateResult(new ArrayList<>(), new ArrayList<>()); - - String app2 = JPackagePath.getAppSL(name); - retVal = JPackageHelper.execute(null, app2); - if (retVal != 0) { - throw new AssertionError("Test application " + app2 - + " exited with error: " + retVal); - } - if (includeArgs) { - validateResult(arguments, vmArguments); - } else { - validateResult(empty, empty); - } - } - - public static void testCreateAppImage(String [] cmd) throws Exception { - testCreateAppImage(cmd, true, "test2"); - } - - public static void testCreateAppImage(String [] cmd, - boolean includeArgs, String name) throws Exception { - JPackageHelper.executeCLI(true, cmd); - validate(includeArgs, name); - } - - public static void testCreateAppImageToolProvider(String [] cmd) - throws Exception { - testCreateAppImageToolProvider(cmd, true, "test2"); - } - - public static void testCreateAppImageToolProvider(String [] cmd, - boolean includeArgs, String name) throws Exception { - JPackageHelper.executeToolProvider(true, cmd); - validate(includeArgs, name); - } - - public static void testCreateAppImage(String [] cmd, - ArrayList argList, ArrayList optionList) - throws Exception { - JPackageHelper.executeCLI(true, cmd); - int retVal = JPackageHelper.execute(null, app); - if (retVal != 0) { - throw new AssertionError("Test application " + app - + " exited with error: " + retVal); - } - validateResult(argList, optionList); - String name = "test4"; - - String app2 = JPackagePath.getAppSL(name); - retVal = JPackageHelper.execute(null, app2); - if (retVal != 0) { - throw new AssertionError("Test application " + app2 - + " exited with error: " + retVal); - } - validateResult(arguments, vmArguments); - } - - public static void createSLProperties() throws Exception { - arguments.add(ARGUMENT1); - arguments.add(ARGUMENT2); - arguments.add(ARGUMENT3); - - String argumentsMap = - JPackageHelper.listToArgumentsMap(arguments, true); - - vmArguments.add(PARAM1); - vmArguments.add(PARAM2); - vmArguments.add(PARAM3); - - String vmArgumentsMap = - JPackageHelper.listToArgumentsMap(vmArguments, true); - - try (PrintWriter out = new PrintWriter(new BufferedWriter( - new FileWriter("sl.properties")))) { - out.println("arguments=" + argumentsMap); - out.println("java-options=" + vmArgumentsMap); - } - - try (PrintWriter out = new PrintWriter(new BufferedWriter( - new FileWriter("m1.properties")))) { - out.println("module=com.hello/com.hello.Hello"); - out.println("main-jar="); - } - - try (PrintWriter out = new PrintWriter(new BufferedWriter( - new FileWriter("j1.properties")))) { - out.println("main-jar hello.jar"); - out.println("main-class Hello"); - } - - - } - -} diff --git a/test/jdk/tools/jpackage/share/AddLauncherTest.java b/test/jdk/tools/jpackage/share/AddLauncherTest.java deleted file mode 100644 index 6c901478cf6..00000000000 --- a/test/jdk/tools/jpackage/share/AddLauncherTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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.util.ArrayList; - -/* - * @test - * @summary jpackage create image with additional launcher test - * @library ../helpers - * @build JPackageHelper - * @build JPackagePath - * @build AddLauncherBase - * @modules jdk.incubator.jpackage - * @run main/othervm -Xmx512m AddLauncherTest - */ -public class AddLauncherTest { - private static final String OUTPUT = "output"; - private static final String [] CMD = { - "--type", "app-image", - "--input", "input", - "--dest", OUTPUT, - "--name", "test", - "--main-jar", "hello.jar", - "--main-class", "Hello", - "--add-launcher", "test2=sl.properties"}; - - private final static String OPT1 = "-Dparam1=xxx"; - private final static String OPT2 = "-Dparam2=yyy"; - private final static String OPT3 = "-Dparam3=zzz"; - private final static String ARG1 = "original-argument"; - - private static final String [] CMD1 = { - "--type", "app-image", - "--input", "input", - "--dest", OUTPUT, - "--name", "test", - "--main-jar", "hello.jar", - "--main-class", "Hello", - "--java-options", OPT1, - "--java-options", OPT2, - "--java-options", OPT3, - "--arguments", ARG1, - "--add-launcher", "test4=sl.properties"}; - - - public static void main(String[] args) throws Exception { - JPackageHelper.createHelloImageJar(); - AddLauncherBase.createSLProperties(); - AddLauncherBase.testCreateAppImage(CMD); - - ArrayList argList = new ArrayList (); - argList.add(ARG1); - - ArrayList optList = new ArrayList (); - optList.add(OPT1); - optList.add(OPT2); - optList.add(OPT3); - - JPackageHelper.deleteOutputFolder(OUTPUT); - AddLauncherBase.testCreateAppImage(CMD1, argList, optList); - } - -} diff --git a/test/jdk/tools/jpackage/share/AddLaunchersTest.java b/test/jdk/tools/jpackage/share/AddLaunchersTest.java deleted file mode 100644 index 4f9a79f06ea..00000000000 --- a/test/jdk/tools/jpackage/share/AddLaunchersTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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. - */ - - /* - * @test - * @summary jpackage create image with additional launcher test - * @library ../helpers - * @build JPackageHelper - * @build JPackagePath - * @build AddLauncherBase - * @modules jdk.incubator.jpackage - * @run main/othervm -Xmx512m AddLaunchersTest - */ -public class AddLaunchersTest { - private static final String OUTPUT = "output"; - private static final String [] CMD1 = { - "--description", "Test non modular app with multiple add-launchers where one is modular app and other is non modular app", - "--type", "app-image", - "--input", "input", - "--dest", OUTPUT, - "--name", "test", - "--main-jar", "hello.jar", - "--main-class", "Hello", - "--module-path", "module", - "--add-modules", "com.hello,java.desktop", - "--add-launcher", "test3=j1.properties", - "--add-launcher", "test4=m1.properties"}; - - private static final String [] CMD2 = { - "--description", "Test modular app with multiple add-launchers where one is modular app and other is non modular app", - "--type", "app-image", - "--input", "input", - "--dest", OUTPUT, - "--name", "test", - "--module", "com.hello/com.hello.Hello", - "--module-path", "module", - "--add-launcher", "test5=jl.properties", - "--add-launcher", "test6=m1.properties"}; - - public static void main(String[] args) throws Exception { - JPackageHelper.createHelloImageJar(); - JPackageHelper.createHelloModule(); - AddLauncherBase.createSLProperties(); - - JPackageHelper.deleteOutputFolder(OUTPUT); - AddLauncherBase.testCreateAppImageToolProvider( - CMD1, false, "test3"); - - JPackageHelper.deleteOutputFolder(OUTPUT); - AddLauncherBase.testCreateAppImage( - CMD1, false, "test4"); - - JPackageHelper.deleteOutputFolder(OUTPUT); - AddLauncherBase.testCreateAppImage( - CMD2, false, "test5"); - - JPackageHelper.deleteOutputFolder(OUTPUT); - AddLauncherBase.testCreateAppImageToolProvider( - CMD2, false, "test6"); - - } - -}