From edccb203c421d2bd820062024088c6698424d9ee Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Wed, 4 Feb 2026 20:47:04 -0500 Subject: Support dual-purpose packages in Burn. Fixes https://github.com/wixtoolset/issues/issues/8958 --- src/test/burn/TestBA/TestBA.cs | 12 +- .../MultipleBundlePackagesWithRemoteBundle.wxs | 2 +- .../AllPmouBundle/AllPmouBundleTestBA.wixproj | 7 + .../AllPmouBundle/AllPmouBundleWixStdBA.wixproj | 7 + .../AllPmouBundle/Bundle.props | 14 + .../AllPmouBundle/Bundle.wxs | 19 + .../AllPuomBundle/AllPuomBundleTestBA.wixproj | 7 + .../AllPuomBundle/AllPuomBundleWixStdBA.wixproj | 7 + .../AllPuomBundle/Bundle.props | 14 + .../AllPuomBundle/Bundle.wxs | 19 + .../PerMachineBundle/Bundle.wxs | 11 + .../PerMachineBundle/PerMachineBundle.wixproj | 11 + .../PerMachinePkg/PerMachinePkg.wixproj | 2 + .../PerMachinePkg/product.wxs | 6 + .../PerUserBundle/Bundle.wxs | 11 + .../PerUserBundle/PerUserBundle.wixproj | 11 + .../PerUserPkg/PerUserPkg.wixproj | 2 + .../ConfigurableScopeTests/PerUserPkg/product.wxs | 6 + .../PmPmouBundle/Bundle.props | 15 + .../ConfigurableScopeTests/PmPmouBundle/Bundle.wxs | 20 + .../PmPmouBundle/PmPmouBundleTestBA.wixproj | 7 + .../PmPuPmouBundle/Bundle.props | 17 + .../PmPuPmouBundle/Bundle.wxs | 21 + .../PmPuPmouBundle/PmPuPmouBundleTestBA.wixproj | 7 + .../PmPuPuomBundle/Bundle.props | 17 + .../PmPuPuomBundle/Bundle.wxs | 21 + .../PmPuPuomBundle/PmPuPuomBundleTestBA.wixproj | 7 + .../PmPuomBundle/Bundle.props | 15 + .../ConfigurableScopeTests/PmPuomBundle/Bundle.wxs | 20 + .../PmPuomBundle/PmPuomBundleTestBA.wixproj | 7 + .../PmouPkg1/PmouPkg1.wixproj | 2 + .../ConfigurableScopeTests/PmouPkg1/product.wxs | 6 + .../PmouPkg2/PmouPkg2.wixproj | 2 + .../ConfigurableScopeTests/PmouPkg2/product.wxs | 6 + .../PuPmouBundle/Bundle.props | 16 + .../ConfigurableScopeTests/PuPmouBundle/Bundle.wxs | 20 + .../PuPmouBundle/PuPmouBundleTestBA.wixproj | 7 + .../PuPuomBundle/Bundle.props | 16 + .../ConfigurableScopeTests/PuPuomBundle/Bundle.wxs | 20 + .../PuPuomBundle/PuPuomBundleTestBA.wixproj | 7 + .../PuomBundlePackage/Bundle.wxs | 11 + .../PuomBundlePackage/PuomBundlePackage.wixproj | 11 + .../PuomPkg1/PuomPkg1.wixproj | 2 + .../ConfigurableScopeTests/PuomPkg1/product.wxs | 6 + .../PuomPkg2/PuomPkg2.wixproj | 2 + .../ConfigurableScopeTests/PuomPkg2/product.wxs | 6 + src/test/burn/WixTestTools/ArpEntryVerifier.cs | 16 +- src/test/burn/WixTestTools/BundleInstaller.cs | 5 +- src/test/burn/WixTestTools/BundleRegistration.cs | 13 +- src/test/burn/WixTestTools/BundleVerifier.cs | 119 ++-- .../burn/WixTestTools/GenericArpRegistration.cs | 18 +- src/test/burn/WixTestTools/PackageVerifier.cs | 26 +- src/test/burn/WixTestTools/TestTool.cs | 14 +- src/test/burn/WixTestTools/WixTestContext.cs | 4 + src/test/burn/WixToolset.WixBA/WixBA.cs | 2 +- .../WixToolsetTest.BurnE2E/BundlePackageTests.cs | 2 +- .../ConfigurableScopeTests.cs | 631 +++++++++++++++++++++ .../OptionalUpdateRegistrationTests.cs | 4 +- .../Utilities/TestBAController.cs | 5 + src/test/burn/WixToolsetTest.BurnE2E/runtests.cmd | 4 +- src/test/sandbox/TestSandbox.wsb | 17 +- 61 files changed, 1281 insertions(+), 81 deletions(-) create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/AllPmouBundleTestBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/AllPmouBundleWixStdBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/Bundle.props create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/AllPuomBundleTestBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/AllPuomBundleWixStdBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/Bundle.props create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PerMachineBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PerMachineBundle/PerMachineBundle.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PerMachinePkg/PerMachinePkg.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PerMachinePkg/product.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PerUserBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PerUserBundle/PerUserBundle.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PerUserPkg/PerUserPkg.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PerUserPkg/product.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/Bundle.props create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/PmPmouBundleTestBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/Bundle.props create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/PmPuPmouBundleTestBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/Bundle.props create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/PmPuPuomBundleTestBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/Bundle.props create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/PmPuomBundleTestBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmouPkg1/PmouPkg1.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmouPkg1/product.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmouPkg2/PmouPkg2.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PmouPkg2/product.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/Bundle.props create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/PuPmouBundleTestBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/Bundle.props create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/PuPuomBundleTestBA.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuomBundlePackage/Bundle.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuomBundlePackage/PuomBundlePackage.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuomPkg1/PuomPkg1.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuomPkg1/product.wxs create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuomPkg2/PuomPkg2.wixproj create mode 100644 src/test/burn/TestData/ConfigurableScopeTests/PuomPkg2/product.wxs create mode 100644 src/test/burn/WixToolsetTest.BurnE2E/ConfigurableScopeTests.cs (limited to 'src/test') diff --git a/src/test/burn/TestBA/TestBA.cs b/src/test/burn/TestBA/TestBA.cs index 51fc1cbd..abab863a 100644 --- a/src/test/burn/TestBA/TestBA.cs +++ b/src/test/burn/TestBA/TestBA.cs @@ -43,6 +43,7 @@ namespace WixToolset.Test.BA private bool rollingBack; private string forceDownloadSource; private string forceUpdateSource; + private BundleScope bundleScope; private IBootstrapperCommand Command { get; set; } @@ -160,6 +161,12 @@ namespace WixToolset.Test.BA this.quitAfterDetect = false; } + string bundleScope = this.ReadPackageAction(null, "BundleScope"); + if (String.IsNullOrEmpty(bundleScope) || !Enum.TryParse(bundleScope, out this.bundleScope)) + { + this.bundleScope = BundleScope.Default; + } + this.ImportContainerSources(); this.ImportPayloadSources(); @@ -227,7 +234,6 @@ namespace WixToolset.Test.BA { this.Log(" OnDetectBegin::ForceUpdateSource: {0}", this.forceUpdateSource); } - } protected override void OnDetectUpdateBegin(DetectUpdateBeginEventArgs args) @@ -294,7 +300,7 @@ namespace WixToolset.Test.BA } else { - this.Engine.Plan(this.action); + this.Engine.Plan(this.action, this.bundleScope); } } else @@ -312,7 +318,7 @@ namespace WixToolset.Test.BA { if (this.explicitlyElevateAndPlanFromOnElevateBegin) { - this.Engine.Plan(this.action); + this.Engine.Plan(this.action, this.bundleScope); // Simulate showing some UI since these tests won't actually show the UAC prompt. MessagePump.ProcessMessages(10); diff --git a/src/test/burn/TestData/BundlePackageTests/MultipleBundlePackagesWithRemoteBundle/MultipleBundlePackagesWithRemoteBundle.wxs b/src/test/burn/TestData/BundlePackageTests/MultipleBundlePackagesWithRemoteBundle/MultipleBundlePackagesWithRemoteBundle.wxs index 0d05700f..3ff752b2 100644 --- a/src/test/burn/TestData/BundlePackageTests/MultipleBundlePackagesWithRemoteBundle/MultipleBundlePackagesWithRemoteBundle.wxs +++ b/src/test/burn/TestData/BundlePackageTests/MultipleBundlePackagesWithRemoteBundle/MultipleBundlePackagesWithRemoteBundle.wxs @@ -12,7 +12,7 @@ - + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/AllPmouBundleTestBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/AllPmouBundleTestBA.wixproj new file mode 100644 index 00000000..30d850d4 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/AllPmouBundleTestBA.wixproj @@ -0,0 +1,7 @@ + + + TestBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/AllPmouBundleWixStdBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/AllPmouBundleWixStdBA.wixproj new file mode 100644 index 00000000..56db1fdc --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/AllPmouBundleWixStdBA.wixproj @@ -0,0 +1,7 @@ + + + WixStdBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/Bundle.props b/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/Bundle.props new file mode 100644 index 00000000..a200a063 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/Bundle.props @@ -0,0 +1,14 @@ + + + Bundle + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/Bundle.wxs new file mode 100644 index 00000000..48708db4 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/AllPmouBundle/Bundle.wxs @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/AllPuomBundleTestBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/AllPuomBundleTestBA.wixproj new file mode 100644 index 00000000..30d850d4 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/AllPuomBundleTestBA.wixproj @@ -0,0 +1,7 @@ + + + TestBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/AllPuomBundleWixStdBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/AllPuomBundleWixStdBA.wixproj new file mode 100644 index 00000000..56db1fdc --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/AllPuomBundleWixStdBA.wixproj @@ -0,0 +1,7 @@ + + + WixStdBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/Bundle.props b/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/Bundle.props new file mode 100644 index 00000000..d704544c --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/Bundle.props @@ -0,0 +1,14 @@ + + + Bundle + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/Bundle.wxs new file mode 100644 index 00000000..4cb11a98 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/AllPuomBundle/Bundle.wxs @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PerMachineBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PerMachineBundle/Bundle.wxs new file mode 100644 index 00000000..e170667b --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PerMachineBundle/Bundle.wxs @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PerMachineBundle/PerMachineBundle.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PerMachineBundle/PerMachineBundle.wixproj new file mode 100644 index 00000000..ade65220 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PerMachineBundle/PerMachineBundle.wixproj @@ -0,0 +1,11 @@ + + + Bundle + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PerMachinePkg/PerMachinePkg.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PerMachinePkg/PerMachinePkg.wixproj new file mode 100644 index 00000000..20673927 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PerMachinePkg/PerMachinePkg.wixproj @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PerMachinePkg/product.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PerMachinePkg/product.wxs new file mode 100644 index 00000000..4b14c9d2 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PerMachinePkg/product.wxs @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PerUserBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PerUserBundle/Bundle.wxs new file mode 100644 index 00000000..e0a4c170 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PerUserBundle/Bundle.wxs @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PerUserBundle/PerUserBundle.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PerUserBundle/PerUserBundle.wixproj new file mode 100644 index 00000000..7af6148b --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PerUserBundle/PerUserBundle.wixproj @@ -0,0 +1,11 @@ + + + Bundle + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PerUserPkg/PerUserPkg.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PerUserPkg/PerUserPkg.wixproj new file mode 100644 index 00000000..20673927 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PerUserPkg/PerUserPkg.wixproj @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PerUserPkg/product.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PerUserPkg/product.wxs new file mode 100644 index 00000000..17c25409 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PerUserPkg/product.wxs @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/Bundle.props b/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/Bundle.props new file mode 100644 index 00000000..9ecde613 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/Bundle.props @@ -0,0 +1,15 @@ + + + Bundle + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/Bundle.wxs new file mode 100644 index 00000000..ecb8571b --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/Bundle.wxs @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/PmPmouBundleTestBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/PmPmouBundleTestBA.wixproj new file mode 100644 index 00000000..66ad737c --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPmouBundle/PmPmouBundleTestBA.wixproj @@ -0,0 +1,7 @@ + + + TestBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/Bundle.props b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/Bundle.props new file mode 100644 index 00000000..51458cdd --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/Bundle.props @@ -0,0 +1,17 @@ + + + Bundle + 1140 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/Bundle.wxs new file mode 100644 index 00000000..64361b42 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/Bundle.wxs @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/PmPuPmouBundleTestBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/PmPuPmouBundleTestBA.wixproj new file mode 100644 index 00000000..30d850d4 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPmouBundle/PmPuPmouBundleTestBA.wixproj @@ -0,0 +1,7 @@ + + + TestBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/Bundle.props b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/Bundle.props new file mode 100644 index 00000000..7da4792a --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/Bundle.props @@ -0,0 +1,17 @@ + + + Bundle + 1140 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/Bundle.wxs new file mode 100644 index 00000000..4c9ce68c --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/Bundle.wxs @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/PmPuPuomBundleTestBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/PmPuPuomBundleTestBA.wixproj new file mode 100644 index 00000000..30d850d4 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuPuomBundle/PmPuPuomBundleTestBA.wixproj @@ -0,0 +1,7 @@ + + + TestBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/Bundle.props b/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/Bundle.props new file mode 100644 index 00000000..9ecde613 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/Bundle.props @@ -0,0 +1,15 @@ + + + Bundle + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/Bundle.wxs new file mode 100644 index 00000000..7f53f09a --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/Bundle.wxs @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/PmPuomBundleTestBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/PmPuomBundleTestBA.wixproj new file mode 100644 index 00000000..30d850d4 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmPuomBundle/PmPuomBundleTestBA.wixproj @@ -0,0 +1,7 @@ + + + TestBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg1/PmouPkg1.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg1/PmouPkg1.wixproj new file mode 100644 index 00000000..20673927 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg1/PmouPkg1.wixproj @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg1/product.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg1/product.wxs new file mode 100644 index 00000000..a41e99ca --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg1/product.wxs @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg2/PmouPkg2.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg2/PmouPkg2.wixproj new file mode 100644 index 00000000..20673927 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg2/PmouPkg2.wixproj @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg2/product.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg2/product.wxs new file mode 100644 index 00000000..84f74769 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PmouPkg2/product.wxs @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/Bundle.props b/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/Bundle.props new file mode 100644 index 00000000..95acbebe --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/Bundle.props @@ -0,0 +1,16 @@ + + + Bundle + 1140 + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/Bundle.wxs new file mode 100644 index 00000000..70e84690 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/Bundle.wxs @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/PuPmouBundleTestBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/PuPmouBundleTestBA.wixproj new file mode 100644 index 00000000..30d850d4 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuPmouBundle/PuPmouBundleTestBA.wixproj @@ -0,0 +1,7 @@ + + + TestBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/Bundle.props b/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/Bundle.props new file mode 100644 index 00000000..6d0a58f1 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/Bundle.props @@ -0,0 +1,16 @@ + + + Bundle + 1140 + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/Bundle.wxs new file mode 100644 index 00000000..6c5b6845 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/Bundle.wxs @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/PuPuomBundleTestBA.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/PuPuomBundleTestBA.wixproj new file mode 100644 index 00000000..30d850d4 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuPuomBundle/PuPuomBundleTestBA.wixproj @@ -0,0 +1,7 @@ + + + TestBA + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuomBundlePackage/Bundle.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PuomBundlePackage/Bundle.wxs new file mode 100644 index 00000000..8b585e18 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuomBundlePackage/Bundle.wxs @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuomBundlePackage/PuomBundlePackage.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PuomBundlePackage/PuomBundlePackage.wixproj new file mode 100644 index 00000000..55edd282 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuomBundlePackage/PuomBundlePackage.wixproj @@ -0,0 +1,11 @@ + + + Bundle + + + + + + + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg1/PuomPkg1.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg1/PuomPkg1.wixproj new file mode 100644 index 00000000..20673927 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg1/PuomPkg1.wixproj @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg1/product.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg1/product.wxs new file mode 100644 index 00000000..b136f7dd --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg1/product.wxs @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg2/PuomPkg2.wixproj b/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg2/PuomPkg2.wixproj new file mode 100644 index 00000000..20673927 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg2/PuomPkg2.wixproj @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg2/product.wxs b/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg2/product.wxs new file mode 100644 index 00000000..2c4cb170 --- /dev/null +++ b/src/test/burn/TestData/ConfigurableScopeTests/PuomPkg2/product.wxs @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/burn/WixTestTools/ArpEntryVerifier.cs b/src/test/burn/WixTestTools/ArpEntryVerifier.cs index b3c70337..4e43062a 100644 --- a/src/test/burn/WixTestTools/ArpEntryVerifier.cs +++ b/src/test/burn/WixTestTools/ArpEntryVerifier.cs @@ -8,17 +8,25 @@ namespace WixTestTools { public bool TryGetRegistration(out GenericArpRegistration registration) { - bool success = !this.PerMachine ? GenericArpRegistration.TryGetPerUserRegistrationById(this.ArpId, out registration) - : GenericArpRegistration.TryGetPerMachineRegistrationById(this.ArpId, this.X64, out registration); + var success = this.PerMachine + ? GenericArpRegistration.TryGetPerMachineRegistrationById(this.ArpId, this.X64, this.TestContext.TestOutputHelper, out registration) + : GenericArpRegistration.TryGetPerUserRegistrationById(this.ArpId, this.TestContext.TestOutputHelper, out registration); return success; } public void VerifyRegistered(bool registered) { - bool success = this.TryGetRegistration(out _); + var success = this.TryGetRegistration(out _); - Assert.Equal(registered, success); + if (registered) + { + Assert.True(success); + } + else + { + Assert.False(success); + } } } } diff --git a/src/test/burn/WixTestTools/BundleInstaller.cs b/src/test/burn/WixTestTools/BundleInstaller.cs index 0f2cfa8f..93602661 100644 --- a/src/test/burn/WixTestTools/BundleInstaller.cs +++ b/src/test/burn/WixTestTools/BundleInstaller.cs @@ -189,7 +189,8 @@ namespace WixTestTools /// Path to the generated log file. private string RunBundleWithArguments(int expectedExitCode, MSIExec.MSIExecMode mode, string[] arguments, bool assertOnError = true, string bundlePath = null, string layoutDirectory = null) { - TestTool bundle = new TestTool(bundlePath ?? this.Bundle); + var exePath = bundlePath ?? this.Bundle; + var bundle = new TestTool(exePath); var sb = new StringBuilder(); // Be sure to run silent. @@ -230,6 +231,8 @@ namespace WixTestTools // Set the arguments. bundle.Arguments = sb.ToString(); + this.TestContext.TestOutputHelper.WriteLine($"Launching '{exePath}' with arguments '{bundle.Arguments}'..."); + // Run the tool and assert the expected code. bundle.ExpectedExitCode = expectedExitCode; bundle.AlternateExitCode = this.AlternateExitCode; diff --git a/src/test/burn/WixTestTools/BundleRegistration.cs b/src/test/burn/WixTestTools/BundleRegistration.cs index 524d4616..57581510 100644 --- a/src/test/burn/WixTestTools/BundleRegistration.cs +++ b/src/test/burn/WixTestTools/BundleRegistration.cs @@ -4,6 +4,7 @@ namespace WixTestTools { using System; using Microsoft.Win32; + using Xunit.Abstractions; public class BundleRegistration : GenericArpRegistration { @@ -36,19 +37,19 @@ namespace WixTestTools public string[] UpgradeCodes { get; set; } - public static bool TryGetPerMachineBundleRegistrationById(string id, bool x64, out BundleRegistration registration) + public static bool TryGetPerMachineBundleRegistrationById(string id, bool x64, ITestOutputHelper testOutputHelper, out BundleRegistration registration) { - return TryGetRegistrationById(id, x64, false, out registration); + return TryGetRegistrationById(id, x64, false, testOutputHelper, out registration); } - public static bool TryGetPerUserBundleRegistrationById(string id, out BundleRegistration registration) + public static bool TryGetPerUserBundleRegistrationById(string id, ITestOutputHelper testOutputHelper, out BundleRegistration registration) { - return TryGetRegistrationById(id, true, true, out registration); + return TryGetRegistrationById(id, true, true, testOutputHelper, out registration); } - private static bool TryGetRegistrationById(string id, bool x64, bool perUser, out BundleRegistration registration) + private static bool TryGetRegistrationById(string id, bool x64, bool perUser, ITestOutputHelper testOutputHelper, out BundleRegistration registration) { - registration = GetGenericArpRegistration(id, x64, perUser, key => GetBundleRegistration(key)); + registration = GetGenericArpRegistration(id, x64, perUser, testOutputHelper, key => GetBundleRegistration(key)); return registration != null; } diff --git a/src/test/burn/WixTestTools/BundleVerifier.cs b/src/test/burn/WixTestTools/BundleVerifier.cs index b6181047..7bfba687 100644 --- a/src/test/burn/WixTestTools/BundleVerifier.cs +++ b/src/test/burn/WixTestTools/BundleVerifier.cs @@ -5,8 +5,6 @@ namespace WixTestTools using System; using System.IO; using System.Linq; - using System.Text; - using System.Xml.Linq; using Microsoft.Win32; using WixInternal.TestSupport; using WixToolset.Data; @@ -56,43 +54,64 @@ namespace WixTestTools { var bundleSymbol = this.GetBundleSymbol(); var x64 = bundleSymbol.Platform != Platform.X86; + return x64 ? FULL_BURN_POLICY_REGISTRY_PATH : FULL_BURN_POLICY_REGISTRY_PATH_WOW6432NODE; } - public string GetPackageCachePathForCacheId(string cacheId, bool perMachine) + public string GetPackageCachePathForCacheId(string cacheId, WixBundleScopeType? scope, bool? plannedPerMachine = null) { string cachePath; - if (perMachine) + + if (scope == WixBundleScopeType.PerMachine) { - using var policyKey = Registry.LocalMachine.OpenSubKey(this.GetFullBurnPolicyRegistryPath()); - var redirectedCachePath = policyKey?.GetValue("PackageCache") as string; - cachePath = redirectedCachePath ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), PACKAGE_CACHE_FOLDER_NAME); + cachePath = GetPerMachineCacheRoot(); + } + else if (scope == WixBundleScopeType.PerUser) + { + cachePath = GetPerUserCacheRoot(); } else { - cachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), PACKAGE_CACHE_FOLDER_NAME); + cachePath = plannedPerMachine.Value ? GetPerMachineCacheRoot() : GetPerUserCacheRoot(); } + return Path.Combine(cachePath, cacheId); + + string GetPerMachineCacheRoot() + { + using var policyKey = Registry.LocalMachine.OpenSubKey(this.GetFullBurnPolicyRegistryPath()); + var redirectedCachePath = policyKey?.GetValue("PackageCache") as string; + return redirectedCachePath ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), PACKAGE_CACHE_FOLDER_NAME); + } + + string GetPerUserCacheRoot() + { + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), PACKAGE_CACHE_FOLDER_NAME); + } } - public string GetExpectedCachedBundlePath() + public string GetExpectedCachedBundlePath(bool? plannedPerMachine = null) { var bundleSymbol = this.GetBundleSymbol(); - var cachePath = this.GetPackageCachePathForCacheId(bundleSymbol.BundleCode, bundleSymbol.PerMachine); + var cachePath = this.GetPackageCachePathForCacheId(bundleSymbol.BundleCode, bundleSymbol.Scope, plannedPerMachine); + return Path.Combine(cachePath, Path.GetFileName(this.Bundle)); } - public string ManuallyCache() + public string ManuallyCache(bool? plannedPerMachine = null) { - var expectedCachePath = this.GetExpectedCachedBundlePath(); + var expectedCachePath = this.GetExpectedCachedBundlePath(plannedPerMachine); + Directory.CreateDirectory(Path.GetDirectoryName(expectedCachePath)); File.Copy(this.Bundle, expectedCachePath); + return expectedCachePath; } - public void ManuallyUncache() + public void ManuallyUncache(bool? plannedPerMachine = null) { - var expectedCachePath = this.GetExpectedCachedBundlePath(); + var expectedCachePath = this.GetExpectedCachedBundlePath(plannedPerMachine); + File.Delete(expectedCachePath); } @@ -103,38 +122,51 @@ namespace WixTestTools var section = intermediate.Sections.Single(); var packageSymbol = section.Symbols.OfType().SingleOrDefault(p => p.Id.Id == packageId); var exePackageSymbol = section.Symbols.OfType().SingleOrDefault(p => p.Id.Id == packageId); + if (packageSymbol == null || exePackageSymbol == null || exePackageSymbol.DetectionType != WixBundleExePackageDetectionType.Arp) { + this.TestContext.TestOutputHelper.WriteLine($"Missing config for ExePackage {packageId}"); + arpId = null; arpVersion = null; arpWin64 = false; perMachine = false; + return false; } arpId = exePackageSymbol.ArpId; arpVersion = exePackageSymbol.ArpDisplayVersion; arpWin64 = exePackageSymbol.ArpWin64; - perMachine = packageSymbol.PerMachine == true; + perMachine = packageSymbol.Scope == WixBundleScopeType.PerMachine; + + this.TestContext.TestOutputHelper.WriteLine($"Config for ExePackage {packageId}: arpId={arpId}, arpVersion={arpVersion}, arpWin64={arpWin64}, perMachine={perMachine}"); + return true; } - public bool TryGetRegistration(out BundleRegistration registration) + public bool TryGetRegistration(bool? plannedPerMachine, out BundleRegistration registration) { var bundleSymbol = this.GetBundleSymbol(); var x64 = bundleSymbol.Platform != Platform.X86; var bundleCode = bundleSymbol.BundleCode; - if (bundleSymbol.PerMachine) + + if (bundleSymbol.Scope == WixBundleScopeType.PerMachine) + { + return BundleRegistration.TryGetPerMachineBundleRegistrationById(bundleCode, x64, this.TestContext.TestOutputHelper, out registration); + } + else if (bundleSymbol.Scope == WixBundleScopeType.PerUser) { - return BundleRegistration.TryGetPerMachineBundleRegistrationById(bundleCode, x64, out registration); + return BundleRegistration.TryGetPerUserBundleRegistrationById(bundleCode, this.TestContext.TestOutputHelper, out registration); } else { - return BundleRegistration.TryGetPerUserBundleRegistrationById(bundleCode, out registration); + return plannedPerMachine.Value ? BundleRegistration.TryGetPerMachineBundleRegistrationById(bundleCode, x64, this.TestContext.TestOutputHelper, out registration) + : BundleRegistration.TryGetPerUserBundleRegistrationById(bundleCode, this.TestContext.TestOutputHelper, out registration); } } - public bool TryGetUpdateRegistration(out BundleUpdateRegistration registration) + public bool TryGetUpdateRegistration(bool? plannedPerMachine, out BundleUpdateRegistration registration) { var bundleSymbol = this.GetBundleSymbol(); var x64 = bundleSymbol.Platform != Platform.X86; @@ -144,84 +176,93 @@ namespace WixTestTools var productFamily = updateRegistrationSymbol.ProductFamily; var name = updateRegistrationSymbol.Name; - - if (bundleSymbol.PerMachine) + if (bundleSymbol.Scope == WixBundleScopeType.PerMachine) { return BundleUpdateRegistration.TryGetPerMachineBundleUpdateRegistration(manufacturer, productFamily, name, x64, out registration); } - else + else if (bundleSymbol.Scope == WixBundleScopeType.PerUser) { return BundleUpdateRegistration.TryGetPerUserBundleUpdateRegistration(manufacturer, productFamily, name, out registration); } + else + { + return plannedPerMachine.Value ? BundleUpdateRegistration.TryGetPerMachineBundleUpdateRegistration(manufacturer, productFamily, name, x64, out registration) + : BundleUpdateRegistration.TryGetPerUserBundleUpdateRegistration(manufacturer, productFamily, name, out registration); + } } - public BundleRegistration VerifyRegisteredAndInPackageCache(int? expectedSystemComponent = null) + public BundleRegistration VerifyRegisteredAndInPackageCache(int? expectedSystemComponent = null, bool? plannedPerMachine = null) { - Assert.True(this.TryGetRegistration(out var registration)); + Assert.True(this.TryGetRegistration(plannedPerMachine, out var registration)); Assert.Equal(expectedSystemComponent, registration.SystemComponent); Assert.NotNull(registration.CachePath); Assert.True(File.Exists(registration.CachePath)); - var expectedCachePath = this.GetExpectedCachedBundlePath(); + var expectedCachePath = this.GetExpectedCachedBundlePath(plannedPerMachine); WixAssert.StringEqual(expectedCachePath, registration.CachePath, true); return registration; } - public void VerifyUnregisteredAndRemovedFromPackageCache() + public void VerifyUnregisteredAndRemovedFromPackageCache(bool? plannedPerMachine = null) { - var cachedBundlePath = this.GetExpectedCachedBundlePath(); - this.VerifyUnregisteredAndRemovedFromPackageCache(cachedBundlePath); + var cachedBundlePath = this.GetExpectedCachedBundlePath(plannedPerMachine); + + this.VerifyUnregisteredAndRemovedFromPackageCache(cachedBundlePath, plannedPerMachine); } - public void VerifyUnregisteredAndRemovedFromPackageCache(string cachedBundlePath) + public void VerifyUnregisteredAndRemovedFromPackageCache(string cachedBundlePath, bool? plannedPerMachine = null) { - Assert.False(this.TryGetRegistration(out _), $"Bundle cached at '{cachedBundlePath}' should not still be registered."); + Assert.False(this.TryGetRegistration(plannedPerMachine, out _), $"Bundle cached at '{cachedBundlePath}' should not still be registered."); Assert.False(File.Exists(cachedBundlePath), $"Cached bundle should have been removed from package cache at '{cachedBundlePath}'."); } - public void RemovePackageFromCache(string packageId) + public void RemovePackageFromCache(string packageId, bool? plannedPerMachine = null) { using var wixOutput = WixOutput.Read(this.BundlePdb); var intermediate = Intermediate.Load(wixOutput); var section = intermediate.Sections.Single(); var packageSymbol = section.Symbols.OfType().Single(p => p.Id.Id == packageId); - var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId, packageSymbol.PerMachine == true); + var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId, packageSymbol.Scope, plannedPerMachine); + if (Directory.Exists(cachePath)) { Directory.Delete(cachePath, true); } } - public string GetPackageEntryPointCachePath(string packageId) + public string GetPackageEntryPointCachePath(string packageId, bool? plannedPerMachine = null) { using var wixOutput = WixOutput.Read(this.BundlePdb); var intermediate = Intermediate.Load(wixOutput); var section = intermediate.Sections.Single(); var packageSymbol = section.Symbols.OfType().Single(p => p.Id.Id == packageId); var packagePayloadSymbol = section.Symbols.OfType().Single(p => p.Id.Id == packageSymbol.PayloadRef); - var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId, packageSymbol.PerMachine == true); + var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId, packageSymbol.Scope, plannedPerMachine); + return Path.Combine(cachePath, packagePayloadSymbol.Name); } - public void VerifyPackageIsCached(string packageId, bool cached = true) + public void VerifyPackageIsCached(string packageId, bool cached = true, bool? plannedPerMachine = null) { - var entryPointCachePath = this.GetPackageEntryPointCachePath(packageId); + var entryPointCachePath = this.GetPackageEntryPointCachePath(packageId, plannedPerMachine); + Assert.Equal(cached, File.Exists(entryPointCachePath)); } - public void VerifyPackageProviderRemoved(string packageId) + public void VerifyPackageProviderRemoved(string packageId, bool? plannedPerMachine = null) { using var wixOutput = WixOutput.Read(this.BundlePdb); var intermediate = Intermediate.Load(wixOutput); var section = intermediate.Sections.Single(); var packageSymbol = section.Symbols.OfType().Single(p => p.Id.Id == packageId); var providerSymbol = section.Symbols.OfType().Single(p => p.ParentRef == packageId); - var registryRoot = packageSymbol.PerMachine == true ? Registry.LocalMachine : Registry.CurrentUser; + var registryRoot = plannedPerMachine.HasValue ? (plannedPerMachine.Value ? Registry.LocalMachine : Registry.CurrentUser) : packageSymbol.Scope == WixBundleScopeType.PerMachine ? Registry.LocalMachine : Registry.CurrentUser; var subkeyPath = Path.Combine(DependencyRegistryRoot, providerSymbol.ProviderKey); using var registryKey = registryRoot.OpenSubKey(subkeyPath); + if (registryKey != null) { WixAssert.StringEqual(null, subkeyPath); diff --git a/src/test/burn/WixTestTools/GenericArpRegistration.cs b/src/test/burn/WixTestTools/GenericArpRegistration.cs index dfddd9a3..f3590fa4 100644 --- a/src/test/burn/WixTestTools/GenericArpRegistration.cs +++ b/src/test/burn/WixTestTools/GenericArpRegistration.cs @@ -4,6 +4,8 @@ namespace WixTestTools { using System; using Microsoft.Win32; + using Xunit; + using Xunit.Abstractions; public class GenericArpRegistration { @@ -69,23 +71,23 @@ namespace WixTestTools public string UrlUpdateInfo { get; set; } - public static bool TryGetPerMachineRegistrationById(string id, bool x64, out GenericArpRegistration registration) + public static bool TryGetPerMachineRegistrationById(string id, bool x64, ITestOutputHelper testOutputHelper, out GenericArpRegistration registration) { - return TryGetRegistrationById(id, x64, false, out registration); + return TryGetRegistrationById(id, x64, perUser: false, testOutputHelper, out registration); } - public static bool TryGetPerUserRegistrationById(string id, out GenericArpRegistration registration) + public static bool TryGetPerUserRegistrationById(string id, ITestOutputHelper testOutputHelper, out GenericArpRegistration registration) { - return TryGetRegistrationById(id, true, true, out registration); + return TryGetRegistrationById(id, x64: true, perUser: true, testOutputHelper, out registration); } - private static bool TryGetRegistrationById(string id, bool x64, bool perUser, out GenericArpRegistration registration) + private static bool TryGetRegistrationById(string id, bool x64, bool perUser, ITestOutputHelper testOutputHelper, out GenericArpRegistration registration) { - registration = GetGenericArpRegistration(id, x64, perUser, key => new GenericArpRegistration()); + registration = GetGenericArpRegistration(id, x64, perUser, testOutputHelper, key => new GenericArpRegistration()); return registration != null; } - protected static T GetGenericArpRegistration(string id, bool x64, bool perUser, Func fnCreate) + protected static T GetGenericArpRegistration(string id, bool x64, bool perUser, ITestOutputHelper testOutputHelper, Func fnCreate) where T : GenericArpRegistration { var baseKey = perUser ? Registry.CurrentUser : Registry.LocalMachine; @@ -95,6 +97,8 @@ namespace WixTestTools if (idKey == null) { + testOutputHelper.WriteLine($"Failed to open key {baseKey} {registrationKeyPath} (per-user {perUser})."); + return null; } diff --git a/src/test/burn/WixTestTools/PackageVerifier.cs b/src/test/burn/WixTestTools/PackageVerifier.cs index 76bc17ab..f7c7b2e6 100644 --- a/src/test/burn/WixTestTools/PackageVerifier.cs +++ b/src/test/burn/WixTestTools/PackageVerifier.cs @@ -82,14 +82,32 @@ namespace WixTestTools return MsiUtilities.IsProductInstalledWithVersion(productCode, prodVersion); } - public void VerifyInstalled(bool installed) + public void VerifyInstalled(bool installed = true) { - Assert.Equal(installed, this.IsInstalled()); + var isInstalled = this.IsInstalled(); + + if (installed) + { + Assert.True(isInstalled); + } + else + { + Assert.False(isInstalled); + } } - public void VerifyInstalledWithVersion(bool installed) + public void VerifyInstalledWithVersion(bool installed = true) { - Assert.Equal(installed, this.IsInstalledWithVersion()); + var isInstalled = this.IsInstalledWithVersion(); + + if (installed) + { + Assert.True(isInstalled); + } + else + { + Assert.False(isInstalled); + } } public void DeleteTestRegistryValue(string name) diff --git a/src/test/burn/WixTestTools/TestTool.cs b/src/test/burn/WixTestTools/TestTool.cs index b6d18ac9..6c9ad1d7 100644 --- a/src/test/burn/WixTestTools/TestTool.cs +++ b/src/test/burn/WixTestTools/TestTool.cs @@ -26,7 +26,7 @@ namespace WixTestTools public TestTool(string toolFile) : base(toolFile) { - this.PrintOutputToConsole = true; + this.PrintOutputToConsoleOnError = true; } /// @@ -74,6 +74,11 @@ namespace WixTestTools /// public bool PrintOutputToConsole { get; set; } + /// + /// Print output from the tool execution to the console + /// + public bool PrintOutputToConsoleOnError { get; set; } + /// /// The working directory of the tool /// @@ -123,7 +128,12 @@ namespace WixTestTools if (assertOnError && 0 < this.Errors.Count) { - if (this.PrintOutputToConsole) + if (this.PrintOutputToConsoleOnError) + { + Console.WriteLine(FormatResult(result)); + } + + if (this.PrintOutputToConsole || this.PrintOutputToConsoleOnError) { this.PrintErrors(); } diff --git a/src/test/burn/WixTestTools/WixTestContext.cs b/src/test/burn/WixTestTools/WixTestContext.cs index a87a56fa..b30d5739 100644 --- a/src/test/burn/WixTestTools/WixTestContext.cs +++ b/src/test/burn/WixTestTools/WixTestContext.cs @@ -16,6 +16,8 @@ namespace WixTestTools public WixTestContext(ITestOutputHelper testOutputHelper) { + this.TestOutputHelper = testOutputHelper; + var test = GetTest(testOutputHelper); var splitClassName = test.TestCase.TestMethod.TestClass.Class.Name.Split('.'); @@ -34,6 +36,8 @@ namespace WixTestTools public string TestName { get; } + public ITestOutputHelper TestOutputHelper { get; } + /// /// Gets the test install directory for the current test. /// diff --git a/src/test/burn/WixToolset.WixBA/WixBA.cs b/src/test/burn/WixToolset.WixBA/WixBA.cs index dca12ce8..a98bfa36 100644 --- a/src/test/burn/WixToolset.WixBA/WixBA.cs +++ b/src/test/burn/WixToolset.WixBA/WixBA.cs @@ -104,7 +104,7 @@ namespace WixToolset.WixBA public static void Plan(LaunchAction action) { WixBA.Model.PlannedAction = action; - WixBA.Model.Engine.Plan(WixBA.Model.PlannedAction); + WixBA.Model.Engine.Plan(WixBA.Model.PlannedAction, BundleScope.Default); } public static void PlanLayout() diff --git a/src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs index dc793cf0..b066899b 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs @@ -92,7 +92,7 @@ namespace WixToolsetTest.BurnE2E Assert.True(LogVerifier.MessageInLogFile(logPath, "Applied execute package: v3bundle.exe, result: 0x0, restart: None")); - Assert.True(BundleRegistration.TryGetPerMachineBundleRegistrationById(v3BundleId, false, out var v3Registration)); + Assert.True(BundleRegistration.TryGetPerMachineBundleRegistrationById(v3BundleId, false, this.TestContext.TestOutputHelper, out var v3Registration)); Assert.Null(v3Registration.SystemComponent); } diff --git a/src/test/burn/WixToolsetTest.BurnE2E/ConfigurableScopeTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/ConfigurableScopeTests.cs new file mode 100644 index 00000000..1b7d6d75 --- /dev/null +++ b/src/test/burn/WixToolsetTest.BurnE2E/ConfigurableScopeTests.cs @@ -0,0 +1,631 @@ +// 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. + +namespace WixToolsetTest.BurnE2E +{ + using WixTestTools; + using WixToolset.BootstrapperApplicationApi; + using Xunit; + using Xunit.Abstractions; + + public class ConfigurableScopeTests : BurnE2ETests + { + public ConfigurableScopeTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } + + [RuntimeFact] + public void CommandLineScopeTestNoopBecauseNonDefaultPlan() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerMachine); + + var bundle = this.CreateBundleInstaller("AllPmouBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(arguments: "/peruser"); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Scope command-line switch ignored because the bootstrapper application already specified a scope.")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void CommandLineScopeTestNoopBecauseNoConfigurablePackages() + { + var bundle = this.CreateBundleInstaller("PerMachineBundle"); + var log = bundle.Install(arguments: "/peruser"); + + Assert.True(LogVerifier.MessageInLogFile(log, "Scope command-line switch ignored because the bundle doesn't have any packages with configurable scope.")); + } + + [RuntimeFact] + public void CommandLineScopeTestPerUser() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.Default); + + var bundle = this.CreateBundleInstaller("AllPmouBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(arguments: "/peruser"); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 3 packages, action: Install, planned scope: Default")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + + bundle.Uninstall(arguments: "/peruser"); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void CommandLineScopeTestPerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.Default); + + var bundle = this.CreateBundleInstaller("AllPuomBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(arguments: "/permachine"); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 3 packages, action: Install, planned scope: Default")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + + bundle.Uninstall(arguments: "/permachine"); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PMOU_Bundle_Default_Plan_Installs_PerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.Default); + + var bundle = this.CreateBundleInstaller("AllPmouBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 3 packages, action: Install, planned scope: Default")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PUOM_Bundle_Default_Plan_Installs_PerUser() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.Default); + + var bundle = this.CreateBundleInstaller("AllPuomBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 3 packages, action: Install, planned scope: Default")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PMOU_Bundle_PM_Plan_Installs_PerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerMachine); + + var bundle = this.CreateBundleInstaller("AllPmouBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 3 packages, action: Install, planned scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PUOM_Bundle_PM_Plan_Installs_PerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerMachine); + + var bundle = this.CreateBundleInstaller("AllPuomBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 3 packages, action: Install, planned scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PMOU_Bundle_PU_Plan_Installs_PerUser() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerUser); + + var bundle = this.CreateBundleInstaller("AllPmouBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 3 packages, action: Install, planned scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser,")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PUOM_Bundle_PU_Plan_Installs_PerUser() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerUser); + + var bundle = this.CreateBundleInstaller("AllPuomBundleTestBA"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 3 packages, action: Install, planned scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PMOU_Bundle_Default_Plan_Installs_PerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.Default); + + var bundle = this.CreateBundleInstaller("PmPmouBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 4 packages, action: Install, planned scope: Default")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PMOU_Bundle_PM_Plan_Installs_PerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerMachine); + + var bundle = this.CreateBundleInstaller("PmPmouBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 4 packages, action: Install, planned scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PMOU_Bundle_PU_Plan_Installs_PerUserMostly() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerUser); + + var bundle = this.CreateBundleInstaller("PmPmouBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 4 packages, action: Install, planned scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser,")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PUOM_Bundle_Default_Plan_Installs_PerUser() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.Default); + + var bundle = this.CreateBundleInstaller("PmPuomBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 4 packages, action: Install, planned scope: Default")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PUOM_Bundle_PM_Plan_Installs_PerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerMachine); + + var bundle = this.CreateBundleInstaller("PmPuomBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 4 packages, action: Install, planned scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PUOM_Bundle_PU_Plan_Installs_PerUserMostly() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerUser); + + var bundle = this.CreateBundleInstaller("PmPuomBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 4 packages, action: Install, planned scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned configurable scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PU_PMOU_Bundle_Default_Plan_Installs_PerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.Default); + + var bundle = this.CreateBundleInstaller("PmPuPmouBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 5 packages, action: Install, planned scope: Default")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerUserPkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PU_PMOU_Bundle_PM_Plan_Installs_PerMachine() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerMachine); + + var bundle = this.CreateBundleInstaller("PmPuPmouBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var perUserPkg = this.CreatePackageInstaller("PerUserPkg"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(); + perUserPkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 5 packages, action: Install, planned scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerUserPkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(false); + perUserPkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PU_PMOU_Bundle_PU_Plan_Installs_PerUserMostly() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerUser); + + var bundle = this.CreateBundleInstaller("PmPuPmouBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var perUserPkg = this.CreatePackageInstaller("PerUserPkg"); + var pkg1 = this.CreatePackageInstaller("PmouPkg1"); + var pkg2 = this.CreatePackageInstaller("PmouPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(); + perUserPkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 5 packages, action: Install, planned scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerUserPkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser,")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PmouPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser,")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(false); + perUserPkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PU_PUOM_Bundle_Default_Plan_Installs_PerUser() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.Default); + + var bundle = this.CreateBundleInstaller("PmPuPuomBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var perUserPkg = this.CreatePackageInstaller("PerUserPkg"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(); + perUserPkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 5 packages, action: Install, planned scope: Default")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerUserPkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(false); + perUserPkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PU_PUOM_Bundle_PM_Plan_Installs_PerMachineMostly() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerMachine); + + var bundle = this.CreateBundleInstaller("PmPuPuomBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var perUserPkg = this.CreatePackageInstaller("PerUserPkg"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(); + perUserPkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 5 packages, action: Install, planned scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerUserPkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: true); + perMachinePkg.VerifyInstalled(false); + perUserPkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + [RuntimeFact] + public void PM_PU_PUOM_Bundle_PU_Plan_Installs_PerUserMostly() + { + var testBAController = this.CreateTestBAController(); + testBAController.SetBundleScope(BundleScope.PerUser); + + var bundle = this.CreateBundleInstaller("PmPuPuomBundleTestBA"); + var perMachinePkg = this.CreatePackageInstaller("PerMachinePkg"); + var perUserPkg = this.CreatePackageInstaller("PerUserPkg"); + var pkg1 = this.CreatePackageInstaller("PuomPkg1"); + var pkg2 = this.CreatePackageInstaller("PuomPkg2"); + var log = bundle.Install(); + + bundle.VerifyRegisteredAndInPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(); + perUserPkg.VerifyInstalled(); + pkg1.VerifyInstalled(); + pkg2.VerifyInstalled(); + + Assert.True(LogVerifier.MessageInLogFile(log, "Plan begin, 5 packages, action: Install, planned scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerMachinePkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerMachine")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PerUserPkg.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg1.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + Assert.True(LogVerifier.MessageInLogFile(log, "Planned package: PuomPkg2.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, scope: PerUser")); + + bundle.Uninstall(); + bundle.VerifyUnregisteredAndRemovedFromPackageCache(plannedPerMachine: false); + perMachinePkg.VerifyInstalled(false); + perUserPkg.VerifyInstalled(false); + pkg1.VerifyInstalled(false); + pkg2.VerifyInstalled(false); + } + + + } +} diff --git a/src/test/burn/WixToolsetTest.BurnE2E/OptionalUpdateRegistrationTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/OptionalUpdateRegistrationTests.cs index 3731b0cc..3e848fbd 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/OptionalUpdateRegistrationTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/OptionalUpdateRegistrationTests.cs @@ -20,11 +20,11 @@ namespace WixToolsetTest.BurnE2E bundleAv1.Install(); bundleAv1.VerifyRegisteredAndInPackageCache(); - var gotV1Registration = bundleAv1.TryGetUpdateRegistration(out var v1Registration); + var gotV1Registration = bundleAv1.TryGetUpdateRegistration(plannedPerMachine: null, out var v1Registration); bundleAv2.Install(); bundleAv2.VerifyRegisteredAndInPackageCache(); - var gotV2Registration = bundleAv2.TryGetUpdateRegistration(out var v2Registration); + var gotV2Registration = bundleAv2.TryGetUpdateRegistration(plannedPerMachine: null, out var v2Registration); bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache(); diff --git a/src/test/burn/WixToolsetTest.BurnE2E/Utilities/TestBAController.cs b/src/test/burn/WixToolsetTest.BurnE2E/Utilities/TestBAController.cs index c344ebce..872e6954 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/Utilities/TestBAController.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/Utilities/TestBAController.cs @@ -72,6 +72,11 @@ namespace WixToolsetTest.BurnE2E this.SetBurnTestValue("ForceUpdateSource", url); } + public void SetBundleScope(BundleScope scope) + { + this.SetBurnTestValue("BundleScope", scope.ToString()); + } + /// /// Slows the cache progress of a package. /// diff --git a/src/test/burn/WixToolsetTest.BurnE2E/runtests.cmd b/src/test/burn/WixToolsetTest.BurnE2E/runtests.cmd index ecea18a0..f6950fb0 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/runtests.cmd +++ b/src/test/burn/WixToolsetTest.BurnE2E/runtests.cmd @@ -1,2 +1,4 @@ SET RuntimeTestsEnabled=true -dotnet test WixToolsetTest.BurnE2E.dll -v normal --logger trx +dotnet test WixToolsetTest.BurnE2E.dll -v normal --logger trx;LogFileName=%TMP%\SandboxTests.trx + +ROBOCOPY /NFL /NDL /S /PURGE %TMP% C:\Build\SandboxLogs *.log *.trx diff --git a/src/test/sandbox/TestSandbox.wsb b/src/test/sandbox/TestSandbox.wsb index 97c3c759..1af3f5f9 100644 --- a/src/test/sandbox/TestSandbox.wsb +++ b/src/test/sandbox/TestSandbox.wsb @@ -1,22 +1,21 @@ + Enable + ..\..\..\build C:\build - true - - - ..\..\..\build\logs - C:\logs false - + + .\ C:\sandbox true - - C:\sandbox\startup.bat - + + + C:\sandbox\startup.bat + -- cgit v1.2.3-55-g6feb