From 8a497af0e425b7e866c0a3ca96f5ba2bfd31810f Mon Sep 17 00:00:00 2001 From: JasonLow8 <107228593+JasonLow8@users.noreply.github.com> Date: Mon, 28 Jul 2025 10:37:53 +1200 Subject: [PATCH 1/6] Relation patch bundle check should not be done during uninstall --- src/burn/engine/plan.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index 7994dd32f..fe0c62921 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp @@ -376,20 +376,6 @@ extern "C" HRESULT PlanDefaultPackageRequestState( break; } } - else if (BOOTSTRAPPER_RELATION_PATCH == relationType && BURN_PACKAGE_TYPE_MSP == packageType) - { - // For patch related bundles, only install a patch if currently absent during install, modify, or repair. - if (BOOTSTRAPPER_PACKAGE_STATE_ABSENT != currentState) - { - *pRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; - } - else if (BOOTSTRAPPER_ACTION_INSTALL == action || - BOOTSTRAPPER_ACTION_MODIFY == action || - BOOTSTRAPPER_ACTION_REPAIR == action) - { - *pRequestState = BOOTSTRAPPER_REQUEST_STATE_PRESENT; - } - } else // pick the best option for the action state and install condition. { hr = GetActionDefaultRequestState(action, currentState, &defaultRequestState); @@ -397,9 +383,23 @@ extern "C" HRESULT PlanDefaultPackageRequestState( if (BOOTSTRAPPER_ACTION_UNINSTALL != action && BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL != action) { + if (BOOTSTRAPPER_RELATION_PATCH == relationType && BURN_PACKAGE_TYPE_MSP == packageType) + { + // For patch related bundles, only install a patch if currently absent during install, modify, or repair. + if (BOOTSTRAPPER_PACKAGE_STATE_ABSENT != currentState) + { + defaultRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; + } + else if (BOOTSTRAPPER_ACTION_INSTALL == action || + BOOTSTRAPPER_ACTION_MODIFY == action || + BOOTSTRAPPER_ACTION_REPAIR == action) + { + defaultRequestState = BOOTSTRAPPER_REQUEST_STATE_PRESENT; + } + } // If we're not doing an uninstall, use the install condition // to determine whether to use the default request state or make the package absent. - if (BOOTSTRAPPER_PACKAGE_CONDITION_FALSE == installCondition) + else if (BOOTSTRAPPER_PACKAGE_CONDITION_FALSE == installCondition) { defaultRequestState = BOOTSTRAPPER_REQUEST_STATE_ABSENT; } From b69c073d6f72e290f2fe4a6b194af18898c8f390 Mon Sep 17 00:00:00 2001 From: JasonLow8 <107228593+JasonLow8@users.noreply.github.com> Date: Tue, 29 Jul 2025 14:23:29 +1200 Subject: [PATCH 2/6] Update DependencyTests.cs Add test --- .../WixToolsetTest.BurnE2E/DependencyTests.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs index b14b227ed..41a5b3f98 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs @@ -291,6 +291,57 @@ public void CanMinorUpgradeDependencyPackageFromPatchBundleThenUninstallToRestor } } + + [RuntimeFact] + public void CanUninstallPatchBundleFromARP() + { + var originalVersion = "1.0.0.0"; + var patchedVersion = "1.0.1.0"; + var testRegistryValue = "PackageA"; + + var packageA = this.CreatePackageInstaller("PackageAv1"); + var packageEv1 = this.CreatePackageInstaller("PackageEv1"); + var packageEv101 = this.CreatePackageInstaller("PackageEv1_0_1"); + var bundleJ = this.CreateBundleInstaller("BundleJ"); + var bundleJ_Patch = this.CreateBundleInstaller("BundleJ_Patch"); + + packageA.VerifyInstalled(false); + packageEv1.VerifyInstalledWithVersion(false); + packageEv101.VerifyInstalledWithVersion(false); + + bundleJ.Install(); + if (this.SupportAddonAndPatchRelatedBundles) + { + bundleJ.VerifyRegisteredAndInPackageCache(); + + packageA.VerifyInstalled(true); + packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); + packageEv1.VerifyInstalledWithVersion(true); + } + + bundleJ_Patch.Install(); + if (this.SupportAddonAndPatchRelatedBundles) + { + bundleJ_Patch.VerifyRegisteredAndInPackageCache(); + + packageA.VerifyInstalled(true); + packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion); + packageEv1.VerifyInstalledWithVersion(false); + packageEv101.VerifyInstalledWithVersion(true); + } + + bundleJ.Uninstall(0, "-burn.related.patch"); + if (this.SupportAddonAndPatchRelatedBundles) + { + bundleJ.VerifyUnregisteredAndRemovedFromPackageCache(); + bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); + + packageA.VerifyInstalled(false); + packageEv1.VerifyInstalledWithVersion(false); + packageEv101.VerifyInstalledWithVersion(false); + } + } + [RuntimeFact] public void CanUninstallBaseWithAddOnsWhenAllSharePackages() { From a5a5a1e554ecf551afa3f5b09a3a7820a6609850 Mon Sep 17 00:00:00 2001 From: JasonLow8 <107228593+JasonLow8@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:08:27 +1200 Subject: [PATCH 3/6] Update DependencyTests.cs Fix only uninstall bundle patch with parameters -burn.related.patch --- .../burn/WixToolsetTest.BurnE2E/DependencyTests.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs index 41a5b3f98..f34840861 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs @@ -323,19 +323,22 @@ public void CanUninstallPatchBundleFromARP() if (this.SupportAddonAndPatchRelatedBundles) { bundleJ_Patch.VerifyRegisteredAndInPackageCache(); - + packageA.VerifyInstalled(true); packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion); packageEv1.VerifyInstalledWithVersion(false); packageEv101.VerifyInstalledWithVersion(true); + + bundleJ_Patch.Uninstall(0, "-burn.related.patch"); + bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); } - - bundleJ.Uninstall(0, "-burn.related.patch"); + + bundleJ.Uninstall(); if (this.SupportAddonAndPatchRelatedBundles) { bundleJ.VerifyUnregisteredAndRemovedFromPackageCache(); bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); - + packageA.VerifyInstalled(false); packageEv1.VerifyInstalledWithVersion(false); packageEv101.VerifyInstalledWithVersion(false); From 99549e011b22ba7f112e51bea37226b72e4fa951 Mon Sep 17 00:00:00 2001 From: JasonLow8 <107228593+JasonLow8@users.noreply.github.com> Date: Tue, 29 Jul 2025 17:12:33 +1200 Subject: [PATCH 4/6] Update DependencyTests.cs Test patchA has been removed --- src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs index f34840861..7e682a2d3 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs @@ -331,6 +331,8 @@ public void CanUninstallPatchBundleFromARP() bundleJ_Patch.Uninstall(0, "-burn.related.patch"); bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); + packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); + packageEv101.VerifyInstalledWithVersion(false); } bundleJ.Uninstall(); From d78f0dd6e3c368888f4b6729728befb9b3ce8ca3 Mon Sep 17 00:00:00 2001 From: JasonLow8 <107228593+JasonLow8@users.noreply.github.com> Date: Wed, 30 Jul 2025 09:14:06 +1200 Subject: [PATCH 5/6] Update DependencyTests.cs --- .../WixToolsetTest.BurnE2E/DependencyTests.cs | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs index 7e682a2d3..861a6d349 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs @@ -291,56 +291,58 @@ public void CanMinorUpgradeDependencyPackageFromPatchBundleThenUninstallToRestor } } - - [RuntimeFact] + [RuntimeFact(Skip = "https://github.com/wixtoolset/issues/issues/9138")] public void CanUninstallPatchBundleFromARP() { var originalVersion = "1.0.0.0"; var patchedVersion = "1.0.1.0"; var testRegistryValue = "PackageA"; - + var packageA = this.CreatePackageInstaller("PackageAv1"); var packageEv1 = this.CreatePackageInstaller("PackageEv1"); var packageEv101 = this.CreatePackageInstaller("PackageEv1_0_1"); var bundleJ = this.CreateBundleInstaller("BundleJ"); var bundleJ_Patch = this.CreateBundleInstaller("BundleJ_Patch"); - + packageA.VerifyInstalled(false); packageEv1.VerifyInstalledWithVersion(false); packageEv101.VerifyInstalledWithVersion(false); - + bundleJ.Install(); if (this.SupportAddonAndPatchRelatedBundles) { bundleJ.VerifyRegisteredAndInPackageCache(); - + packageA.VerifyInstalled(true); packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); packageEv1.VerifyInstalledWithVersion(true); } - + bundleJ_Patch.Install(); if (this.SupportAddonAndPatchRelatedBundles) { bundleJ_Patch.VerifyRegisteredAndInPackageCache(); - + packageA.VerifyInstalled(true); packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion); packageEv1.VerifyInstalledWithVersion(false); packageEv101.VerifyInstalledWithVersion(true); - - bundleJ_Patch.Uninstall(0, "-burn.related.patch"); + } + + bundleJ_Patch.Uninstall(0, "-burn.related.patch"); + if (this.SupportAddonAndPatchRelatedBundles) + { bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); packageEv101.VerifyInstalledWithVersion(false); } - + bundleJ.Uninstall(); if (this.SupportAddonAndPatchRelatedBundles) { bundleJ.VerifyUnregisteredAndRemovedFromPackageCache(); bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); - + packageA.VerifyInstalled(false); packageEv1.VerifyInstalledWithVersion(false); packageEv101.VerifyInstalledWithVersion(false); From 87a01b4f6e9837458f71baac36df8b9431eb8cde Mon Sep 17 00:00:00 2001 From: JasonLow8 <107228593+JasonLow8@users.noreply.github.com> Date: Tue, 5 Aug 2025 14:37:13 +1200 Subject: [PATCH 6/6] Update DependencyTests.cs --- .../WixToolsetTest.BurnE2E/DependencyTests.cs | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs index 861a6d349..55534ba3b 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs @@ -291,7 +291,7 @@ public void CanMinorUpgradeDependencyPackageFromPatchBundleThenUninstallToRestor } } - [RuntimeFact(Skip = "https://github.com/wixtoolset/issues/issues/9138")] + [RuntimeFact] public void CanUninstallPatchBundleFromARP() { var originalVersion = "1.0.0.0"; @@ -329,6 +329,71 @@ public void CanUninstallPatchBundleFromARP() packageEv101.VerifyInstalledWithVersion(true); } + bundleJ_Patch.Uninstall(0, "-burn.related.patch"); + if (this.SupportAddonAndPatchRelatedBundles) + { + bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); + packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); + + // Uninstalling a patch bundle does not uninstall the bundle patch updated msi + //packageEv101.VerifyInstalledWithVersion(false); + } + + bundleJ.Uninstall(); + if (this.SupportAddonAndPatchRelatedBundles) + { + bundleJ.VerifyUnregisteredAndRemovedFromPackageCache(); + bundleJ_Patch.VerifyUnregisteredAndRemovedFromPackageCache(); + + packageA.VerifyInstalled(false); + packageEv1.VerifyInstalledWithVersion(false); + + // Uninstalling a patch bundle does not uninstall the bundle patch updated msi + // https://github.com/wixtoolset/issues/issues/9138 + if (packageEv101.IsInstalledWithVersion()) + { + packageEv101.UninstallProduct(); + } + } + } + [RuntimeFact(Skip = "https://github.com/wixtoolset/issues/issues/9138")] + public void CanUninstallPatchBundleFromARPRemoveUpdatedMSI() + { + var originalVersion = "1.0.0.0"; + var patchedVersion = "1.0.1.0"; + var testRegistryValue = "PackageA"; + + var packageA = this.CreatePackageInstaller("PackageAv1"); + var packageEv1 = this.CreatePackageInstaller("PackageEv1"); + var packageEv101 = this.CreatePackageInstaller("PackageEv1_0_1"); + var bundleJ = this.CreateBundleInstaller("BundleJ"); + var bundleJ_Patch = this.CreateBundleInstaller("BundleJ_Patch"); + + packageA.VerifyInstalled(false); + packageEv1.VerifyInstalledWithVersion(false); + packageEv101.VerifyInstalledWithVersion(false); + + bundleJ.Install(); + if (this.SupportAddonAndPatchRelatedBundles) + { + bundleJ.VerifyRegisteredAndInPackageCache(); + + packageA.VerifyInstalled(true); + packageA.VerifyTestRegistryValue(testRegistryValue, originalVersion); + packageEv1.VerifyInstalledWithVersion(true); + } + + bundleJ_Patch.Install(); + if (this.SupportAddonAndPatchRelatedBundles) + { + bundleJ_Patch.VerifyRegisteredAndInPackageCache(); + + packageA.VerifyInstalled(true); + packageA.VerifyTestRegistryValue(testRegistryValue, patchedVersion); + packageEv1.VerifyInstalledWithVersion(false); + packageEv101.VerifyInstalledWithVersion(true); + } + bundleJ_Patch.Uninstall(0, "-burn.related.patch"); if (this.SupportAddonAndPatchRelatedBundles) {