From fbc1a73743368211d5d8c7fc0625adf6eb9ca50c Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 18 Mar 2022 20:16:07 -0500 Subject: Add checkpoint so Exe and Msu packages rollback after being cancelled. Fixes 5950 --- src/test/burn/TestBA/TestBA.cs | 25 +++++++++++++++++++--- .../burn/WixToolsetTest.BurnE2E/FailureTests.cs | 14 ++++++------ 2 files changed, 28 insertions(+), 11 deletions(-) (limited to 'src/test') diff --git a/src/test/burn/TestBA/TestBA.cs b/src/test/burn/TestBA/TestBA.cs index c219ce9c..fdbcc6d4 100644 --- a/src/test/burn/TestBA/TestBA.cs +++ b/src/test/burn/TestBA/TestBA.cs @@ -4,6 +4,7 @@ namespace WixToolset.Test.BA { using System; using System.Collections.Generic; + using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; @@ -37,6 +38,7 @@ namespace WixToolset.Test.BA private string cancelExecuteActionName; private int cancelOnProgressAtProgress; private int retryExecuteFilesInUse; + private bool rollingBack; private IBootstrapperCommand Command { get; } @@ -350,6 +352,8 @@ namespace WixToolset.Test.BA { this.Log("OnExecutePackageBegin() - package: {0}, rollback: {1}", args.PackageId, !args.ShouldExecute); + this.rollingBack = !args.ShouldExecute; + string slowProgress = this.ReadPackageAction(args.PackageId, "SlowExecute"); if (String.IsNullOrEmpty(slowProgress) || !Int32.TryParse(slowProgress, out this.sleepDuringExecute)) { @@ -404,7 +408,7 @@ namespace WixToolset.Test.BA if (!String.IsNullOrEmpty(recordTestRegistryValue) && Boolean.TryParse(recordTestRegistryValue, out logTestRegistryValue) && logTestRegistryValue) { var value = this.ReadTestRegistryValue(args.PackageId); - this.Log("TestRegistryValue: {0}, Version, '{1}'", args.PackageId, value); + this.Log("TestRegistryValue: {0}, {1}, Version, '{2}'", this.rollingBack ? "Rollback" : "Execute", args.PackageId, value); } } @@ -419,8 +423,22 @@ namespace WixToolset.Test.BA if (args.Action == BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION.Abandon) { - // Give time to the process to start before its files are deleted. - Thread.Sleep(2000); + // Kill process to make sure it doesn't affect other tests. + try + { + using (Process process = Process.GetProcessById(args.ProcessId)) + { + if (process != null) + { + process.Kill(); + } + } + } + catch (Exception e) + { + this.Log("Failed to kill process {0}: {1}", args.ProcessId, e); + Thread.Sleep(5000); + } } this.Log("OnExecuteProcessCancel({0})", args.Action); @@ -494,6 +512,7 @@ namespace WixToolset.Test.BA this.cancelOnProgressAtProgress = -1; this.cancelExecuteAtProgress = -1; this.cancelCacheAtProgress = -1; + this.rollingBack = false; } protected override void OnApplyComplete(ApplyCompleteEventArgs args) diff --git a/src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs index bbc0b387..b50be49a 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs @@ -25,12 +25,8 @@ namespace WixToolsetTest.BurnE2E var logPath = bundleD.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_USEREXIT); bundleD.VerifyUnregisteredAndRemovedFromPackageCache(); - Assert.True(LogVerifier.MessageInLogFile(logPath, "TestRegistryValue: ExeA, Version, ''")); - - // Make sure ExeA finishes running. - Thread.Sleep(3000); - - bundleD.VerifyExeTestRegistryValue("ExeA", "1.0.0.0"); + Assert.True(LogVerifier.MessageInLogFile(logPath, "TestRegistryValue: Execute, ExeA, Version, ''")); + Assert.False(LogVerifier.MessageInLogFile(logPath, "TestRegistryValue: Rollback, ExeA, Version")); } [Fact] @@ -47,9 +43,11 @@ namespace WixToolsetTest.BurnE2E var logPath = bundleD.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_USEREXIT); bundleD.VerifyUnregisteredAndRemovedFromPackageCache(); - Assert.True(LogVerifier.MessageInLogFile(logPath, "TestRegistryValue: ExeA, Version, '1.0.0.0'")); + Assert.True(LogVerifier.MessageInLogFile(logPath, "TestRegistryValue: Execute, ExeA, Version, '1.0.0.0'")); + Assert.True(LogVerifier.MessageInLogFile(logPath, "TestRegistryValue: Rollback, ExeA, Version, ''")); - bundleD.VerifyExeTestRegistryValue("ExeA", "1.0.0.0"); + // The package should have rolled back. + bundleD.VerifyExeTestRegistryRootDeleted("ExeA"); } [Fact] -- cgit v1.2.3-55-g6feb