From 974381355441c3d95d62af85bdd05f3c0e368eb5 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Wed, 17 Feb 2021 16:07:18 -0600 Subject: Port the slipstream tests from the old repo. --- .../SlipstreamTests/BundleA/BundleA.wixproj | 19 ++ src/TestData/SlipstreamTests/BundleA/BundleA.wxs | 12 + .../BundleAReverse/BundleAReverse.wixproj | 19 ++ .../BundleAReverse/BundleAReverse.wxs | 12 + .../SlipstreamTests/BundleB/BundleB.wixproj | 20 ++ src/TestData/SlipstreamTests/BundleB/BundleB.wxs | 13 + .../SlipstreamTests/BundleC/BundleC.wixproj | 21 ++ src/TestData/SlipstreamTests/BundleC/BundleC.wxs | 14 + .../BundleOnlyA/BundleOnlyA.wixproj | 18 ++ .../SlipstreamTests/BundleOnlyA/BundleOnlyA.wxs | 9 + .../BundleOnlyPatchA/BundleOnlyPatchA.wixproj | 18 ++ .../BundleOnlyPatchA/BundleOnlyPatchA.wxs | 9 + .../PackageAv0_9_0/PackageAv0_9_0.wixproj | 10 + .../SlipstreamTests/PackageAv1/PackageA.props | 11 + .../SlipstreamTests/PackageAv1/PackageAv1.props | 7 + .../SlipstreamTests/PackageAv1/PackageAv1.wixproj | 4 + .../PackageAv1/ProductComponents.wxs | 15 + .../PackageAv1_0_1/PackageAv1_0_1.wixproj | 10 + .../SlipstreamTests/PackageBv1/PackageB.props | 12 + .../SlipstreamTests/PackageBv1/PackageBv1.wixproj | 4 + .../PackageBv1/ProductComponents.wxs | 15 + .../PackageBv1_0_1/PackageBv1_0_1.wixproj | 10 + src/TestData/SlipstreamTests/PatchA/PatchA.wixproj | 12 + src/TestData/SlipstreamTests/PatchA/PatchA.wxs | 22 ++ .../SlipstreamTests/PatchAB/PatchAB.wixproj | 14 + src/TestData/SlipstreamTests/PatchAB/PatchAB.wxs | 27 ++ .../SlipstreamTests/PatchAB2/PatchAB2.wixproj | 14 + src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wxs | 26 ++ src/WixTestTools/PackageVerifier.cs | 9 + src/WixToolsetTest.BurnE2E/SlipstreamTests.cs | 330 +++++++++++++++++++++ 30 files changed, 736 insertions(+) create mode 100644 src/TestData/SlipstreamTests/BundleA/BundleA.wixproj create mode 100644 src/TestData/SlipstreamTests/BundleA/BundleA.wxs create mode 100644 src/TestData/SlipstreamTests/BundleAReverse/BundleAReverse.wixproj create mode 100644 src/TestData/SlipstreamTests/BundleAReverse/BundleAReverse.wxs create mode 100644 src/TestData/SlipstreamTests/BundleB/BundleB.wixproj create mode 100644 src/TestData/SlipstreamTests/BundleB/BundleB.wxs create mode 100644 src/TestData/SlipstreamTests/BundleC/BundleC.wixproj create mode 100644 src/TestData/SlipstreamTests/BundleC/BundleC.wxs create mode 100644 src/TestData/SlipstreamTests/BundleOnlyA/BundleOnlyA.wixproj create mode 100644 src/TestData/SlipstreamTests/BundleOnlyA/BundleOnlyA.wxs create mode 100644 src/TestData/SlipstreamTests/BundleOnlyPatchA/BundleOnlyPatchA.wixproj create mode 100644 src/TestData/SlipstreamTests/BundleOnlyPatchA/BundleOnlyPatchA.wxs create mode 100644 src/TestData/SlipstreamTests/PackageAv0_9_0/PackageAv0_9_0.wixproj create mode 100644 src/TestData/SlipstreamTests/PackageAv1/PackageA.props create mode 100644 src/TestData/SlipstreamTests/PackageAv1/PackageAv1.props create mode 100644 src/TestData/SlipstreamTests/PackageAv1/PackageAv1.wixproj create mode 100644 src/TestData/SlipstreamTests/PackageAv1/ProductComponents.wxs create mode 100644 src/TestData/SlipstreamTests/PackageAv1_0_1/PackageAv1_0_1.wixproj create mode 100644 src/TestData/SlipstreamTests/PackageBv1/PackageB.props create mode 100644 src/TestData/SlipstreamTests/PackageBv1/PackageBv1.wixproj create mode 100644 src/TestData/SlipstreamTests/PackageBv1/ProductComponents.wxs create mode 100644 src/TestData/SlipstreamTests/PackageBv1_0_1/PackageBv1_0_1.wixproj create mode 100644 src/TestData/SlipstreamTests/PatchA/PatchA.wixproj create mode 100644 src/TestData/SlipstreamTests/PatchA/PatchA.wxs create mode 100644 src/TestData/SlipstreamTests/PatchAB/PatchAB.wixproj create mode 100644 src/TestData/SlipstreamTests/PatchAB/PatchAB.wxs create mode 100644 src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wixproj create mode 100644 src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wxs create mode 100644 src/WixToolsetTest.BurnE2E/SlipstreamTests.cs (limited to 'src') diff --git a/src/TestData/SlipstreamTests/BundleA/BundleA.wixproj b/src/TestData/SlipstreamTests/BundleA/BundleA.wixproj new file mode 100644 index 00000000..926f46df --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleA/BundleA.wixproj @@ -0,0 +1,19 @@ + + + + Bundle + {62C28DAF-A13E-4F55-ACA1-FB843630789C} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/BundleA/BundleA.wxs b/src/TestData/SlipstreamTests/BundleA/BundleA.wxs new file mode 100644 index 00000000..17dc6c05 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleA/BundleA.wxs @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/BundleAReverse/BundleAReverse.wixproj b/src/TestData/SlipstreamTests/BundleAReverse/BundleAReverse.wixproj new file mode 100644 index 00000000..662defd3 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleAReverse/BundleAReverse.wixproj @@ -0,0 +1,19 @@ + + + + Bundle + {F6BB4AE2-F7D4-4768-8314-3AF694C400E9} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/BundleAReverse/BundleAReverse.wxs b/src/TestData/SlipstreamTests/BundleAReverse/BundleAReverse.wxs new file mode 100644 index 00000000..3de10a91 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleAReverse/BundleAReverse.wxs @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/BundleB/BundleB.wixproj b/src/TestData/SlipstreamTests/BundleB/BundleB.wixproj new file mode 100644 index 00000000..e2ca2e78 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleB/BundleB.wixproj @@ -0,0 +1,20 @@ + + + + Bundle + {604878DE-F0EB-4FE1-B11E-DC19F07F82F5} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/BundleB/BundleB.wxs b/src/TestData/SlipstreamTests/BundleB/BundleB.wxs new file mode 100644 index 00000000..90ddd258 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleB/BundleB.wxs @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/BundleC/BundleC.wixproj b/src/TestData/SlipstreamTests/BundleC/BundleC.wixproj new file mode 100644 index 00000000..f3fee0c1 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleC/BundleC.wixproj @@ -0,0 +1,21 @@ + + + + Bundle + {16B551B5-6EBE-417F-8CB2-50936F079301} + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/BundleC/BundleC.wxs b/src/TestData/SlipstreamTests/BundleC/BundleC.wxs new file mode 100644 index 00000000..4702d845 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleC/BundleC.wxs @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/BundleOnlyA/BundleOnlyA.wixproj b/src/TestData/SlipstreamTests/BundleOnlyA/BundleOnlyA.wixproj new file mode 100644 index 00000000..acb12a3a --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleOnlyA/BundleOnlyA.wixproj @@ -0,0 +1,18 @@ + + + + Bundle + {80A9925A-2EC1-4BD5-BB69-2553BF7FCED9} + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/BundleOnlyA/BundleOnlyA.wxs b/src/TestData/SlipstreamTests/BundleOnlyA/BundleOnlyA.wxs new file mode 100644 index 00000000..59fdd0c9 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleOnlyA/BundleOnlyA.wxs @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/BundleOnlyPatchA/BundleOnlyPatchA.wixproj b/src/TestData/SlipstreamTests/BundleOnlyPatchA/BundleOnlyPatchA.wixproj new file mode 100644 index 00000000..72d48b74 --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleOnlyPatchA/BundleOnlyPatchA.wixproj @@ -0,0 +1,18 @@ + + + + Bundle + {9B026C22-924C-4CEA-8726-FD07C1706A9F} + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/BundleOnlyPatchA/BundleOnlyPatchA.wxs b/src/TestData/SlipstreamTests/BundleOnlyPatchA/BundleOnlyPatchA.wxs new file mode 100644 index 00000000..27fed68e --- /dev/null +++ b/src/TestData/SlipstreamTests/BundleOnlyPatchA/BundleOnlyPatchA.wxs @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/PackageAv0_9_0/PackageAv0_9_0.wixproj b/src/TestData/SlipstreamTests/PackageAv0_9_0/PackageAv0_9_0.wixproj new file mode 100644 index 00000000..50aa6ec6 --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageAv0_9_0/PackageAv0_9_0.wixproj @@ -0,0 +1,10 @@ + + + + + 0.9.0.0 + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PackageAv1/PackageA.props b/src/TestData/SlipstreamTests/PackageAv1/PackageA.props new file mode 100644 index 00000000..734e0d6d --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageAv1/PackageA.props @@ -0,0 +1,11 @@ + + + + PackageA + true + {DB87BB66-FE5D-4293-81AC-EE313D3F864B} + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PackageAv1/PackageAv1.props b/src/TestData/SlipstreamTests/PackageAv1/PackageAv1.props new file mode 100644 index 00000000..2936f349 --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageAv1/PackageAv1.props @@ -0,0 +1,7 @@ + + + + + {5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B} + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PackageAv1/PackageAv1.wixproj b/src/TestData/SlipstreamTests/PackageAv1/PackageAv1.wixproj new file mode 100644 index 00000000..e85be384 --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageAv1/PackageAv1.wixproj @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PackageAv1/ProductComponents.wxs b/src/TestData/SlipstreamTests/PackageAv1/ProductComponents.wxs new file mode 100644 index 00000000..72b5d4bd --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageAv1/ProductComponents.wxs @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/PackageAv1_0_1/PackageAv1_0_1.wixproj b/src/TestData/SlipstreamTests/PackageAv1_0_1/PackageAv1_0_1.wixproj new file mode 100644 index 00000000..dbce9cfe --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageAv1_0_1/PackageAv1_0_1.wixproj @@ -0,0 +1,10 @@ + + + + + 1.0.1.0 + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PackageBv1/PackageB.props b/src/TestData/SlipstreamTests/PackageBv1/PackageB.props new file mode 100644 index 00000000..920088fb --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageBv1/PackageB.props @@ -0,0 +1,12 @@ + + + + PackageB + true + {83B1ADF3-A8DD-41D3-9114-57703DA17754} + {552F8D3B-99E1-4772-8E8C-CC47E5ED5F71} + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PackageBv1/PackageBv1.wixproj b/src/TestData/SlipstreamTests/PackageBv1/PackageBv1.wixproj new file mode 100644 index 00000000..7b6f83a3 --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageBv1/PackageBv1.wixproj @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PackageBv1/ProductComponents.wxs b/src/TestData/SlipstreamTests/PackageBv1/ProductComponents.wxs new file mode 100644 index 00000000..72b5d4bd --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageBv1/ProductComponents.wxs @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/PackageBv1_0_1/PackageBv1_0_1.wixproj b/src/TestData/SlipstreamTests/PackageBv1_0_1/PackageBv1_0_1.wixproj new file mode 100644 index 00000000..3ec790ad --- /dev/null +++ b/src/TestData/SlipstreamTests/PackageBv1_0_1/PackageBv1_0_1.wixproj @@ -0,0 +1,10 @@ + + + + + 1.0.1.0 + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PatchA/PatchA.wixproj b/src/TestData/SlipstreamTests/PatchA/PatchA.wixproj new file mode 100644 index 00000000..da9acb5e --- /dev/null +++ b/src/TestData/SlipstreamTests/PatchA/PatchA.wixproj @@ -0,0 +1,12 @@ + + + + PatchCreation + .msp + 1079 + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PatchA/PatchA.wxs b/src/TestData/SlipstreamTests/PatchA/PatchA.wxs new file mode 100644 index 00000000..7c3818b0 --- /dev/null +++ b/src/TestData/SlipstreamTests/PatchA/PatchA.wxs @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/PatchAB/PatchAB.wixproj b/src/TestData/SlipstreamTests/PatchAB/PatchAB.wixproj new file mode 100644 index 00000000..81fa9e12 --- /dev/null +++ b/src/TestData/SlipstreamTests/PatchAB/PatchAB.wixproj @@ -0,0 +1,14 @@ + + + + PatchCreation + .msp + 1079 + + + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PatchAB/PatchAB.wxs b/src/TestData/SlipstreamTests/PatchAB/PatchAB.wxs new file mode 100644 index 00000000..f700f35c --- /dev/null +++ b/src/TestData/SlipstreamTests/PatchAB/PatchAB.wxs @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wixproj b/src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wixproj new file mode 100644 index 00000000..81fa9e12 --- /dev/null +++ b/src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wixproj @@ -0,0 +1,14 @@ + + + + PatchCreation + .msp + 1079 + + + + + + + + \ No newline at end of file diff --git a/src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wxs b/src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wxs new file mode 100644 index 00000000..ebd5bed0 --- /dev/null +++ b/src/TestData/SlipstreamTests/PatchAB2/PatchAB2.wxs @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/WixTestTools/PackageVerifier.cs b/src/WixTestTools/PackageVerifier.cs index 77946c91..b4289032 100644 --- a/src/WixTestTools/PackageVerifier.cs +++ b/src/WixTestTools/PackageVerifier.cs @@ -58,6 +58,15 @@ namespace WixTestTools Assert.Equal(installed, MsiUtilities.IsProductInstalled(productCode)); } + public void DeleteTestRegistryValue(string name) + { + using (var root = this.TestContext.GetTestRegistryRoot()) + { + Assert.NotNull(root); + root.DeleteValue(name); + } + } + public void VerifyTestRegistryRootDeleted() { using var testRegistryRoot = this.TestContext.GetTestRegistryRoot(); diff --git a/src/WixToolsetTest.BurnE2E/SlipstreamTests.cs b/src/WixToolsetTest.BurnE2E/SlipstreamTests.cs new file mode 100644 index 00000000..9d53f999 --- /dev/null +++ b/src/WixToolsetTest.BurnE2E/SlipstreamTests.cs @@ -0,0 +1,330 @@ +// 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 System; + using System.IO; + using WixTestTools; + using WixToolset.Mba.Core; + using Xunit; + using Xunit.Abstractions; + + public class SlipstreamTests : BurnE2ETests + { + public SlipstreamTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } + + private const string V090 = "0.9.0.0"; + private const string V100 = "1.0.0.0"; + private const string V101 = "1.0.1.0"; + + [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6297")] + public void CanInstallBundleWithSlipstreamedPatchThenRemoveIt() + { + var testRegistryValue = "PackageA"; + + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var bundleA = this.CreateBundleInstaller("BundleA"); + + var packageAv1SourceCodeInstalled = packageAv1.GetInstalledFilePath("Package.wxs"); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should not be there on test start: {packageAv1SourceCodeInstalled}"); + + bundleA.Install(); + bundleA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + bundleA.Uninstall(); + bundleA.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), String.Concat("PackageAv1 payload should have been removed by uninstall from: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryRootDeleted(); + } + + /// + /// BundleA installs PackageA with slipstreamed PatchA. + /// BundleOnlyPatchA is installed which contains PatchA (which should be a no-op). + /// BundleOnlyPatchA in uninstalled which should do nothing since BundleA has a dependency on it. + /// Bundle is installed which should remove everything. + /// + [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6297")] + public void ReferenceCountsSlipstreamedPatch() + { + var testRegistryValue = "PackageA"; + + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var bundleOnlyPatchA = this.CreateBundleInstaller("BundleOnlyPatchA"); + var bundleA = this.CreateBundleInstaller("BundleA"); + + var packageAv1SourceCodeInstalled = packageAv1.GetInstalledFilePath("Package.wxs"); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should not be there on test start: {packageAv1SourceCodeInstalled}"); + + bundleA.Install(); + bundleA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + bundleOnlyPatchA.Install(); + bundleOnlyPatchA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + bundleOnlyPatchA.Uninstall(); + bundleOnlyPatchA.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + bundleA.Uninstall(); + bundleA.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), String.Concat("PackageAv1 payload should have been removed by uninstall from: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryRootDeleted(); + } + + [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6350")] + public void CanInstallBundleWithSlipstreamedPatchThenRepairIt() + { + this.InstallBundleWithSlipstreamedPatchThenRepairIt(false); + } + + [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6350")] + public void CanInstallReversedBundleWithSlipstreamedPatchThenRepairIt() + { + this.InstallBundleWithSlipstreamedPatchThenRepairIt(true); + } + + private void InstallBundleWithSlipstreamedPatchThenRepairIt(bool isReversed) + { + var bundleName = isReversed ? "BundleAReverse" : "BundleA"; + var testRegistryValue = "PackageA"; + + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var bundleA = this.CreateBundleInstaller(bundleName); + + var packageAv1SourceCodeInstalled = packageAv1.GetInstalledFilePath("Package.wxs"); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should not be there on test start: {packageAv1SourceCodeInstalled}"); + + bundleA.Install(); + bundleA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + // Delete the installed file and registry key so we have something to repair. + File.Delete(packageAv1SourceCodeInstalled); + packageAv1.DeleteTestRegistryValue(testRegistryValue); + + bundleA.Repair(); + bundleA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + bundleA.Uninstall(); + bundleA.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), String.Concat("PackageAv1 payload should have been removed by uninstall from: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryRootDeleted(); + } + + [Fact] + public void CanInstallSlipstreamedPatchThroughForcedRepair() + { + this.InstallSlipstreamedPatchThroughForcedRepair(false); + } + + [Fact] + public void CanInstallSlipstreamedPatchThroughReversedForcedRepair() + { + this.InstallSlipstreamedPatchThroughForcedRepair(true); + } + + private void InstallSlipstreamedPatchThroughForcedRepair(bool isReversed) + { + var bundleName = isReversed ? "BundleAReverse" : "BundleA"; + var testRegistryValue = "PackageA"; + + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var bundleA = this.CreateBundleInstaller(bundleName); + var bundleOnlyA = this.CreateBundleInstaller("BundleOnlyA"); + var testBAController = this.CreateTestBAController(); + + var packageAv1SourceCodeInstalled = packageAv1.GetInstalledFilePath("Package.wxs"); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should not be there on test start: {packageAv1SourceCodeInstalled}"); + + bundleOnlyA.Install(); + bundleOnlyA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V100); + + // Delete the installed file and registry key so we have something to repair. + File.Delete(packageAv1SourceCodeInstalled); + packageAv1.DeleteTestRegistryValue(testRegistryValue); + + testBAController.SetPackageRequestedState("PackageA", RequestState.Repair); + testBAController.SetPackageRequestedState("PatchA", RequestState.Repair); + + bundleA.Install(); + bundleA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + testBAController.ResetPackageStates("PackageA"); + testBAController.ResetPackageStates("PatchA"); + + bundleA.Uninstall(); + bundleA.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V100); + + bundleOnlyA.Uninstall(); + bundleOnlyA.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), String.Concat("PackageAv1 payload should have been removed by uninstall from: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryRootDeleted(); + } + + [Fact] + public void CanUninstallSlipstreamedPatchAlone() + { + var testRegistryValue = "PackageA"; + + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var bundleA = this.CreateBundleInstaller("BundleA"); + var testBAController = this.CreateTestBAController(); + + var packageAv1SourceCodeInstalled = packageAv1.GetInstalledFilePath("Package.wxs"); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should not be there on test start: {packageAv1SourceCodeInstalled}"); + + bundleA.Install(); + bundleA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + testBAController.SetPackageRequestedState("PatchA", RequestState.Absent); + + bundleA.Modify(); + bundleA.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V100); + + bundleA.Uninstall(); + bundleA.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), String.Concat("PackageAv1 payload should have been removed by uninstall from: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryRootDeleted(); + } + + [Fact] + public void CanModifyToUninstallPackageWithSlipstreamedPatch() + { + var testRegistryValue = "PackageA"; + + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var packageBv1 = this.CreatePackageInstaller("PackageBv1"); + var bundleB = this.CreateBundleInstaller("BundleB"); + var testBAController = this.CreateTestBAController(); + + var packageAv1SourceCodeInstalled = packageAv1.GetInstalledFilePath("Package.wxs"); + var packageBv1SourceCodeInstalled = packageBv1.GetInstalledFilePath("Package.wxs"); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should not be there on test start: {packageAv1SourceCodeInstalled}"); + Assert.False(File.Exists(packageBv1SourceCodeInstalled), $"PackageBv1 payload should not be there on test start: {packageBv1SourceCodeInstalled}"); + + bundleB.Install(); + bundleB.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + Assert.True(File.Exists(packageBv1SourceCodeInstalled), String.Concat("Should have found PackageBv1 payload installed at: ", packageBv1SourceCodeInstalled)); + + testBAController.SetPackageRequestedState("PackageA", RequestState.Absent); + testBAController.SetPackageRequestedState("PatchA", RequestState.Absent); + + bundleB.Modify(); + bundleB.VerifyRegisteredAndInPackageCache(); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should have been removed by modify from: {packageAv1SourceCodeInstalled}"); + + testBAController.ResetPackageStates("PackageA"); + testBAController.ResetPackageStates("PatchA"); + + bundleB.Uninstall(); + bundleB.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.False(File.Exists(packageBv1SourceCodeInstalled), String.Concat("PackageBv1 payload should have been removed by uninstall from: ", packageBv1SourceCodeInstalled)); + packageBv1.VerifyTestRegistryRootDeleted(); + } + + [Fact] + public void UninstallsPackageWithSlipstreamedPatchDuringRollback() + { + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var packageBv1 = this.CreatePackageInstaller("PackageBv1"); + var bundleB = this.CreateBundleInstaller("BundleB"); + var testBAController = this.CreateTestBAController(); + + var packageAv1SourceCodeInstalled = packageAv1.GetInstalledFilePath("Package.wxs"); + var packageBv1SourceCodeInstalled = packageBv1.GetInstalledFilePath("Package.wxs"); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should not be there on test start: {packageAv1SourceCodeInstalled}"); + Assert.False(File.Exists(packageBv1SourceCodeInstalled), $"PackageBv1 payload should not be there on test start: {packageBv1SourceCodeInstalled}"); + + testBAController.SetPackageCancelExecuteAtProgress("PackageB", 50); + + bundleB.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_USEREXIT); + bundleB.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should have been removed by rollback from: {packageAv1SourceCodeInstalled}"); + Assert.False(File.Exists(packageBv1SourceCodeInstalled), String.Concat("PackageBv1 payload should not have been installed from: ", packageBv1SourceCodeInstalled)); + packageBv1.VerifyTestRegistryRootDeleted(); + } + + [Fact(Skip = "The bundle is slipstreaming the patches correctly, need to research why testRegistryValueB is getting patched because patch AB2 is not supposed to change it")] + public void CanAutomaticallyPredetermineSlipstreamPatchesAtBuildTime() + { + var testRegistryValueA = "PackageA"; + var testRegistryValueA2 = "PackageA2"; + var testRegistryValueB = "PackageB"; + var testRegistryValueB2 = "PackageB2"; + + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var packageBv1 = this.CreatePackageInstaller("PackageBv1"); + var bundleC = this.CreateBundleInstaller("BundleC"); + + var packageAv1SourceCodeInstalled = packageAv1.GetInstalledFilePath("Package.wxs"); + var packageBv1SourceCodeInstalled = packageBv1.GetInstalledFilePath("Package.wxs"); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), $"PackageAv1 payload should not be there on test start: {packageAv1SourceCodeInstalled}"); + Assert.False(File.Exists(packageBv1SourceCodeInstalled), $"PackageBv1 payload should not be there on test start: {packageBv1SourceCodeInstalled}"); + + bundleC.Install(); + bundleC.VerifyRegisteredAndInPackageCache(); + Assert.True(File.Exists(packageAv1SourceCodeInstalled), String.Concat("Should have found PackageAv1 payload installed at: ", packageAv1SourceCodeInstalled)); + // Product A should've slipstreamed both patches. + packageAv1.VerifyTestRegistryValue(testRegistryValueA, V101); + packageAv1.VerifyTestRegistryValue(testRegistryValueA2, V101); + // Product B should've only slipstreamed patch AB2. + packageBv1.VerifyTestRegistryValue(testRegistryValueB, V100); + packageBv1.VerifyTestRegistryValue(testRegistryValueB2, V101); + + bundleC.Uninstall(); + bundleC.VerifyUnregisteredAndRemovedFromPackageCache(); + Assert.False(File.Exists(packageAv1SourceCodeInstalled), String.Concat("PackageAv1 payload should have been removed by uninstall from: ", packageAv1SourceCodeInstalled)); + Assert.False(File.Exists(packageBv1SourceCodeInstalled), String.Concat("PackageBv1 payload should have been removed by uninstall from: ", packageBv1SourceCodeInstalled)); + packageAv1.VerifyTestRegistryRootDeleted(); + } + + [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6297")] + public void CanInstallSlipstreamedPatchWithPackageDuringMajorUpgrade() + { + var testRegistryValue = "PackageA"; + + var packageAv0 = this.CreatePackageInstaller("PackageAv0_9_0"); + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var bundleA = this.CreateBundleInstaller("BundleA"); + + packageAv1.VerifyInstalled(false); + + packageAv0.InstallProduct(); + packageAv0.VerifyInstalled(true); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V090); + + bundleA.Install(); + bundleA.VerifyRegisteredAndInPackageCache(); + packageAv0.VerifyInstalled(false); + packageAv1.VerifyInstalled(true); + packageAv1.VerifyTestRegistryValue(testRegistryValue, V101); + + bundleA.Uninstall(); + bundleA.VerifyUnregisteredAndRemovedFromPackageCache(); + packageAv1.VerifyInstalled(false); + packageAv1.VerifyTestRegistryRootDeleted(); + } + } +} -- cgit v1.2.3-55-g6feb