From aaafb4c31e16a4fd97ea7c802141372bff3cc0fa Mon Sep 17 00:00:00 2001 From: alexander_matveev Date: Wed, 4 Feb 2026 17:08:22 -0800 Subject: [PATCH] 8357404: jpackage should attempt to get a package version from the JDK's release file if the --version option is not specified [v7] --- .../jdk/jpackage/internal/MacFromOptions.java | 16 ++-- .../jdk/jpackage/internal/FromOptions.java | 21 +++-- .../jdk/jpackage/internal/ModuleInfo.java | 4 +- .../internal/model/DottedVersion.java | 38 +++++++-- .../internal/util/RuntimeImageUtils.java | 29 ++++--- .../internal/util/RuntimeVersionReader.java | 24 ++++-- .../jdk/jpackage/internal/WinFromOptions.java | 17 ++-- .../jdk/jpackage/test/JPackageCommand.java | 25 +++--- .../helpers/jdk/jpackage/test/MacHelper.java | 13 ++- .../jdk/jpackage/test/WindowsHelper.java | 14 ++-- .../internal/model/DottedVersionTest.java | 45 ++++++++--- .../util/RuntimeVersionReaderTest.java | 79 +++++++++++-------- .../tools/jpackage/share/ModulePathTest3.java | 10 ++- .../jpackage/share/RuntimePackageTest.java | 69 ++++++++++------ 14 files changed, 247 insertions(+), 157 deletions(-) diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromOptions.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromOptions.java index 8ee53dc9dc0..6c9069e76eb 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromOptions.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromOptions.java @@ -228,7 +228,7 @@ final class MacFromOptions { var app = superAppBuilder.create(); - if (isRuntimeInstaller(options) && !APP_VERSION.containsIn(options)) { + if (!APP_VERSION.containsIn(options)) { // User didn't explicitly specify the version on the command line. jpackage derived it from the input. // In this case it should ensure the derived value is valid MacOS version. UnaryOperator versionNormalizer = version -> { @@ -356,13 +356,13 @@ final class MacFromOptions { static String normalizeVersion(String version) { // macOS requires 1, 2 or 3 components version string. // When reading from release file it can be 1 or 3 or maybe more. - // We always normalize to 3 components. - DottedVersion ver = DottedVersion.greedy(version); - BigInteger[] components = ver.getComponents(); - if (components.length >= 4) { - return ver.toComponentsStringWithPadding(3); + // We will always normalize to 3 components if needed. + DottedVersion ver = DottedVersion.lazy(version); + if (ver.getComponentsCount() > 3) { + return ver.trim(3).pad(3).toComponentsString(); + } else { + // We should drop any characters. For example: "-ea". + return ver.toComponentsString(); } - - return version; } } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromOptions.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromOptions.java index b33735f6412..4a4a54974ec 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromOptions.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromOptions.java @@ -188,18 +188,15 @@ final class FromOptions { appBuilder.appImageLayout(runtimeLayout); if (!APP_VERSION.containsIn(options)) { // Version is not specified explicitly. Try to get it from the release file. - final Path releaseFile = RuntimeImageUtils.getReleaseFilePath( - PREDEFINED_RUNTIME_IMAGE.getFrom(options)); - try { - RuntimeVersionReader.readVersion(releaseFile) - .ifPresent(version -> { - appBuilder.version(version); - Log.verbose(I18N.format("message.release-version", - version, PREDEFINED_RUNTIME_IMAGE.getFrom(options))); - }); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } + final var runtimeHome = RuntimeImageUtils.getRuntimeHomeForRuntimeRoot( + predefinedRuntimeImage.orElseThrow()); + final var releaseFile = RuntimeImageUtils.getReleaseFilePath(runtimeHome); + RuntimeVersionReader.readVersion(releaseFile) + .ifPresent(version -> { + appBuilder.version(version.toString()); + Log.verbose(I18N.format("message.release-version", + version.toString(), predefinedRuntimeImage.orElseThrow())); + }); } } else { appBuilder.appImageLayout(appLayout); diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ModuleInfo.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ModuleInfo.java index 65d6d4e22c2..02817a6157e 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ModuleInfo.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ModuleInfo.java @@ -61,7 +61,9 @@ record ModuleInfo(String name, Optional version, Optional mainCl // is linked in the runtime by simply analysing the data // of `release` file. - final Path releaseFile = RuntimeImageUtils.getReleaseFilePath(cookedRuntime); + final var runtimeHome = RuntimeImageUtils.getRuntimeHomeForRuntimeRoot( + cookedRuntime); + final var releaseFile = RuntimeImageUtils.getReleaseFilePath(runtimeHome); try (Reader reader = Files.newBufferedReader(releaseFile)) { Properties props = new Properties(); props.load(reader); diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DottedVersion.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DottedVersion.java index 3f869c7e4e6..ea010a91482 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DottedVersion.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DottedVersion.java @@ -224,21 +224,43 @@ public final class DottedVersion { return Stream.of(components).map(BigInteger::toString).collect(Collectors.joining(".")); } - public String toComponentsStringWithPadding(int numberOfComponents) { - if (components.length >= numberOfComponents) { - return Stream.of(components).map(BigInteger::toString) - .limit(numberOfComponents).collect(Collectors.joining(".")); - } else { - return toComponentsString() - .concat(".0".repeat(numberOfComponents - components.length)); + public DottedVersion trim(int componentLimit) { + if (componentLimit < 0) { + throw new IllegalArgumentException(); } + + if (components.length > componentLimit) { + components = Arrays.stream(components).limit(componentLimit) + .toArray(BigInteger[]::new); + } + + return this; + } + + public DottedVersion pad(int componentLimit) { + if (componentLimit <= 0) { + throw new IllegalArgumentException(); + } + + if (components.length < componentLimit) { + final int origLength = components.length; + components = Arrays.copyOf(components, componentLimit); + Arrays.fill(components, origLength, components.length, + new BigInteger("0")); + } + + return this; + } + + public int getComponentsCount() { + return components.length; } public BigInteger[] getComponents() { return components; } - private final BigInteger[] components; + private BigInteger[] components; private final String value; private final String suffix; } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/RuntimeImageUtils.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/RuntimeImageUtils.java index 00aa1187b80..ebba61a030b 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/RuntimeImageUtils.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/RuntimeImageUtils.java @@ -31,19 +31,22 @@ import jdk.internal.util.OperatingSystem; public final class RuntimeImageUtils { - public static Path getReleaseFilePath(Path runtimePath) { - final Path releaseFile; - if (!OperatingSystem.isMacOS()) { - releaseFile = runtimePath.resolve("release"); - } else { - // On Mac `runtimePath` can be runtime root or runtime home. - Path runtimeHome = runtimePath.resolve("Contents/Home"); - if (!Files.isDirectory(runtimeHome)) { - runtimeHome = runtimePath; - } - releaseFile = runtimeHome.resolve("release"); - } + public static Path getReleaseFilePath(Path runtimeHomePath) { + return runtimeHomePath.resolve("release"); + } - return releaseFile; + /** + * Returns platform specific runtime "Home" location for given runtime root. + *

+ * On Windows and Linux it will return value of runtimeRoot. On macOS for + * runtime image it will return runtimeRoot and for runtime bundle it will + * return path to "Home" folder. + * + * @param runtimeRoot the runtime root path + * @return platform specific runtime "Home" location for given runtime root + */ + public static Path getRuntimeHomeForRuntimeRoot(Path runtimeRoot) { + return MacBundle.fromPath(runtimeRoot).map(MacBundle::homeDir) + .orElse(runtimeRoot); } } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/RuntimeVersionReader.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/RuntimeVersionReader.java index 310fd9f4685..0af7feee455 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/RuntimeVersionReader.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/RuntimeVersionReader.java @@ -34,19 +34,31 @@ import java.util.Properties; public final class RuntimeVersionReader { - public static Optional readVersion(Path releaseFilePath) throws IOException { - if (!Files.isRegularFile(releaseFilePath)) { - return Optional.empty(); - } - + // jdk.tools.jlink.internal.plugins.ReleaseInfoPlugin uses java.util.Properties + // to read/write "release" file and puts quotes around version string. + // Implementation of this function is based on behavior of ReleaseInfoPlugin. + public static Optional readVersion(Path releaseFilePath) { try (Reader reader = Files.newBufferedReader(releaseFilePath)) { Properties props = new Properties(); props.load(reader); String version = props.getProperty("JAVA_VERSION"); if (version != null) { + // "JAVA_VERSION" value is set to quoted string in "release" + // file. getProperty() will include leading and trailing quote + // when returning value. We should remove them, since they are + // not part of version. version = version.replaceAll("^\"|\"$", ""); } - return Optional.ofNullable(version); + return Optional.of(Runtime.Version.parse(version)); + } catch (IllegalArgumentException | NullPointerException ex) { + // In case of Runtime.Version.parse() fails return empty optional. + // It will fail for "" or "foo" strings. ReleaseInfoPlugin class + // uses Runtime.Version class to create version for "release" file, so + // if Runtime.Version.parse() fails something is wrong and we should + // just ignore such version from "release" file. + return Optional.empty(); + } catch (IOException ex) { + return Optional.empty(); } } } diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinFromOptions.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinFromOptions.java index ed4dead02e8..8399c7d4dd7 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinFromOptions.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinFromOptions.java @@ -83,7 +83,7 @@ final class WinFromOptions { var app = appBuilder.create(); - if (isRuntimeInstaller(options) && !APP_VERSION.containsIn(options)) { + if (!APP_VERSION.containsIn(options)) { // User didn't explicitly specify the version on the command line. jpackage derived it from the input. // In this case it should ensure the derived value is valid Windows version. UnaryOperator versionNormalizer = version -> { @@ -135,14 +135,13 @@ final class WinFromOptions { static String normalizeVersion(String version) { // Windows requires 2 or 4 components version string. // When reading from release file it can be 1 or 3 or maybe more. - // We always normalize to 4 components. - DottedVersion ver = DottedVersion.greedy(version); - BigInteger[] components = ver.getComponents(); - if (components.length == 1 || components.length == 3 || - components.length >= 5) { - return ver.toComponentsStringWithPadding(4); + // We will always normalize to 4 components if needed. + DottedVersion ver = DottedVersion.lazy(version); + if (ver.getComponentsCount() != 2 || ver.getComponentsCount() != 4) { + return ver.trim(4).pad(4).toComponentsString(); + } else { + // We should drop any characters. For example: "-ea". + return ver.toComponentsString(); } - - return version; } } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index ab0af27fa4c..6f6fe603cad 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -251,21 +251,18 @@ public class JPackageCommand extends CommandArguments { public String version() { return Optional.ofNullable(getArgumentValue("--app-version")).or(() -> { if (isRuntime()) { - final Path releaseFile = RuntimeImageUtils.getReleaseFilePath( + final var runtimeHome = RuntimeImageUtils.getRuntimeHomeForRuntimeRoot( Path.of(getArgumentValue("--runtime-image"))); - try { - return RuntimeVersionReader.readVersion(releaseFile).map(releaseVersion -> { - if (TKit.isWindows()) { - return WindowsHelper.getNormalizedVersion(releaseVersion); - } else if (TKit.isOSX()) { - return MacHelper.getNormalizedVersion(releaseVersion); - } else { - return releaseVersion; - } - }); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } + final var releaseFile = RuntimeImageUtils.getReleaseFilePath(runtimeHome); + return RuntimeVersionReader.readVersion(releaseFile).map(releaseVersion -> { + if (TKit.isWindows()) { + return WindowsHelper.getNormalizedVersion(releaseVersion.toString()); + } else if (TKit.isOSX()) { + return MacHelper.getNormalizedVersion(releaseVersion.toString()); + } else { + return releaseVersion.toString(); + } + }); } else { return Optional.empty(); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java index 627de4882c4..d2898af59be 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java @@ -1112,14 +1112,13 @@ public final class MacHelper { static String getNormalizedVersion(String version) { // macOS requires 1, 2 or 3 components version string. - // We always normalize to 3 components. - DottedVersion ver = DottedVersion.greedy(version); - BigInteger[] components = ver.getComponents(); - if (components.length >= 4) { - return ver.toComponentsStringWithPadding(3); + // We will always normalize to 3 components if needed. + DottedVersion ver = DottedVersion.lazy(version); + if (ver.getComponentsCount() > 3) { + return ver.trim(3).pad(3).toComponentsString(); + } else { + return ver.toComponentsString(); } - - return version; } static Path getInstallationDirectory(JPackageCommand cmd) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java index b8231a67c63..a1b85614eca 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java @@ -59,15 +59,13 @@ public class WindowsHelper { static String getNormalizedVersion(String version) { // Windows requires 2 or 4 components version string. - // We always normalize to 4 components. - DottedVersion ver = DottedVersion.greedy(version); - BigInteger[] components = ver.getComponents(); - if (components.length == 1 || components.length == 3 || - components.length >= 5) { - return ver.toComponentsStringWithPadding(4); + // We will always normalize to 4 components if needed. + DottedVersion ver = DottedVersion.lazy(version); + if (ver.getComponentsCount() != 2 || ver.getComponentsCount() != 4) { + return ver.trim(4).pad(4).toComponentsString(); + } else { + return ver.toComponentsString(); } - - return version; } static Path getInstallationDirectory(JPackageCommand cmd) { diff --git a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/model/DottedVersionTest.java b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/model/DottedVersionTest.java index 68100b8b3d3..f4749a6130b 100644 --- a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/model/DottedVersionTest.java +++ b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/model/DottedVersionTest.java @@ -66,6 +66,10 @@ public class DottedVersionTest { static TestConfig lazy(String input, String expectedSuffix, int expectedComponentCount, String expectedToComponent) { return new TestConfig(input, Type.LAZY.createVersion, expectedSuffix, expectedComponentCount, expectedToComponent, -1); } + + static TestConfig lazy(String input, String expectedToComponent, int numberOfComponents) { + return new TestConfig(input, Type.LAZY.createVersion, "", -1, expectedToComponent, numberOfComponents); + } } @ParameterizedTest @@ -120,24 +124,41 @@ public class DottedVersionTest { @ParameterizedTest @MethodSource - public void testComponentsStringWithPadding(TestConfig cfg) { + public void testTrim(TestConfig cfg) { var dv = cfg.createVersion.apply(cfg.input()); assertEquals(cfg.expectedToComponent(), - dv.toComponentsStringWithPadding(cfg.numberOfComponents())); + dv.trim(cfg.numberOfComponents()).toComponentsString()); } - private static List testComponentsStringWithPadding() { + private static List testTrim() { List data = new ArrayList<>(); - for (var type : Type.values()) { - data.addAll(List.of( - new TestConfig("1", type, "1.0.0.0", 4), - new TestConfig("1.2", type, "1.2.0.0", 4), - new TestConfig("1.2.3", type, "1.2.3.0", 4), - new TestConfig("1.2.3.4", type, "1.2.3.4", 4), - new TestConfig("1.2.3.4.5", type, "1.2.3.4", 4) - )); - } + data.addAll(List.of( + TestConfig.lazy("", "", 0), + TestConfig.lazy("1", "", 0), + TestConfig.lazy("1.2.3", "1", 1), + TestConfig.lazy("1.2.3", "1.2", 2), + TestConfig.lazy("1.2.3", "1.2.3", 3), + TestConfig.lazy("1.2.3", "1.2.3", 4) + )); + return data; + } + @ParameterizedTest + @MethodSource + public void testPad(TestConfig cfg) { + var dv = cfg.createVersion.apply(cfg.input()); + assertEquals(cfg.expectedToComponent(), + dv.pad(cfg.numberOfComponents()).toComponentsString()); + } + + private static List testPad() { + List data = new ArrayList<>(); + data.addAll(List.of( + TestConfig.lazy("", "0", 1), + TestConfig.lazy("1", "1", 1), + TestConfig.lazy("1", "1.0", 2), + TestConfig.lazy("1.2.3", "1.2.3.0.0", 5) + )); return data; } diff --git a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/RuntimeVersionReaderTest.java b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/RuntimeVersionReaderTest.java index 4b207163c25..bc9e2393309 100644 --- a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/RuntimeVersionReaderTest.java +++ b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/RuntimeVersionReaderTest.java @@ -37,58 +37,73 @@ import java.util.Properties; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; public class RuntimeVersionReaderTest { - @Test - public void test_release_file_with_version(@TempDir Path workdir) { - final Optional version; - try { - version = RuntimeVersionReader.readVersion( - createPropFileWithValue(workdir, "JAVA_VERSION", "27.1.2")); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } - assertTrue(version.isPresent()); - version.ifPresent(ver -> { - assertEquals("27.1.2", version.get()); + @ParameterizedTest + @CsvSource({ + "27.1.2, true", + "27.1.2, false", + "27.1.2-ea, true", + "27.1.2-ea, false" + }) + public void test_release_file_with_version(String version, + boolean quoteVersion, @TempDir Path workdir) { + final var value = RuntimeVersionReader.readVersion( + createPropFileWithValue(workdir, "JAVA_VERSION", version, quoteVersion)); + assertTrue(value.isPresent()); + value.ifPresent(val -> { + assertEquals(version, value.get().toString()); }); } + @ParameterizedTest + @CsvSource({ + "7.1.2+foo, true", + "foo, true", + "'', true", + "7.1.2+foo, false", + "foo, false", + "'', false" + }) + public void test_release_file_with_invalid_version(String version, + boolean quoteVersion, @TempDir Path workdir) { + final var value = RuntimeVersionReader.readVersion( + createPropFileWithValue(workdir, "JAVA_VERSION", version, quoteVersion)); + assertFalse(value.isPresent()); + } + @Test public void test_release_file_without_version(@TempDir Path workdir) { - final Optional version; - try { - version = RuntimeVersionReader.readVersion( - createPropFileWithValue(workdir, "JDK_VERSION", "27.1.2")); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } - assertFalse(version.isPresent()); + final var value = RuntimeVersionReader.readVersion( + createPropFileWithValue(workdir, "JDK_VERSION", "27.1.2", true)); + assertFalse(value.isPresent()); } @Test public void test_release_file_invalid_input(@TempDir Path workdir) { - final Optional version; - try { - version = RuntimeVersionReader.readVersion(workdir); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } - assertFalse(version.isPresent()); + final var value = RuntimeVersionReader.readVersion(workdir); + assertFalse(value.isPresent()); } - private Path createPropFileWithValue(Path workdir, String name, String value) - throws IOException { + private Path createPropFileWithValue(Path workdir, String name, String value, + boolean quoteValue) { Path releaseFile = workdir.resolve("release"); Properties props = new Properties(); - props.setProperty(name, "\"" + value + "\""); + if (quoteValue) { + props.setProperty(name, "\"" + value + "\""); + } else { + props.setProperty(name, value); + } + try (Writer writer = Files.newBufferedWriter(releaseFile)) { props.store(writer, null); + } catch (IOException ex) { + throw new UncheckedIOException(ex); } return releaseFile; } - - } diff --git a/test/jdk/tools/jpackage/share/ModulePathTest3.java b/test/jdk/tools/jpackage/share/ModulePathTest3.java index c3960c0d4c8..192fefa4e29 100644 --- a/test/jdk/tools/jpackage/share/ModulePathTest3.java +++ b/test/jdk/tools/jpackage/share/ModulePathTest3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2026, 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 @@ -90,6 +90,14 @@ public final class ModulePathTest3 { "--strip-native-commands") .execute(); + if (TKit.isOSX()) { + // MacBundle requires valid bundle + if (Files.exists(workDir.resolve("Contents/Home"))) { + Files.createFile(workDir.resolve("Contents/Info.plist")); + Files.createDirectories(workDir.resolve("Contents/MacOS")); + } + } + JPackageCommand cmd = new JPackageCommand() .setDefaultAppName() .setPackageType(PackageType.IMAGE) diff --git a/test/jdk/tools/jpackage/share/RuntimePackageTest.java b/test/jdk/tools/jpackage/share/RuntimePackageTest.java index 57e07757f53..2716548a70f 100644 --- a/test/jdk/tools/jpackage/share/RuntimePackageTest.java +++ b/test/jdk/tools/jpackage/share/RuntimePackageTest.java @@ -84,15 +84,15 @@ import jdk.jpackage.test.TKit; */ public class RuntimePackageTest { - // @Test - // public static void test() { - // init().run(); - // } + @Test + public static void test() { + init().run(); + } - // @Test(ifOS = MACOS) - // public static void testFromBundle() { - // init(MacHelper::createRuntimeBundle).run(); - // } + @Test(ifOS = MACOS) + public static void testFromBundle() { + init(MacHelper::createRuntimeBundle).run(); + } @Test(ifOS = LINUX) @Parameter("/usr") @@ -103,34 +103,50 @@ public class RuntimePackageTest { .run(); } - // @Test - // public static void testName() { - // // Test that jpackage can derive package name from the path to runtime image. - // init() - // .addInitializer(cmd -> cmd.removeArgumentWithValue("--name")) - // // Don't attempt to install this package as it may have an odd name derived from - // // the runtime image path. Say, on Linux for `--runtime-image foo/bar/sed` - // // command line jpackage will create a package named 'sed' that will conflict - // // with the default 'sed' package. - // .run(Action.CREATE_AND_UNPACK); - // } + @Test + public static void testName() { + // Test that jpackage can derive package name from the path to runtime image. + init() + .addInitializer(cmd -> cmd.removeArgumentWithValue("--name")) + // Don't attempt to install this package as it may have an odd name derived from + // the runtime image path. Say, on Linux for `--runtime-image foo/bar/sed` + // command line jpackage will create a package named 'sed' that will conflict + // with the default 'sed' package. + .run(Action.CREATE_AND_UNPACK); + } @Test // 27 - @Parameter(value = {"27", ""}, ifOS = {LINUX, MACOS}) - @Parameter(value = {"27", "27.0.0.0"}, ifOS = WINDOWS) + @Parameter(value = {"27"}, ifOS = {LINUX, MACOS}) // 27.1 - @Parameter(value = {"27.1", ""}) + @Parameter(value = {"27.1"}) + // 27.1.2 + @Parameter(value = {"27.1.2"}, ifOS = {LINUX, MACOS}) + // 27.1.2.3 + @Parameter(value = {"27.1.2.3"}, ifOS = {LINUX, WINDOWS}) + // 27.1.2.3.4 + @Parameter(value = {"27.1.2.3.4"}, ifOS = LINUX) + // 17.21.3+foo + @Parameter(value = {"17.21.3+foo"}, ifOS = LINUX) + // 17.21.3-ea + @Parameter(value = {"17.21.3-ea"}, ifOS = LINUX) + public static void testReleaseFileVersion(String version) { + testReleaseFileVersion(version, version); + } + + @Test + // 27 + @Parameter(value = {"27", "27.0.0.0"}, ifOS = WINDOWS) // 27.1.2 - @Parameter(value = {"27.1.2", ""}, ifOS = {LINUX, MACOS}) @Parameter(value = {"27.1.2", "27.1.2.0"}, ifOS = WINDOWS) // 27.1.2.3 - @Parameter(value = {"27.1.2.3", ""}, ifOS = {LINUX, WINDOWS}) @Parameter(value = {"27.1.2.3", "27.1.2"}, ifOS = MACOS) // 27.1.2.3.4 - @Parameter(value = {"27.1.2.3.4", ""}, ifOS = LINUX) @Parameter(value = {"27.1.2.3.4", "27.1.2"}, ifOS = MACOS) @Parameter(value = {"27.1.2.3.4", "27.1.2.3"}, ifOS = WINDOWS) + // 17.21.3-ea + @Parameter(value = {"17.21.3-ea", "17.21.3"}, ifOS = MACOS) + @Parameter(value = {"17.21.3-ea", "17.21.3.0"}, ifOS = WINDOWS) public static void testReleaseFileVersion(String version, String normalizedVersion) { new PackageTest() .addInitializer(cmd -> { @@ -157,7 +173,8 @@ public class RuntimePackageTest { cmd.validateOutput(JPackageStringBundle.MAIN .cannedFormattedString("message.release-version", version, runtimeImage.toString())); - if (!normalizedVersion.isEmpty()) { + // Normalization message is only printed if we did normalization. + if (!version.equals(normalizedVersion)) { cmd.validateOutput(JPackageStringBundle.MAIN .cannedFormattedString("message.version-normalized", normalizedVersion, version));