aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-03-18 20:15:33 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-03-19 12:07:32 -0500
commitfb54576f1d05e82ba47cd718c4c4f8b3bad624c9 (patch)
treeb7d6b30bd3c9294b74874c1a48b20a8da8869a69 /src/test
parent581c320e04949300d6c3bee71fb5fc1a557f9263 (diff)
downloadwix-fb54576f1d05e82ba47cd718c4c4f8b3bad624c9.tar.gz
wix-fb54576f1d05e82ba47cd718c4c4f8b3bad624c9.tar.bz2
wix-fb54576f1d05e82ba47cd718c4c4f8b3bad624c9.zip
Give BA process id and option to wait for cancelled process to exit.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/burn/TestBA/TestBA.cs91
-rw-r--r--src/test/burn/TestData/FailureTests/BundleD/BundleD.wixproj19
-rw-r--r--src/test/burn/TestData/FailureTests/BundleD/BundleD.wxs19
-rw-r--r--src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs42
-rw-r--r--src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs15
5 files changed, 155 insertions, 31 deletions
diff --git a/src/test/burn/TestBA/TestBA.cs b/src/test/burn/TestBA/TestBA.cs
index 3688e028..c219ce9c 100644
--- a/src/test/burn/TestBA/TestBA.cs
+++ b/src/test/burn/TestBA/TestBA.cs
@@ -21,7 +21,7 @@ namespace WixToolset.Test.BA
21 private Form dummyWindow; 21 private Form dummyWindow;
22 private IntPtr windowHandle; 22 private IntPtr windowHandle;
23 private LaunchAction action; 23 private LaunchAction action;
24 private ManualResetEvent wait; 24 private readonly ManualResetEvent wait;
25 private int result; 25 private int result;
26 26
27 private string updateBundlePath; 27 private string updateBundlePath;
@@ -397,6 +397,35 @@ namespace WixToolset.Test.BA
397 } 397 }
398 } 398 }
399 399
400 protected override void OnExecutePackageComplete(ExecutePackageCompleteEventArgs args)
401 {
402 bool logTestRegistryValue;
403 string recordTestRegistryValue = this.ReadPackageAction(args.PackageId, "RecordTestRegistryValue");
404 if (!String.IsNullOrEmpty(recordTestRegistryValue) && Boolean.TryParse(recordTestRegistryValue, out logTestRegistryValue) && logTestRegistryValue)
405 {
406 var value = this.ReadTestRegistryValue(args.PackageId);
407 this.Log("TestRegistryValue: {0}, Version, '{1}'", args.PackageId, value);
408 }
409 }
410
411 protected override void OnExecuteProcessCancel(ExecuteProcessCancelEventArgs args)
412 {
413 BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION action;
414 string actionValue = this.ReadPackageAction(args.PackageId, "ProcessCancelAction");
415 if (actionValue != null && TryParseEnum<BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION>(actionValue, out action))
416 {
417 args.Action = action;
418 }
419
420 if (args.Action == BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION.Abandon)
421 {
422 // Give time to the process to start before its files are deleted.
423 Thread.Sleep(2000);
424 }
425
426 this.Log("OnExecuteProcessCancel({0})", args.Action);
427 }
428
400 protected override void OnExecuteFilesInUse(ExecuteFilesInUseEventArgs args) 429 protected override void OnExecuteFilesInUse(ExecuteFilesInUseEventArgs args)
401 { 430 {
402 this.Log("OnExecuteFilesInUse() - package: {0}, source: {1}, retries remaining: {2}, data: {3}", args.PackageId, args.Source, this.retryExecuteFilesInUse, String.Join(", ", args.Files.ToArray())); 431 this.Log("OnExecuteFilesInUse() - package: {0}, source: {1}, retries remaining: {2}, data: {3}", args.PackageId, args.Source, this.retryExecuteFilesInUse, String.Join(", ", args.Files.ToArray()));
@@ -488,43 +517,34 @@ namespace WixToolset.Test.BA
488 private void TestVariables() 517 private void TestVariables()
489 { 518 {
490 // First make sure we can check and get standard variables of each type. 519 // First make sure we can check and get standard variables of each type.
520 if (this.Engine.ContainsVariable("WindowsFolder"))
491 { 521 {
492 string value = null; 522 string value = this.Engine.GetVariableString("WindowsFolder");
493 if (this.Engine.ContainsVariable("WindowsFolder")) 523 this.Engine.Log(LogLevel.Verbose, String.Format("TEST: Successfully retrieved a string variable: WindowsFolder '{0}'", value));
494 { 524 }
495 value = this.Engine.GetVariableString("WindowsFolder"); 525 else
496 this.Engine.Log(LogLevel.Verbose, "TEST: Successfully retrieved a string variable: WindowsFolder"); 526 {
497 } 527 throw new Exception("Engine did not define a standard variable: WindowsFolder");
498 else
499 {
500 throw new Exception("Engine did not define a standard variable: WindowsFolder");
501 }
502 } 528 }
503 529
530 if (this.Engine.ContainsVariable("NTProductType"))
504 { 531 {
505 long value = 0; 532 long value = this.Engine.GetVariableNumeric("NTProductType");
506 if (this.Engine.ContainsVariable("NTProductType")) 533 this.Engine.Log(LogLevel.Verbose, String.Format("TEST: Successfully retrieved a numeric variable: NTProductType '{0}'", value));
507 { 534 }
508 value = this.Engine.GetVariableNumeric("NTProductType"); 535 else
509 this.Engine.Log(LogLevel.Verbose, "TEST: Successfully retrieved a numeric variable: NTProductType"); 536 {
510 } 537 throw new Exception("Engine did not define a standard variable: NTProductType");
511 else
512 {
513 throw new Exception("Engine did not define a standard variable: NTProductType");
514 }
515 } 538 }
516 539
540 if (this.Engine.ContainsVariable("VersionMsi"))
517 { 541 {
518 string value = null; 542 string value = this.Engine.GetVariableVersion("VersionMsi");
519 if (this.Engine.ContainsVariable("VersionMsi")) 543 this.Engine.Log(LogLevel.Verbose, String.Format("TEST: Successfully retrieved a version variable: VersionMsi '{0}'", value));
520 { 544 }
521 value = this.Engine.GetVariableVersion("VersionMsi"); 545 else
522 this.Engine.Log(LogLevel.Verbose, "TEST: Successfully retrieved a version variable: VersionMsi"); 546 {
523 } 547 throw new Exception("Engine did not define a standard variable: VersionMsi");
524 else
525 {
526 throw new Exception("Engine did not define a standard variable: VersionMsi");
527 }
528 } 548 }
529 549
530 // Now validate that Contians returns false for non-existant variables of each type. 550 // Now validate that Contians returns false for non-existant variables of each type.
@@ -596,6 +616,15 @@ namespace WixToolset.Test.BA
596 } 616 }
597 } 617 }
598 618
619 private string ReadTestRegistryValue(string name)
620 {
621 string testName = this.Engine.GetVariableString("TestGroupName");
622 using (RegistryKey testKey = Registry.LocalMachine.OpenSubKey(String.Format(@"Software\WiX\Tests\{0}\{1}", testName, name)))
623 {
624 return testKey == null ? null : testKey.GetValue("Version") as string;
625 }
626 }
627
599 private static bool TryParseEnum<T>(string value, out T t) 628 private static bool TryParseEnum<T>(string value, out T t)
600 { 629 {
601 try 630 try
diff --git a/src/test/burn/TestData/FailureTests/BundleD/BundleD.wixproj b/src/test/burn/TestData/FailureTests/BundleD/BundleD.wixproj
new file mode 100644
index 00000000..7b7408c6
--- /dev/null
+++ b/src/test/burn/TestData/FailureTests/BundleD/BundleD.wixproj
@@ -0,0 +1,19 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{3C1A4842-81AC-4C90-8B35-A5E18F034C8D}</UpgradeCode>
6 <Version>1.0.0.0</Version>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
13 </ItemGroup>
14 <ItemGroup>
15 <PackageReference Include="WixToolset.Bal.wixext" />
16 <PackageReference Include="WixToolset.NetFx.wixext" />
17 <PackageReference Include="WixToolset.Util.wixext" />
18 </ItemGroup>
19</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/FailureTests/BundleD/BundleD.wxs b/src/test/burn/TestData/FailureTests/BundleD/BundleD.wxs
new file mode 100644
index 00000000..ca70236d
--- /dev/null
+++ b/src/test/burn/TestData/FailureTests/BundleD/BundleD.wxs
@@ -0,0 +1,19 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<?define TestExeRegistryKey = Software\WiX\Tests\$(var.TestGroupName)\ExeA?>
4
5<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
6 <Fragment>
7 <util:RegistrySearch Root="HKLM" Key="$(var.TestExeRegistryKey)" Value="Version" Variable="ExeA_Version" />
8
9 <PackageGroup Id="BundlePackages">
10 <ExePackage Id="ExeA" Cache="remove" PerMachine="yes"
11 DetectCondition="ExeA_Version AND ExeA_Version &gt;= v$(var.Version)"
12 InstallArguments="/s 5000 /regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
13 RepairArguments="/regw &quot;HKLM\$(var.TestExeRegistryKey),Version,String,$(var.Version)&quot;"
14 UninstallArguments="/regd &quot;HKLM\$(var.TestExeRegistryKey),Version&quot;">
15 <PayloadGroupRef Id="TestExePayloads" />
16 </ExePackage>
17 </PackageGroup>
18 </Fragment>
19</Wix>
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs
index d8428a54..bbc0b387 100644
--- a/src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs
+++ b/src/test/burn/WixToolsetTest.BurnE2E/FailureTests.cs
@@ -2,7 +2,9 @@
2 2
3namespace WixToolsetTest.BurnE2E 3namespace WixToolsetTest.BurnE2E
4{ 4{
5 using System.Threading;
5 using WixTestTools; 6 using WixTestTools;
7 using WixToolset.Mba.Core;
6 using Xunit; 8 using Xunit;
7 using Xunit.Abstractions; 9 using Xunit.Abstractions;
8 10
@@ -11,6 +13,46 @@ namespace WixToolsetTest.BurnE2E
11 public FailureTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } 13 public FailureTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { }
12 14
13 [Fact] 15 [Fact]
16 public void CanCancelExePackageAndAbandonIt()
17 {
18 var bundleD = this.CreateBundleInstaller("BundleD");
19 var testBAController = this.CreateTestBAController();
20
21 // Cancel package ExeA after it starts.
22 testBAController.SetPackageCancelExecuteAtProgress("ExeA", 1);
23 testBAController.SetPackageRecordTestRegistryValue("ExeA");
24
25 var logPath = bundleD.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_USEREXIT);
26 bundleD.VerifyUnregisteredAndRemovedFromPackageCache();
27
28 Assert.True(LogVerifier.MessageInLogFile(logPath, "TestRegistryValue: ExeA, Version, ''"));
29
30 // Make sure ExeA finishes running.
31 Thread.Sleep(3000);
32
33 bundleD.VerifyExeTestRegistryValue("ExeA", "1.0.0.0");
34 }
35
36 [Fact]
37 public void CanCancelExePackageAndWaitUntilItCompletes()
38 {
39 var bundleD = this.CreateBundleInstaller("BundleD");
40 var testBAController = this.CreateTestBAController();
41
42 // Cancel package ExeA after it starts.
43 testBAController.SetPackageCancelExecuteAtProgress("ExeA", 1);
44 testBAController.SetPackageProcessCancelAction("ExeA", BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION.Wait);
45 testBAController.SetPackageRecordTestRegistryValue("ExeA");
46
47 var logPath = bundleD.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_USEREXIT);
48 bundleD.VerifyUnregisteredAndRemovedFromPackageCache();
49
50 Assert.True(LogVerifier.MessageInLogFile(logPath, "TestRegistryValue: ExeA, Version, '1.0.0.0'"));
51
52 bundleD.VerifyExeTestRegistryValue("ExeA", "1.0.0.0");
53 }
54
55 [Fact]
14 public void CanCancelMsiPackageVeryEarly() 56 public void CanCancelMsiPackageVeryEarly()
15 { 57 {
16 var packageA = this.CreatePackageInstaller("PackageA"); 58 var packageA = this.CreatePackageInstaller("PackageA");
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs b/src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs
index d2e8a1ca..fa553919 100644
--- a/src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs
+++ b/src/test/burn/WixToolsetTest.BurnE2E/TestBAController.cs
@@ -148,6 +148,21 @@ namespace WixToolsetTest.BurnE2E
148 } 148 }
149 149
150 /// <summary> 150 /// <summary>
151 /// Requests the BA to log the test registry value for the specified package.
152 /// </summary>
153 /// <param name="packageId"></param>
154 /// <param name="value"></param>
155 public void SetPackageRecordTestRegistryValue(string packageId, string value = "true")
156 {
157 this.SetPackageState(packageId, "RecordTestRegistryValue", value);
158 }
159
160 public void SetPackageProcessCancelAction(string packageId, BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION action)
161 {
162 this.SetPackageState(packageId, "ProcessCancelAction", action.ToString());
163 }
164
165 /// <summary>
151 /// Sets the number of times to re-run the Detect phase. 166 /// Sets the number of times to re-run the Detect phase.
152 /// </summary> 167 /// </summary>
153 /// <param name="state">Number of times to run Detect (after the first, normal, Detect).</param> 168 /// <param name="state">Number of times to run Detect (after the first, normal, Detect).</param>