--- old/test/jdk/tools/jpackage/windows/WinUpgradeUUIDTest.java 2019-12-13 13:38:37.499183700 -0500 +++ new/test/jdk/tools/jpackage/windows/WinUpgradeUUIDTest.java 2019-12-13 13:38:36.434924100 -0500 @@ -21,9 +21,16 @@ * questions. */ -import jdk.jpackage.test.TKit; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.Supplier; +import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; +import jdk.jpackage.test.WindowsHelper; +import jdk.jpackage.test.TKit; /** * Test both --win-upgrade-uuid and --app-version parameters. Output of the test @@ -41,34 +48,155 @@ * @summary jpackage with --win-upgrade-uuid and --app-version * @library ../helpers * @key jpackagePlatformPackage + * @requires (jpackage.test.SQETest != null) * @build jdk.jpackage.test.* * @requires (os.family == "windows") * @modules jdk.incubator.jpackage/jdk.incubator.jpackage.internal - * @run main/othervm/timeout=360 -Xmx512m WinUpgradeUUIDTest + * @compile WinUpgradeUUIDTest.java + * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.Main + * --jpt-run=WinUpgradeUUIDTest.test + */ + +/* + * @test + * @summary jpackage with --win-upgrade-uuid and --app-version + * @library ../helpers + * @key jpackagePlatformPackage + * @requires (jpackage.test.SQETest == null) + * @build jdk.jpackage.test.* + * @requires (os.family == "windows") + * @modules jdk.jpackage/jdk.jpackage.internal + * @compile WinUpgradeUUIDTest.java + * @run main/othervm/timeout=540 -Xmx512m jdk.jpackage.test.Main + * --jpt-run=WinUpgradeUUIDTest */ public class WinUpgradeUUIDTest { - public static void main(String[] args) { - TKit.run(args, () -> { - PackageTest test = init(); - if (test.getAction() != PackageTest.Action.VERIFY_INSTALL) { - test.run(); - } - test = init(); - test.addInitializer(cmd -> { - cmd.setArgumentValue("--app-version", "2.0"); - cmd.setArgumentValue("--arguments", "bar"); - }); - test.run(); + @Test + public static void test() { + Supplier init = () -> { + final UUID upgradeCode = UUID.fromString( + "F0B18E75-52AD-41A2-BC86-6BE4FCD50BEB"); + return new PackageTest() + .forTypes(PackageType.WINDOWS) + .configureHelloApp() + .addInitializer(cmd -> cmd.addArguments("--win-upgrade-uuid", + upgradeCode.toString())) + .forTypes(PackageType.WIN_MSI) + .addBundlePropertyVerifier("UpgradeCode", value -> { + if (value.startsWith("{")) { + value = value.substring(1); + } + if (value.endsWith("}")) { + value = value.substring(0, value.length() - 1); + } + return UUID.fromString(value).equals(upgradeCode); + }, "is a match with"); + }; + + // Replace real uninstall command for the first package with nop action. + // It will be uninstalled automatically when the second + // package will be installed. + // However uninstall verification for the first package will be executed. + PackageTest test1 = init.get().setPackageUninstaller(cmd -> {}); + + PackageTest test2 = init.get().addInitializer(cmd -> { + cmd.setArgumentValue("--app-version", "2.0"); + cmd.setArgumentValue("--arguments", "bar"); }); + + new PackageTest.Group(test1, test2).run(); } - private static PackageTest init() { - return new PackageTest() - .forTypes(PackageType.WINDOWS) + /** + * Running jpackage multiple times with the same parameters should produce + * MSI packages with the same UpgradeCode and ProductCode values. + */ + @Test + public static void testUUIDs() { + Supplier init = () -> { + return new PackageTest() + .forTypes(PackageType.WIN_MSI) .configureHelloApp() - .addInitializer(cmd -> cmd.addArguments("--win-upgrade-uuid", - "F0B18E75-52AD-41A2-BC86-6BE4FCD50BEB")); + .addInitializer(cmd -> { + cmd.setFakeRuntime(); + cmd.setArgumentValue("--dest", TKit.createTempDirectory("output")); + }); + }; + + PackageTest test1 = init.get(); + PackageTest test2 = init.get(); + PackageTest test3 = init.get().addInitializer(cmd -> { + cmd.addArguments("--app-version", "2.0"); + }); + PackageTest test4 = init.get().addInitializer(cmd -> { + cmd.addArguments("--app-version", "2.0"); + cmd.addArguments("--vendor", "Foo Inc."); + }); + + PackageTest[] tests = new PackageTest[] { test1, test2, test3, test4 }; + + var productCodeVerifier = createPropertyVerifier("ProductCode", tests); + var upgradeCodeVerifier = createPropertyVerifier("UpgradeCode", tests); + + List.of(tests).forEach(test -> { + test.run(PackageTest.Action.CREATE); + }); + + productCodeVerifier.assertEquals(test1, test2); + productCodeVerifier.assertNotEquals(test1, test3); + productCodeVerifier.assertNotEquals(test1, test4); + productCodeVerifier.assertNotEquals(test3, test4); + + upgradeCodeVerifier.assertEquals(test1, test2); + upgradeCodeVerifier.assertEquals(test1, test3); + upgradeCodeVerifier.assertNotEquals(test1, test4); + } + + private static PropertyVerifier createPropertyVerifier(String propertyName, + PackageTest... tests) { + Map> properties = new HashMap<>(); + List.of(tests).forEach(test -> { + test.addBundleVerifier(cmd -> { + properties.put(test, Map.entry(cmd.getPrintableCommandLine(), + WindowsHelper.getMsiProperty(cmd, propertyName))); + }); + }); + + return new PropertyVerifier() { + @Override + protected String propertyName() { + return propertyName; + } + + @Override + protected Map> propertyValues() { + return properties; + } + }; + } + + static abstract class PropertyVerifier { + void assertEquals(PackageTest x, PackageTest y) { + var entryX = propertyValues().get(x); + var entryY = propertyValues().get(y); + TKit.assertEquals(entryX.getValue(), entryY.getValue(), + String.format( + "Check %s is the same for %s and %s command lines", + propertyName(), entryX.getKey(), entryY.getKey())); + } + + void assertNotEquals(PackageTest x, PackageTest y) { + var entryX = propertyValues().get(x); + var entryY = propertyValues().get(y); + TKit.assertNotEquals(entryX.getValue(), entryY.getValue(), + String.format( + "Check %s is different for %s and %s command lines", + propertyName(), entryX.getKey(), entryY.getKey())); + } + + protected abstract String propertyName(); + protected abstract Map> propertyValues(); } }