aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/burn/TestData/BundlePackageTests/BundlePackageUninstallFailureBundle/BundlePackageUninstallFailureBundle.wixproj19
-rw-r--r--src/test/burn/TestData/BundlePackageTests/BundlePackageUninstallFailureBundle/BundlePackageUninstallFailureBundle.wxs15
-rw-r--r--src/test/burn/TestData/BundlePackageTests/PackageFail/PackageFail.wixproj12
-rw-r--r--src/test/burn/WixTestTools/BundleVerifier.cs11
-rw-r--r--src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs112
5 files changed, 167 insertions, 2 deletions
diff --git a/src/test/burn/TestData/BundlePackageTests/BundlePackageUninstallFailureBundle/BundlePackageUninstallFailureBundle.wixproj b/src/test/burn/TestData/BundlePackageTests/BundlePackageUninstallFailureBundle/BundlePackageUninstallFailureBundle.wixproj
new file mode 100644
index 00000000..276d9dcb
--- /dev/null
+++ b/src/test/burn/TestData/BundlePackageTests/BundlePackageUninstallFailureBundle/BundlePackageUninstallFailureBundle.wixproj
@@ -0,0 +1,19 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Bundle</OutputType>
5 <UpgradeCode>{1CD57FE5-A2FA-4A72-BEBA-74D9730C2C93}</UpgradeCode>
6 </PropertyGroup>
7 <ItemGroup>
8 <Compile Include="..\..\Templates\Bundle.wxs" Link="Bundle.wxs" />
9 </ItemGroup>
10 <ItemGroup>
11 <ProjectReference Include="..\PackageFail\PackageFail.wixproj" />
12 <ProjectReference Include="..\..\BasicFunctionalityTests\BundleA\BundleA.wixproj" />
13 <ProjectReference Include="..\..\TestBA\TestBAWixlib\testbawixlib.wixproj" />
14 </ItemGroup>
15 <ItemGroup>
16 <PackageReference Include="WixToolset.Bal.wixext" />
17 <PackageReference Include="WixToolset.NetFx.wixext" />
18 </ItemGroup>
19</Project> \ No newline at end of file
diff --git a/src/test/burn/TestData/BundlePackageTests/BundlePackageUninstallFailureBundle/BundlePackageUninstallFailureBundle.wxs b/src/test/burn/TestData/BundlePackageTests/BundlePackageUninstallFailureBundle/BundlePackageUninstallFailureBundle.wxs
new file mode 100644
index 00000000..1e27161c
--- /dev/null
+++ b/src/test/burn/TestData/BundlePackageTests/BundlePackageUninstallFailureBundle/BundlePackageUninstallFailureBundle.wxs
@@ -0,0 +1,15 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
5 <Fragment>
6 <Variable Name="FAILWHENDEFERRED" bal:Overridable="yes" />
7
8 <PackageGroup Id="BundlePackages">
9 <MsiPackage Id="PackageFail" SourceFile="$(var.PackageFail.TargetPath)">
10 <MsiProperty Name="WIXFAILWHENDEFERRED" Value="[FAILWHENDEFERRED]" />
11 </MsiPackage>
12 <BundlePackage Id="PackageA" SourceFile="$(var.BundleA.TargetPath)" />
13 </PackageGroup>
14 </Fragment>
15</Wix>
diff --git a/src/test/burn/TestData/BundlePackageTests/PackageFail/PackageFail.wixproj b/src/test/burn/TestData/BundlePackageTests/PackageFail/PackageFail.wixproj
new file mode 100644
index 00000000..68b5470b
--- /dev/null
+++ b/src/test/burn/TestData/BundlePackageTests/PackageFail/PackageFail.wixproj
@@ -0,0 +1,12 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <UpgradeCode>{2674BFB2-634D-42DB-A1EC-C2CD148A2328}</UpgradeCode>
5 </PropertyGroup>
6 <ItemGroup>
7 <Compile Include="..\..\Templates\PackageFail.wxs" Link="PackageFail.wxs" />
8 </ItemGroup>
9 <ItemGroup>
10 <PackageReference Include="WixToolset.Util.wixext" />
11 </ItemGroup>
12</Project> \ No newline at end of file
diff --git a/src/test/burn/WixTestTools/BundleVerifier.cs b/src/test/burn/WixTestTools/BundleVerifier.cs
index ff45a291..3a19ca02 100644
--- a/src/test/burn/WixTestTools/BundleVerifier.cs
+++ b/src/test/burn/WixTestTools/BundleVerifier.cs
@@ -158,14 +158,21 @@ namespace WixTestTools
158 } 158 }
159 } 159 }
160 160
161 public void VerifyPackageIsCached(string packageId, bool cached = true) 161 public string GetPackageEntryPointCachePath(string packageId)
162 { 162 {
163 using var wixOutput = WixOutput.Read(this.BundlePdb); 163 using var wixOutput = WixOutput.Read(this.BundlePdb);
164 var intermediate = Intermediate.Load(wixOutput); 164 var intermediate = Intermediate.Load(wixOutput);
165 var section = intermediate.Sections.Single(); 165 var section = intermediate.Sections.Single();
166 var packageSymbol = section.Symbols.OfType<WixBundlePackageSymbol>().Single(p => p.Id.Id == packageId); 166 var packageSymbol = section.Symbols.OfType<WixBundlePackageSymbol>().Single(p => p.Id.Id == packageId);
167 var packagePayloadSymbol = section.Symbols.OfType<WixBundlePayloadSymbol>().Single(p => p.Id.Id == packageSymbol.PayloadRef);
167 var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId, packageSymbol.PerMachine == true); 168 var cachePath = this.GetPackageCachePathForCacheId(packageSymbol.CacheId, packageSymbol.PerMachine == true);
168 Assert.Equal(cached, Directory.Exists(cachePath)); 169 return Path.Combine(cachePath, packagePayloadSymbol.Name);
170 }
171
172 public void VerifyPackageIsCached(string packageId, bool cached = true)
173 {
174 var entryPointCachePath = this.GetPackageEntryPointCachePath(packageId);
175 Assert.Equal(cached, File.Exists(entryPointCachePath));
169 } 176 }
170 177
171 public void VerifyPackageProviderRemoved(string packageId) 178 public void VerifyPackageProviderRemoved(string packageId)
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs
index 0c6e5873..b3ef9430 100644
--- a/src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs
+++ b/src/test/burn/WixToolsetTest.BurnE2E/BundlePackageTests.cs
@@ -5,6 +5,7 @@ namespace WixToolsetTest.BurnE2E
5 using System; 5 using System;
6 using System.IO; 6 using System.IO;
7 using WixTestTools; 7 using WixTestTools;
8 using WixToolset.Mba.Core;
8 using Xunit; 9 using Xunit;
9 using Xunit.Abstractions; 10 using Xunit.Abstractions;
10 11
@@ -137,5 +138,116 @@ namespace WixToolsetTest.BurnE2E
137 upgradeBundlePackageBundlev1.VerifyUnregisteredAndRemovedFromPackageCache(); 138 upgradeBundlePackageBundlev1.VerifyUnregisteredAndRemovedFromPackageCache();
138 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache(); 139 bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache();
139 } 140 }
141
142 [RuntimeFact]
143 public void CanRecacheAndReinstallBundlePackageOnUninstallRollback()
144 {
145 var packageFail = this.CreatePackageInstaller("PackageFail");
146 var packageA = this.CreatePackageInstaller(@"..\BasicFunctionalityTests\PackageA");
147 var bundleA = this.CreateBundleInstaller(@"..\BasicFunctionalityTests\BundleA");
148 var bundlePackageUninstallFailureBundle = this.CreateBundleInstaller("BundlePackageUninstallFailureBundle");
149 var testBAController = this.CreateTestBAController();
150 var bundleASelfCachedPath = bundleA.GetExpectedCachedBundlePath();
151 var bundleAEmbeddedCachedPath = bundlePackageUninstallFailureBundle.GetPackageEntryPointCachePath("PackageA");
152
153 packageA.VerifyInstalled(false);
154 packageFail.VerifyInstalled(false);
155 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
156
157 testBAController.SetPackageRequestedCacheType("PackageA", BOOTSTRAPPER_CACHE_TYPE.Remove);
158
159 var installLogPath = bundlePackageUninstallFailureBundle.Install();
160 bundlePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
161 packageFail.VerifyInstalled(true);
162 bundleA.VerifyRegisteredAndInPackageCache(expectedSystemComponent: 1);
163
164 Assert.False(LogVerifier.MessageInLogFile(installLogPath, $"Applying execute package: PackageA, action: Install, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
165 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"Applying execute package: PackageA, action: Install, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
166
167 testBAController.ResetPackageStates("PackageA");
168 testBAController.SetAllowAcquireAfterValidationFailure();
169
170 var uninstallLogPath = bundlePackageUninstallFailureBundle.Uninstall((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE, "FAILWHENDEFERRED=1");
171 bundlePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
172 bundleA.VerifyRegisteredAndInPackageCache(expectedSystemComponent: 1);
173 packageFail.VerifyInstalled(true);
174
175 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, "TESTBA: OnCachePackageNonVitalValidationFailure() - id: PackageA, default: None, requested: Acquire"));
176 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying execute package: PackageA, action: Uninstall, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
177 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying execute package: PackageA, action: Uninstall, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
178 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying rollback package: PackageA, action: Install, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
179 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying rollback package: PackageA, action: Install, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
180 }
181
182 [RuntimeFact]
183 public void CanReinstallBundlePackageOnUninstallRollback()
184 {
185 var packageFail = this.CreatePackageInstaller("PackageFail");
186 var packageA = this.CreatePackageInstaller(@"..\BasicFunctionalityTests\PackageA");
187 var bundleA = this.CreateBundleInstaller(@"..\BasicFunctionalityTests\BundleA");
188 var bundlePackageUninstallFailureBundle = this.CreateBundleInstaller("BundlePackageUninstallFailureBundle");
189 var bundleASelfCachedPath = bundleA.GetExpectedCachedBundlePath();
190 var bundleAEmbeddedCachedPath = bundlePackageUninstallFailureBundle.GetPackageEntryPointCachePath("PackageA");
191
192 packageA.VerifyInstalled(false);
193 packageFail.VerifyInstalled(false);
194 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
195
196 var installLogPath = bundlePackageUninstallFailureBundle.Install();
197 bundlePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
198 packageFail.VerifyInstalled(true);
199 bundleA.VerifyRegisteredAndInPackageCache(expectedSystemComponent: 1);
200
201 Assert.False(LogVerifier.MessageInLogFile(installLogPath, $"Applying execute package: PackageA, action: Install, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
202 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"Applying execute package: PackageA, action: Install, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
203
204 var uninstallLogPath = bundlePackageUninstallFailureBundle.Uninstall((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE, "FAILWHENDEFERRED=1");
205 bundlePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
206 bundleA.VerifyRegisteredAndInPackageCache(expectedSystemComponent: 1);
207 packageFail.VerifyInstalled(true);
208
209 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, "TESTBA: OnCachePackageNonVitalValidationFailure() - id: PackageA"));
210 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying execute package: PackageA, action: Uninstall, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
211 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying execute package: PackageA, action: Uninstall, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
212 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying rollback package: PackageA, action: Install, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
213 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying rollback package: PackageA, action: Install, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
214 }
215
216 [RuntimeFact]
217 public void CanSkipReinstallBundlePackageOnUninstallRollback()
218 {
219 var packageFail = this.CreatePackageInstaller("PackageFail");
220 var packageA = this.CreatePackageInstaller(@"..\BasicFunctionalityTests\PackageA");
221 var bundleA = this.CreateBundleInstaller(@"..\BasicFunctionalityTests\BundleA");
222 var bundlePackageUninstallFailureBundle = this.CreateBundleInstaller("BundlePackageUninstallFailureBundle");
223 var testBAController = this.CreateTestBAController();
224 var bundleASelfCachedPath = bundleA.GetExpectedCachedBundlePath();
225 var bundleAEmbeddedCachedPath = bundlePackageUninstallFailureBundle.GetPackageEntryPointCachePath("PackageA");
226
227 packageA.VerifyInstalled(false);
228 packageFail.VerifyInstalled(false);
229 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
230
231 testBAController.SetPackageRequestedCacheType("PackageA", BOOTSTRAPPER_CACHE_TYPE.Remove);
232
233 var installLogPath = bundlePackageUninstallFailureBundle.Install();
234 bundlePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
235 packageFail.VerifyInstalled(true);
236 bundleA.VerifyRegisteredAndInPackageCache(expectedSystemComponent: 1);
237
238 Assert.False(LogVerifier.MessageInLogFile(installLogPath, $"Applying execute package: PackageA, action: Install, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
239 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"Applying execute package: PackageA, action: Install, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
240
241 var uninstallLogPath = bundlePackageUninstallFailureBundle.Uninstall((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE, "FAILWHENDEFERRED=1");
242 bundlePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
243 bundleA.VerifyUnregisteredAndRemovedFromPackageCache();
244 packageFail.VerifyInstalled(true);
245
246 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, "TESTBA: OnCachePackageNonVitalValidationFailure() - id: PackageA, default: None, requested: None"));
247 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying execute package: PackageA, action: Uninstall, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
248 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying execute package: PackageA, action: Uninstall, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
249 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying rollback package: PackageA, action: Install, path: {bundleASelfCachedPath}"), bundleASelfCachedPath);
250 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, $"Applying rollback package: PackageA, action: Install, path: {bundleAEmbeddedCachedPath}"), bundleAEmbeddedCachedPath);
251 }
140 } 252 }
141} 253}