From 328d6df64373cf340628a09e52dd77ea338bc838 Mon Sep 17 00:00:00 2001
From: Sean Hall <r.sean.hall@gmail.com>
Date: Mon, 31 Jan 2022 16:48:58 -0600
Subject: Don't uninstall package during rollback if there are dependents.

---
 .../burn/WixToolsetTest.BurnE2E/DependencyTests.cs | 150 ++++++++++++++++++++-
 1 file changed, 148 insertions(+), 2 deletions(-)

(limited to 'src/test/burn')

diff --git a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs
index 7c74f348..7e3e28c1 100644
--- a/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs
+++ b/src/test/burn/WixToolsetTest.BurnE2E/DependencyTests.cs
@@ -540,7 +540,7 @@ namespace WixToolsetTest.BurnE2E
         }
 
         [Fact(Skip = "https://github.com/wixtoolset/issues/issues/3421")]
-        public void DoesntLoseDependenciesOnFailedMajorUpgradeBundleFromMajorUpdateMsi()
+        public void DoesntLoseDependenciesOnFailedMajorUpgradeBundleFromMajorUpdateMsiFifo()
         {
             var packageAv1 = this.CreatePackageInstaller("PackageAv1");
             var packageC = this.CreatePackageInstaller("PackageC");
@@ -611,8 +611,80 @@ namespace WixToolsetTest.BurnE2E
             packageGv2.VerifyInstalled(false);
         }
 
+        [Fact(Skip = "https://github.com/wixtoolset/issues/issues/3421")]
+        public void DoesntLoseDependenciesOnFailedMajorUpgradeBundleFromMajorUpdateMsiLifo()
+        {
+            var packageAv1 = this.CreatePackageInstaller("PackageAv1");
+            var packageC = this.CreatePackageInstaller("PackageC");
+            var packageFv1 = this.CreatePackageInstaller("PackageFv1");
+            var packageFv2 = this.CreatePackageInstaller("PackageFv2");
+            var packageGv1 = this.CreatePackageInstaller("PackageGv1");
+            var packageGv2 = this.CreatePackageInstaller("PackageGv2");
+            var bundleM = this.CreateBundleInstaller("BundleM");
+            var bundleNv1 = this.CreateBundleInstaller("BundleNv1");
+            var bundleNv2 = this.CreateBundleInstaller("BundleNv2");
+            var testBAController = this.CreateTestBAController();
+
+            packageAv1.VerifyInstalled(false);
+            packageC.VerifyInstalled(false);
+            packageFv1.VerifyInstalled(false);
+            packageFv2.VerifyInstalled(false);
+            packageGv1.VerifyInstalled(false);
+            packageGv2.VerifyInstalled(false);
+
+            bundleM.Install();
+            bundleM.VerifyRegisteredAndInPackageCache();
+
+            packageAv1.VerifyInstalled(true);
+            packageFv1.VerifyInstalled(true);
+            packageFv2.VerifyInstalled(false);
+            packageGv1.VerifyInstalled(false);
+            packageGv2.VerifyInstalled(false);
+
+            bundleNv1.Install();
+            bundleNv1.VerifyRegisteredAndInPackageCache();
+
+            packageAv1.VerifyInstalled(true);
+            packageFv1.VerifyInstalled(true);
+            packageFv2.VerifyInstalled(false);
+            packageGv1.VerifyInstalled(true);
+            packageGv2.VerifyInstalled(false);
+
+            // Make PackageC fail.
+            testBAController.SetPackageCancelExecuteAtProgress("PackageC", 10);
+
+            bundleNv2.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_USEREXIT);
+            bundleNv2.VerifyUnregisteredAndRemovedFromPackageCache();
+            bundleNv1.VerifyRegisteredAndInPackageCache();
+
+            packageAv1.VerifyInstalled(true);
+            packageC.VerifyInstalled(false);
+            packageFv1.VerifyInstalled(true);
+            packageFv2.VerifyInstalled(false);
+            packageGv1.VerifyInstalled(true);
+            packageGv2.VerifyInstalled(false);
+
+            bundleNv1.Uninstall();
+            bundleNv1.VerifyUnregisteredAndRemovedFromPackageCache();
+
+            packageAv1.VerifyInstalled(true);
+            packageFv1.VerifyInstalled(true);
+            packageFv2.VerifyInstalled(false);
+            packageGv1.VerifyInstalled(false);
+            packageGv2.VerifyInstalled(false);
+
+            bundleM.Uninstall();
+            bundleM.VerifyUnregisteredAndRemovedFromPackageCache();
+
+            packageAv1.VerifyInstalled(false);
+            packageFv1.VerifyInstalled(false);
+            packageFv2.VerifyInstalled(false);
+            packageGv1.VerifyInstalled(false);
+            packageGv2.VerifyInstalled(false);
+        }
+
         [Fact]
-        public void DoesntLoseDependenciesOnFailedMajorUpgradeBundleFromMinorUpdateMsi()
+        public void DoesntLoseDependenciesOnFailedMajorUpgradeBundleFromMinorUpdateMsiFifo()
         {
             var packageAv1 = this.CreatePackageInstaller("PackageAv1");
             var packageC = this.CreatePackageInstaller("PackageC");
@@ -685,6 +757,80 @@ namespace WixToolsetTest.BurnE2E
             packageGv101.VerifyInstalledWithVersion(false);
         }
 
+        [Fact]
+        public void DoesntLoseDependenciesOnFailedMajorUpgradeBundleFromMinorUpdateMsiLifo()
+        {
+            var packageAv1 = this.CreatePackageInstaller("PackageAv1");
+            var packageC = this.CreatePackageInstaller("PackageC");
+            var packageFv1 = this.CreatePackageInstaller("PackageFv1");
+            var packageFv101 = this.CreatePackageInstaller("PackageFv1_0_1");
+            var packageGv1 = this.CreatePackageInstaller("PackageGv1");
+            var packageGv101 = this.CreatePackageInstaller("PackageGv1_0_1");
+            var bundleM = this.CreateBundleInstaller("BundleM");
+            var bundleNv1 = this.CreateBundleInstaller("BundleNv1");
+            var bundleNv101 = this.CreateBundleInstaller("BundleNv1_0_1");
+            var testBAController = this.CreateTestBAController();
+
+            packageAv1.VerifyInstalled(false);
+            packageC.VerifyInstalled(false);
+            packageFv1.VerifyInstalledWithVersion(false);
+            packageFv101.VerifyInstalledWithVersion(false);
+            packageGv1.VerifyInstalledWithVersion(false);
+            packageGv101.VerifyInstalledWithVersion(false);
+
+            bundleM.Install();
+            bundleM.VerifyRegisteredAndInPackageCache();
+
+            packageAv1.VerifyInstalled(true);
+            packageFv1.VerifyInstalledWithVersion(true);
+            packageFv101.VerifyInstalledWithVersion(false);
+            packageGv1.VerifyInstalledWithVersion(false);
+            packageGv101.VerifyInstalledWithVersion(false);
+
+            bundleNv1.Install();
+            bundleNv1.VerifyRegisteredAndInPackageCache();
+
+            packageAv1.VerifyInstalled(true);
+            packageFv1.VerifyInstalledWithVersion(true);
+            packageFv101.VerifyInstalledWithVersion(false);
+            packageGv1.VerifyInstalledWithVersion(true);
+            packageGv101.VerifyInstalledWithVersion(false);
+
+            // Make PackageC fail.
+            testBAController.SetPackageCancelExecuteAtProgress("PackageC", 10);
+
+            // Verify https://github.com/wixtoolset/issues/issues/6510 - Dependency provider removed on rollback even though package is not rolled back
+            bundleNv101.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_USEREXIT);
+            bundleNv101.VerifyUnregisteredAndRemovedFromPackageCache();
+            bundleNv1.VerifyRegisteredAndInPackageCache();
+
+            // The expected values will change after implementing https://github.com/wixtoolset/issues/issues/6535 and https://github.com/wixtoolset/issues/issues/3421
+            packageAv1.VerifyInstalled(true);
+            packageC.VerifyInstalled(false);
+            packageFv1.VerifyInstalledWithVersion(false);
+            packageFv101.VerifyInstalledWithVersion(true);
+            packageGv1.VerifyInstalledWithVersion(false);
+            packageGv101.VerifyInstalledWithVersion(true);
+
+            bundleNv1.Uninstall();
+            bundleNv1.VerifyUnregisteredAndRemovedFromPackageCache();
+
+            packageAv1.VerifyInstalled(true);
+            packageFv1.VerifyInstalledWithVersion(false);
+            packageFv101.VerifyInstalledWithVersion(true);
+            packageGv1.VerifyInstalledWithVersion(false);
+            packageGv101.VerifyInstalledWithVersion(false);
+
+            bundleM.Uninstall();
+            bundleM.VerifyUnregisteredAndRemovedFromPackageCache();
+
+            packageAv1.VerifyInstalled(false);
+            packageFv1.VerifyInstalledWithVersion(false);
+            packageFv101.VerifyInstalledWithVersion(false);
+            packageGv1.VerifyInstalledWithVersion(false);
+            packageGv101.VerifyInstalledWithVersion(false);
+        }
+
         [Fact]
         public void DoesntRegisterDependencyOnPackageNotSelectedForInstall()
         {
-- 
cgit v1.2.3-55-g6feb