diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java index bd82b34d897..b43acffbafb 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java @@ -215,7 +215,7 @@ final class JLinkRuntimeBuilder implements RuntimeBuilder { } private static String getStringList(Set strings) { - return strings.stream().collect(Collectors.joining(",")); + return strings.stream().sorted().collect(Collectors.joining(",")); } private final List jlinkCmdLine; diff --git a/src/jdk.jpackage/unix/classes/jdk/jpackage/internal/PackageScripts.java b/src/jdk.jpackage/unix/classes/jdk/jpackage/internal/PackageScripts.java index cd8799416f7..cef5fe05f35 100644 --- a/src/jdk.jpackage/unix/classes/jdk/jpackage/internal/PackageScripts.java +++ b/src/jdk.jpackage/unix/classes/jdk/jpackage/internal/PackageScripts.java @@ -24,15 +24,16 @@ */ package jdk.jpackage.internal; +import static java.util.stream.Collectors.toMap; + import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Path; import java.util.EnumSet; import java.util.Map; import java.util.Optional; +import java.util.TreeMap; import java.util.function.Supplier; -import java.util.function.UnaryOperator; -import java.util.stream.Collectors; import jdk.jpackage.internal.resources.ResourceLocator; /** @@ -46,11 +47,11 @@ final class PackageScripts & Supplier> { } PackageScripts(Class scriptIdsType) { - scripts = EnumSet.allOf(scriptIdsType).stream().collect( - Collectors.toMap(UnaryOperator.identity(), scriptId -> { - return new ShellScriptResource(scriptId.name()).setResource( - scriptId.get()); - })); + scripts = EnumSet.allOf(scriptIdsType).stream().collect(toMap(x -> x, scriptId -> { + return new ShellScriptResource(scriptId.name()).setResource(scriptId.get()); + }, (a, b) -> { + throw new UnsupportedOperationException(); + }, TreeMap::new)); } PackageScripts setSubstitutionData(T id, Map data) { diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java index b07c525db26..8f98df060ac 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java @@ -38,6 +38,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.function.Supplier; import java.util.stream.Collectors; import javax.xml.XMLConstants; @@ -193,7 +194,7 @@ final class WixSourceConverter { } } - private final Map resources = new HashMap<>(); + private final Map resources = new TreeMap<>(); private final WixToolsetType wixToolsetType; } diff --git a/test/jdk/tools/jpackage/apps/PrintEnv.java b/test/jdk/tools/jpackage/apps/PrintEnv.java index 64a243a0abc..4aed3c41422 100644 --- a/test/jdk/tools/jpackage/apps/PrintEnv.java +++ b/test/jdk/tools/jpackage/apps/PrintEnv.java @@ -69,6 +69,7 @@ public class PrintEnv { lines.add(ModuleFinder.ofSystem().findAll().stream() .map(ModuleReference::descriptor) .map(ModuleDescriptor::name) + .sorted() .collect(Collectors.joining(","))); } else if (arg.equals(PRINT_WORK_DIR)) { lines.add("$CD=" + Path.of("").toAbsolutePath()); diff --git a/test/jdk/tools/jpackage/clean_stashed_files.sh b/test/jdk/tools/jpackage/clean_stashed_files.sh index 28ad42048ac..db393877b19 100644 --- a/test/jdk/tools/jpackage/clean_stashed_files.sh +++ b/test/jdk/tools/jpackage/clean_stashed_files.sh @@ -120,8 +120,7 @@ macDmgFilterScpt() { # - Trim random absolute temp path # - Replace "/dmg-workdir/" (new) with "/images/" (old) find "$stash_dir" -name '*.scpt' -type f | xargs -I {} sed $sed_inplace_option \ - -e 's|"/.*/jdk.jpackage[0-9]\{1,\}/|"/jdk.jpackage/|' \ - -e 's|"file:///.*/jdk.jpackage[0-9]\{1,\}/|"file:///jdk.jpackage/|' \ + -e 's|/jdk.jpackage[0-9]\{1,\}/|/jdk.jpackage/|' \ -e 's|/dmg-workdir/|/images/|' \ '{}' } diff --git a/test/jdk/tools/jpackage/clean_test_output.sh b/test/jdk/tools/jpackage/clean_test_output.sh index e472d780ded..200d6add299 100644 --- a/test/jdk/tools/jpackage/clean_test_output.sh +++ b/test/jdk/tools/jpackage/clean_test_output.sh @@ -56,6 +56,9 @@ filterFile () { # Strip variable part of temporary directory name `jdk.jpackage5060841750457404688` -e 's|\([\/]\)jdk\.jpackage[0-9]\{1,\}\b|\1jdk.jpackage|g' + # Strip variable part of temporary directory name `jdk.jpackage.test217379316521032539` + -e 's|\([\/]\)jdk\.jpackage\.test[0-9]\{1,\}\b|\1jdk.jpackage.test|g' + # Convert PID value `[PID: 131561]` -e 's/\[PID: [0-9]\{1,\}\]/[PID: ]/' @@ -76,6 +79,41 @@ filterFile () { # Convert variable part of stack trace entry `at jdk.jpackage.test.JPackageCommand.execute(JPackageCommand.java:863)` -e 's/^\(.*\b\.java:\)[0-9]\{1,\}\()\r\{0,1\}\)$/\1N\2/' + + # Whipe out entire output of /usr/bin/hdiutil command. + # It is of little to no interest and contains too many variable parts to deal with individually. + -e '/^Running \/usr\/bin\/hdiutil/,/^Returned:/{ + //,/^Output:/!d + }' + + # Zip stack traces. + -e $'/^\tat /{ + :a + g + N + s/.*\\n// + /^\tat /ba + s/\\(^\t... \\)[0-9]\\{1,\\}\\( more\\)/\\1N\\2/ + s/\(.*\)/\tat \\n\\1/ + P + D + }' + + # Convert PID value in `taskkill /F /PID 5640` + -e 's|taskkill /F /PID [0-9]\{1,\}|taskkill /F /PID |' + + # Convert PID value in `The process with PID 5640 has been terminated` + -e 's|\(The process with PID \)[0-9]\{1,\}\( has been terminated\)|\1\2|' + + # Convert timeout value in `Check timeout value 57182ms is positive` + -e 's|\(Check timeout value \)[0-9]\{1,\}\(ms is positive\)|\1\2|' + + # Convert variable part of /usr/bin/osascript output `jdk.jpackage/config/SigningRuntimeImagePackageTest-dmg-setup.scpt:455:497: execution error: Finder got an error: Can’t set 1 to icon view. (-10006)` + -e 's|\(-dmg-setup.scpt:\)[0-9]\{1,\}:[0-9]\{1,\}\(: execution error: \)|\1\2|' + + # Use the same name for all exceptions. + -e 's|[^ ]\{1,\}\.[^ ]\{1,\}\Exception:|:|g' + -e 's|[^ ]\{1,\}\.[^ ]\{1,\}\ExceptionBox:|:|g' ) sed $sed_inplace_option "$1" "${expressions[@]}" diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java index ebdbb474006..576e294874a 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java @@ -27,12 +27,11 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.stream.Stream; +import java.util.TreeMap; import jdk.jpackage.internal.util.PathUtils; @@ -44,7 +43,7 @@ public final class FileAssociations { } private void createFile() { - Map entries = new HashMap<>(Map.of( + Map entries = new TreeMap<>(Map.of( "extension", suffixName, "mime-type", getMime() )); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index caec0e315c4..3a27ae32f43 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -22,6 +22,8 @@ */ package jdk.jpackage.test; +import static java.util.Collections.unmodifiableSortedSet; + import java.io.IOException; import java.io.UncheckedIOException; import java.lang.reflect.InvocationTargetException; @@ -32,12 +34,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Matcher; @@ -389,8 +392,7 @@ public final class LinuxHelper { Map> scriptlets = getScriptlets(cmd); if (integrated) { - Set requiredScriptlets = Stream.of(Scriptlet.values()).sorted().collect( - Collectors.toSet()); + var requiredScriptlets = Stream.of(Scriptlet.values()).sorted().toList(); TKit.assertTrue(scriptlets.keySet().containsAll( requiredScriptlets), String.format( "Check all required scriptlets %s found in the package. Package scriptlets: %s", @@ -488,13 +490,13 @@ public final class LinuxHelper { var data = new DesktopFile(desktopFile, true); - final Set mandatoryKeys = new HashSet<>(Set.of("Name", "Comment", + final Set mandatoryKeys = new TreeSet<>(Set.of("Name", "Comment", "Exec", "Icon", "Terminal", "Type", "Categories")); mandatoryKeys.removeAll(data.keySet()); TKit.assertTrue(mandatoryKeys.isEmpty(), String.format( "Check for missing %s keys in the file", mandatoryKeys)); - for (var e : Map.of("Type", "Application", "Terminal", "false").entrySet()) { + for (var e : List.of(Map.entry("Type", "Application"), Map.entry("Terminal", "false"))) { String key = e.getKey(); TKit.assertEquals(e.getValue(), data.find(key).orElseThrow(), String.format( "Check value of [%s] key", key)); @@ -710,7 +712,7 @@ public final class LinuxHelper { private static Map> getDebScriptlets( JPackageCommand cmd, Set scriptlets) { - Map> result = new HashMap<>(); + Map> result = new TreeMap<>(); TKit.withTempDirectory("dpkg-control-files", tempDir -> { // Extract control Debian package files into temporary directory Executor.of("dpkg", "-e") @@ -732,7 +734,7 @@ public final class LinuxHelper { List output = Executor.of("rpm", "-qp", "--scripts", cmd.outputBundle().toString()).executeAndGetOutput(); - Map> result = new HashMap<>(); + Map> result = new TreeMap<>(); List curScriptletBody = null; for (String str : output) { Matcher m = Scriptlet.RPM_HEADER_PATTERN.matcher(str); @@ -887,7 +889,8 @@ public final class LinuxHelper { private static final Pattern XDG_CMD_ICON_SIZE_PATTERN = Pattern.compile("\\s--size\\s+(\\d+)\\b"); // Values grabbed from https://linux.die.net/man/1/xdg-icon-resource - private static final Set XDG_CMD_VALID_ICON_SIZES = Set.of(16, 22, 32, 48, 64, 128); + private static final Set XDG_CMD_VALID_ICON_SIZES = unmodifiableSortedSet( + new TreeSet<>(List.of(16, 22, 32, 48, 64, 128))); private static final Method getServiceUnitFileName = initGetServiceUnitFileName(); } diff --git a/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java b/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java index f8e606d77e8..d91f4e3504b 100644 --- a/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java +++ b/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java @@ -21,6 +21,7 @@ * questions. */ +import static java.util.Collections.unmodifiableSortedSet; import static java.util.Map.entry; import static jdk.jpackage.internal.util.PListWriter.writeDict; import static jdk.jpackage.internal.util.PListWriter.writePList; @@ -40,6 +41,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.TreeSet; import java.util.function.BiConsumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -142,12 +144,12 @@ public class CustomInfoPListTest { if (customPLists.isEmpty()) { throw new IllegalArgumentException(); } + customPLists = unmodifiableSortedSet(new TreeSet<>(customPLists)); } @Override public String toString() { return customPLists.stream() - .sorted(Comparator.comparing(CustomPListType::role)) .map(CustomPListType::toString) .collect(Collectors.joining("+")); } @@ -155,12 +157,12 @@ public class CustomInfoPListTest { JPackageCommand init(JPackageCommand cmd) throws IOException { if (customPLists.contains(CustomPListType.APP_WITH_FA)) { final Path propFile = TKit.createTempFile("fa.properties"); - var map = Map.ofEntries( + final var props = List.of( entry("mime-type", "application/x-jpackage-foo"), entry("extension", "foo"), entry("description", "bar") ); - TKit.createPropertiesFile(propFile, map); + TKit.createPropertiesFile(propFile, props); cmd.setArgumentValue("--file-associations", propFile); } diff --git a/test/jdk/tools/jpackage/macosx/MacFileAssociationsTest.java b/test/jdk/tools/jpackage/macosx/MacFileAssociationsTest.java index 3277b56ab46..ab7a23ec89a 100644 --- a/test/jdk/tools/jpackage/macosx/MacFileAssociationsTest.java +++ b/test/jdk/tools/jpackage/macosx/MacFileAssociationsTest.java @@ -32,6 +32,7 @@ import static jdk.jpackage.test.MacHelper.writeFaPListFragment; import java.nio.file.Path; import java.util.Comparator; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; @@ -61,7 +62,7 @@ public class MacFileAssociationsTest { @Test public static void test() throws Exception { final Path propFile = TKit.createTempFile("fa.properties"); - Map map = Map.ofEntries( + final var props = List.of( entry("mime-type", "application/x-jpackage-foo"), entry("extension", "foo"), entry("description", "bar"), @@ -73,7 +74,7 @@ public class MacFileAssociationsTest { entry("mac.UISupportsDocumentBrowser", "false"), entry("mac.NSExportableTypes", "public.png, public.jpg"), entry("mac.UTTypeConformsTo", "public.image, public.data")); - TKit.createPropertiesFile(propFile, map); + TKit.createPropertiesFile(propFile, props); final var cmd = JPackageCommand.helloAppImage().setFakeRuntime(); cmd.addArguments("--file-associations", propFile); diff --git a/test/jdk/tools/jpackage/share/FileAssociationsTest.java b/test/jdk/tools/jpackage/share/FileAssociationsTest.java index 2257c5dbc65..cd4a0491532 100644 --- a/test/jdk/tools/jpackage/share/FileAssociationsTest.java +++ b/test/jdk/tools/jpackage/share/FileAssociationsTest.java @@ -21,10 +21,13 @@ * questions. */ +import static java.util.Map.entry; import static jdk.jpackage.test.JPackageStringBundle.MAIN; import java.nio.file.Path; +import java.util.List; import java.util.Map; +import java.util.TreeMap; import jdk.jpackage.test.Annotations.Parameter; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.FileAssociations; @@ -114,9 +117,9 @@ public class FileAssociationsTest { final Path propFile = TKit.workDir().resolve("fa.properties"); initPackageTest().addRunOnceInitializer(() -> { - TKit.createPropertiesFile(propFile, Map.of( - "extension", "foo", - "description", "bar" + TKit.createPropertiesFile(propFile, List.of( + entry("extension", "foo"), + entry("description", "bar") )); }).addInitializer(cmd -> { cmd.addArguments("--file-associations", propFile); @@ -131,10 +134,10 @@ public class FileAssociationsTest { final Path propFile = TKit.workDir().resolve("fa.properties"); initPackageTest().addRunOnceInitializer(() -> { - TKit.createPropertiesFile(propFile, Map.of( - "mime-type", "application/x-jpackage-foo, application/x-jpackage-bar", - "extension", "foo", - "description", "bar" + TKit.createPropertiesFile(propFile, List.of( + entry("mime-type", "application/x-jpackage-foo, application/x-jpackage-bar"), + entry("extension", "foo"), + entry("description", "bar") )); }).addInitializer(cmd -> { cmd.addArguments("--file-associations", propFile); diff --git a/test/jdk/tools/jpackage/share/IconTest.java b/test/jdk/tools/jpackage/share/IconTest.java index a2a9e67bd91..051cad84a13 100644 --- a/test/jdk/tools/jpackage/share/IconTest.java +++ b/test/jdk/tools/jpackage/share/IconTest.java @@ -22,9 +22,6 @@ */ import java.io.IOException; -import java.util.stream.Stream; -import java.util.stream.Collectors; -import java.util.function.Consumer; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -34,17 +31,21 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import jdk.jpackage.test.TKit; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.LauncherIconVerifier; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.Executor; -import jdk.jpackage.test.LinuxHelper; -import jdk.jpackage.test.AdditionalLauncher; -import jdk.jpackage.internal.util.function.ThrowingConsumer; +import java.util.TreeMap; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; import jdk.jpackage.internal.util.function.ThrowingBiConsumer; +import jdk.jpackage.internal.util.function.ThrowingConsumer; +import jdk.jpackage.test.AdditionalLauncher; import jdk.jpackage.test.Annotations.Parameters; import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.Executor; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.LauncherIconVerifier; +import jdk.jpackage.test.LinuxHelper; +import jdk.jpackage.test.PackageTest; +import jdk.jpackage.test.TKit; /* * @test @@ -92,18 +93,18 @@ public class IconTest { IconType additionalLauncherIconType, String[] extraJPackageArgs) { this.appImage = (bundleType == BundleType.AppImage); this.extraJPackageArgs = extraJPackageArgs; - config = Map.of( + config = new TreeMap<>(Map.of( Launcher.Main, mainLauncherIconType, - Launcher.Additional, additionalLauncherIconType); + Launcher.Additional, additionalLauncherIconType)); } public IconTest(BundleType bundleType, IconType mainLauncherIconType, IconType additionalLauncherIconType) { this.appImage = (bundleType == BundleType.AppImage); this.extraJPackageArgs = new String[0]; - config = Map.of( + config = new TreeMap<>(Map.of( Launcher.Main, mainLauncherIconType, - Launcher.Additional, additionalLauncherIconType); + Launcher.Additional, additionalLauncherIconType)); } public IconTest(BundleType bundleType, IconType mainLauncherIconType) {