main
cs 240 lines 15.7 KB
Raw
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 namespace WixToolsetTest.BurnE2E
4 {
5 using WixTestTools;
6 using WixToolset.BootstrapperApplicationApi;
7 using Xunit;
8 using Xunit.Abstractions;
9
10 public class ExePackageTests : BurnE2ETests
11 {
12 public ExePackageTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { }
13
14 [RuntimeFact]
15 public void CanInstallAndUninstallPerMachineArpEntryExePackage()
16 {
17 var perMachineArpEntryExePackageBundle = this.CreateBundleInstaller(@"PerMachineArpEntryExePackage");
18 var arpEntryExePackage = this.CreateArpEntryInstaller(perMachineArpEntryExePackageBundle, "TestExe");
19 var arpId = arpEntryExePackage.ArpId;
20
21 arpEntryExePackage.VerifyRegistered(false);
22
23 var installLogPath = perMachineArpEntryExePackageBundle.Install();
24 perMachineArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
25 arpEntryExePackage.VerifyRegistered(true);
26
27 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\""));
28
29 var uninstallLogPath = perMachineArpEntryExePackageBundle.Uninstall();
30 perMachineArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
31 arpEntryExePackage.VerifyRegistered(false);
32
33 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"testexe.exe\" /regd HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}"));
34 }
35
36 [RuntimeFact]
37 public void CanInstallAndUninstallPerMachineArpEntryWithUninstallStringExePackage()
38 {
39 var perMachineArpEntryExePackageBundle = this.CreateBundleInstaller(@"PerMachineArpEntryWithUninstallStringExePackage");
40 var arpEntryExePackage = this.CreateArpEntryInstaller(perMachineArpEntryExePackageBundle, "TestExe");
41 var arpId = arpEntryExePackage.ArpId;
42
43 arpEntryExePackage.VerifyRegistered(false);
44
45 var installLogPath = perMachineArpEntryExePackageBundle.Install();
46 perMachineArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
47 arpEntryExePackage.VerifyRegistered(true);
48
49 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},UninstallString,String,\\\""));
50
51 var uninstallLogPath = perMachineArpEntryExePackageBundle.Uninstall();
52 perMachineArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
53 arpEntryExePackage.VerifyRegistered(false);
54
55 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"testexe.exe\" /regd HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}"));
56 }
57
58 [RuntimeFact]
59 public void CanRecacheAndReinstallPerMachineArpEntryExePackageOnUninstallRollback()
60 {
61 var packageTestExe = this.CreatePackageInstaller("PackageTestExe");
62 var perMachineArpEntryExePackageUninstallFailureBundle = this.CreateBundleInstaller(@"PerMachineArpEntryExePackageUninstallFailure");
63 var arpEntryExePackage = this.CreateArpEntryInstaller(perMachineArpEntryExePackageUninstallFailureBundle, "TestExe");
64 var arpId = arpEntryExePackage.ArpId;
65 var testBAController = this.CreateTestBAController();
66
67 arpEntryExePackage.VerifyRegistered(false);
68 packageTestExe.VerifyInstalled(false);
69
70 testBAController.SetPackageRequestedCacheType("TestExe", BOOTSTRAPPER_CACHE_TYPE.Remove);
71
72 var installLogPath = perMachineArpEntryExePackageUninstallFailureBundle.Install();
73 perMachineArpEntryExePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
74 arpEntryExePackage.VerifyRegistered(true);
75 packageTestExe.VerifyInstalled(true);
76
77 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\""));
78
79 testBAController.ResetPackageStates("TestExe");
80 testBAController.SetAllowAcquireAfterValidationFailure();
81
82 var uninstallLogPath = perMachineArpEntryExePackageUninstallFailureBundle.Uninstall((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE, "FAILWHENDEFERRED=1");
83 perMachineArpEntryExePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
84 arpEntryExePackage.VerifyRegistered(true);
85 packageTestExe.VerifyInstalled(true);
86
87 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, "TESTBA: OnCachePackageNonVitalValidationFailure() - id: TestExe, default: None, requested: Acquire"));
88 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"testexe.exe\" /regd HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}"));
89 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\""));
90 }
91
92 [RuntimeFact]
93 public void CanReinstallPerMachineArpEntryExePackageOnUninstallRollback()
94 {
95 var packageTestExe = this.CreatePackageInstaller("PackageTestExe");
96 var perMachineArpEntryExePackageUninstallFailureBundle = this.CreateBundleInstaller(@"PerMachineArpEntryExePackageUninstallFailure");
97 var arpEntryExePackage = this.CreateArpEntryInstaller(perMachineArpEntryExePackageUninstallFailureBundle, "TestExe");
98 var arpId = arpEntryExePackage.ArpId;
99
100 arpEntryExePackage.VerifyRegistered(false);
101 packageTestExe.VerifyInstalled(false);
102
103 var installLogPath = perMachineArpEntryExePackageUninstallFailureBundle.Install();
104 perMachineArpEntryExePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
105 arpEntryExePackage.VerifyRegistered(true);
106 packageTestExe.VerifyInstalled(true);
107
108 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\""));
109
110 var uninstallLogPath = perMachineArpEntryExePackageUninstallFailureBundle.Uninstall((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE, "FAILWHENDEFERRED=1");
111 perMachineArpEntryExePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
112 arpEntryExePackage.VerifyRegistered(true);
113 packageTestExe.VerifyInstalled(true);
114
115 Assert.False(LogVerifier.MessageInLogFile(uninstallLogPath, "TESTBA: OnCachePackageNonVitalValidationFailure() - id: TestExe"));
116 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"testexe.exe\" /regd HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}"));
117 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\""));
118 }
119
120 [RuntimeFact]
121 public void CanSkipReinstallPerMachineArpEntryExePackageOnUninstallRollback()
122 {
123 var packageTestExe = this.CreatePackageInstaller("PackageTestExe");
124 var perMachineArpEntryExePackageUninstallFailureBundle = this.CreateBundleInstaller(@"PerMachineArpEntryExePackageUninstallFailure");
125 var arpEntryExePackage = this.CreateArpEntryInstaller(perMachineArpEntryExePackageUninstallFailureBundle, "TestExe");
126 var arpId = arpEntryExePackage.ArpId;
127 var testBAController = this.CreateTestBAController();
128
129 arpEntryExePackage.VerifyRegistered(false);
130 packageTestExe.VerifyInstalled(false);
131
132 testBAController.SetPackageRequestedCacheType("TestExe", BOOTSTRAPPER_CACHE_TYPE.Remove);
133
134 var installLogPath = perMachineArpEntryExePackageUninstallFailureBundle.Install();
135 perMachineArpEntryExePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
136 arpEntryExePackage.VerifyRegistered(true);
137 packageTestExe.VerifyInstalled(true);
138
139 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\""));
140
141 var uninstallLogPath = perMachineArpEntryExePackageUninstallFailureBundle.Uninstall((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE, "FAILWHENDEFERRED=1");
142 perMachineArpEntryExePackageUninstallFailureBundle.VerifyRegisteredAndInPackageCache();
143 arpEntryExePackage.VerifyRegistered(false);
144 packageTestExe.VerifyInstalled(true);
145
146 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, "TESTBA: OnCachePackageNonVitalValidationFailure() - id: TestExe, default: None, requested: None"));
147 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"testexe.exe\" /regd HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}"));
148 }
149
150 [RuntimeFact]
151 public void CanUninstallPerMachineArpEntryExePackageOnInstallRollback()
152 {
153 var perMachineArpEntryExePackageFailureBundle = this.CreateBundleInstaller(@"PerMachineArpEntryExePackageFailure");
154 var arpEntryExePackage = this.CreateArpEntryInstaller(perMachineArpEntryExePackageFailureBundle, "TestExe");
155 var arpId = arpEntryExePackage.ArpId;
156
157 arpEntryExePackage.VerifyRegistered(false);
158
159 var installLogPath = perMachineArpEntryExePackageFailureBundle.Install((int)MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE);
160 perMachineArpEntryExePackageFailureBundle.VerifyUnregisteredAndRemovedFromPackageCache();
161 arpEntryExePackage.VerifyRegistered(false);
162
163 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\""));
164 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"testexe.exe\" /regd HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}"));
165 }
166
167 [RuntimeFact]
168 public void CanUseLargeCustomExitCode()
169 {
170 var customExitCodeExePackageBundle = this.CreateBundleInstaller(@"CustomExitCodeExePackage");
171
172 var installLogPath = customExitCodeExePackageBundle.Install(5, "EXEEXITCODE=-2147024891");
173 customExitCodeExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
174
175 Assert.True(LogVerifier.MessageInLogFile(installLogPath, "TestExe.exe\" /ec -2147024891"));
176 Assert.True(LogVerifier.MessageInLogFile(installLogPath, "The process for package: TestExe exited with code: 0x80070005. The exit code has been translated to type: ErrorScheduleReboot and restart: Required."));
177 Assert.True(LogVerifier.MessageInLogFile(installLogPath, "Applied execute package: TestExe, result: 0x80070005, restart: Required"));
178 Assert.True(LogVerifier.MessageInLogFile(installLogPath, "Apply complete, result: 0x80070005, restart: Required, ba requested restart: No"));
179 }
180
181 [RuntimeFact]
182 public void CanUseWildcardCustomExitCode()
183 {
184 var customExitCodeExePackageBundle = this.CreateBundleInstaller(@"CustomExitCodeExePackage");
185
186 var installLogPath = customExitCodeExePackageBundle.Install((int)MSIExec.MSIExecReturnCode.SUCCESS, "EXEEXITCODE=1");
187 customExitCodeExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
188
189 Assert.True(LogVerifier.MessageInLogFile(installLogPath, "TestExe.exe\" /ec 1"));
190 Assert.True(LogVerifier.MessageInLogFile(installLogPath, "The process for package: TestExe exited with code: 0x1. The exit code has been translated to type: Success and restart: None."));
191 }
192
193 [RuntimeFact]
194 public void CanInstallAndUninstallPerUserArpEntryExePackage()
195 {
196 var perUserArpEntryExePackageBundle = this.CreateBundleInstaller(@"PerUserArpEntryExePackage");
197 var arpEntryExePackage = this.CreateArpEntryInstaller(perUserArpEntryExePackageBundle, "TestExe");
198 var arpId = arpEntryExePackage.ArpId;
199
200 arpEntryExePackage.VerifyRegistered(false);
201
202 var installLogPath = perUserArpEntryExePackageBundle.Install();
203 perUserArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
204 arpEntryExePackage.VerifyRegistered(true);
205
206 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\" /regw \"HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},QuietUninstallString,String,\\\""));
207
208 var uninstallLogPath = perUserArpEntryExePackageBundle.Uninstall();
209 perUserArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
210 arpEntryExePackage.VerifyRegistered(false);
211
212 Assert.True(LogVerifier.MessageInLogFile(uninstallLogPath, $"testexe.exe\" /regd HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId}"));
213 }
214
215 [RuntimeFact]
216 public void FailsUninstallWhenPerUserArpEntryExePackageMissingQuietUninstallString()
217 {
218 var brokenPerUserArpEntryExePackageBundle = this.CreateBundleInstaller(@"BrokenPerUserArpEntryExePackage");
219 var arpEntryExePackage = this.CreateArpEntryInstaller(brokenPerUserArpEntryExePackageBundle, "TestExe");
220 var arpId = arpEntryExePackage.ArpId;
221
222 arpEntryExePackage.VerifyRegistered(false);
223 brokenPerUserArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
224
225 var installLogPath = brokenPerUserArpEntryExePackageBundle.Install();
226 brokenPerUserArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
227 arpEntryExePackage.VerifyRegistered(true);
228
229 Assert.True(LogVerifier.MessageInLogFile(installLogPath, $"TestExe.exe\" /regw \"HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{arpId},DisplayVersion,String,1.0.0.0\""));
230
231 brokenPerUserArpEntryExePackageBundle.Uninstall((int)MSIExec.MSIExecReturnCode.ERROR_INVALID_PARAMETER);
232 brokenPerUserArpEntryExePackageBundle.VerifyRegisteredAndInPackageCache();
233
234 arpEntryExePackage.Unregister();
235
236 brokenPerUserArpEntryExePackageBundle.Uninstall();
237 brokenPerUserArpEntryExePackageBundle.VerifyUnregisteredAndRemovedFromPackageCache();
238 }
239 }
240 }