Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: goopdate/installer_wrapper_unittest.cc

Issue 624713003: Keep only base/extractor.[cc|h]. (Closed) Base URL: https://chromium.googlesource.com/external/omaha.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « goopdate/installer_wrapper.cc ('k') | goopdate/job_observer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2007-2010 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 // ========================================================================
15
16 #include <atlpath.h>
17 #include <atlstr.h>
18 #include "base/scoped_ptr.h"
19 #include "omaha/base/app_util.h"
20 #include "omaha/base/error.h"
21 #include "omaha/base/file.h"
22 #include "omaha/base/path.h"
23 #include "omaha/base/process.h"
24 #include "omaha/base/reg_key.h"
25 #include "omaha/base/scoped_ptr_address.h"
26 #include "omaha/base/shell.h"
27 #include "omaha/base/system.h"
28 #include "omaha/base/timer.h"
29 #include "omaha/base/utils.h"
30 #include "omaha/base/vistautil.h"
31 #include "omaha/common/app_registry_utils.h"
32 #include "omaha/common/const_goopdate.h"
33 #include "omaha/common/install_manifest.h"
34 #include "omaha/goopdate/app_manager.h"
35 #include "omaha/goopdate/installer_wrapper.h"
36 #include "omaha/goopdate/model.h"
37 #include "omaha/goopdate/resource_manager.h"
38 #include "omaha/testing/unit_test.h"
39
40 namespace omaha {
41
42 namespace {
43
44 const TCHAR kAppId[] = _T("{B18BC01B-E0BD-4BF0-A33E-1133055E5FDE}");
45 const GUID kAppGuid = {0xB18BC01B, 0xE0BD, 0x4BF0,
46 {0xA3, 0x3E, 0x11, 0x33, 0x05, 0x5E, 0x5F, 0xDE}};
47
48 const TCHAR kFullAppClientsKeyPath[] =
49 _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\")
50 PRODUCT_NAME _T("\\Clients\\{B18BC01B-E0BD-4BF0-A33E-1133055E5FDE}");
51 const TCHAR kFullAppClientStateKeyPath[] =
52 _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\")
53 PRODUCT_NAME _T("\\ClientState\\{B18BC01B-E0BD-4BF0-A33E-1133055E5FDE}");
54 const TCHAR kFullFooAppClientKeyPath[] =
55 _T("HKLM\\Software\\") SHORT_COMPANY_NAME _T("\\")
56 PRODUCT_NAME _T("\\Clients\\{D6B08267-B440-4C85-9F79-E195E80D9937}");
57 const TCHAR kFullFooAppClientStateKeyPath[] =
58 _T("HKLM\\Software\\") SHORT_COMPANY_NAME _T("\\")
59 PRODUCT_NAME _T("\\ClientState\\{D6B08267-B440-4C85-9F79-E195E80D9937}");
60
61 const TCHAR kSetupFooV1RelativeLocation[] =
62 _T("unittest_support\\test_foo_v1.0.101.0.msi");
63 const TCHAR kFooGuid[] = _T("{D6B08267-B440-4C85-9F79-E195E80D9937}");
64 const TCHAR kFooInstallerBarPropertyArg[] = _T("PROPBAR=7");
65 const TCHAR kFooInstallerBarValueName[] = _T("propbar");
66
67 // Values related to using cmd.exe as an "installer".
68 const TCHAR kCmdExecutable[] = _T("cmd.exe");
69 const TCHAR kExecuteCommandAndTerminateSwitch[] = _T("/c %s");
70 const TCHAR kExecuteTwoCommandsFormat[] = _T("\"%s & %s\"");
71
72 const TCHAR kMsiLogFormat[] = _T("%s.log");
73
74 const TCHAR kMsiUninstallArguments[] = _T("/quiet /uninstall \"%s\"");
75 const TCHAR kMsiCommand[] = _T("msiexec");
76
77 const DWORD kInitialErrorValue = 5;
78 const TCHAR kMeaninglessErrorString[] = _T("This is an error string.");
79
80 // Some error strings are slightly different on Vista than XP because spaces
81 // were removed. Therefore, the comparison must ignore that space.
82
83 // The US English error string for ERROR_INSTALL_PACKAGE_OPEN_FAILED.
84 const TCHAR kMsiPackageOpenFailedStringPartA[] =
85 _T("This installation package could not be opened. ");
86 const TCHAR kMsiPackageOpenFailedStringPartB[] =
87 _T("Verify that the package exists and that you can access it, ")
88 _T("or contact the application vendor to verify that this is a ")
89 _T("valid Windows Installer package. ");
90
91 // The US English error string for ERROR_INSTALL_ALREADY_RUNNING.
92 const TCHAR kMsiBusyStringPartA[] =
93 _T("Another installation is already in progress. ");
94 const TCHAR kMsiBusyStringPartB[] =
95 _T("Complete that installation before proceeding with this install. ");
96
97 const TCHAR* const kError1603Text =
98 _T("The installer encountered error 1603: Fatal error during ")
99 _T("installation. ");
100
101 const TCHAR kError1618MessagePrefix[] =
102 _T("The installer encountered error 1618: ");
103 const int kError1618MessagePrefixLength =
104 arraysize(kError1618MessagePrefix) - 1;
105
106 const TCHAR* const kError0x800B010FText =
107 _T("The installer encountered error 0x800b010f: ")
108 _T("The certificate's CN name does not match the passed value. ");
109
110 const TCHAR* const kLaunchCmdLine =
111 _T("\"C:\\Local\\Google\\Chrome\\Application\\chrome.exe\" -home");
112
113 const TCHAR* const kLanguageEnglish = _T("en");
114
115 const int kMsiAlreadyRunningRetryDelayBaseMs = 5000;
116 const int kNumMsiTriesDefault = 4; // Up to 35 seconds.
117 const int kNumMsiTriesOnBuildSystem = 7; // Up to 6.25 minutes.
118
119 int GetNumMsiTries() {
120 return IsBuildSystem() ? kNumMsiTriesOnBuildSystem : kNumMsiTriesDefault;
121 }
122
123 } // namespace
124
125 extern const TCHAR kRegExecutable[] = _T("reg.exe");
126 extern const TCHAR kSetInstallerResultTypeMsiErrorRegCmdArgs[] =
127 _T("add HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
128 _T("\\UnitTest\\HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\")
129 PRODUCT_NAME _T("\\ClientState\\{B18BC01B-E0BD-4BF0-A33E-1133055E5FDE} ")
130 _T("/v InstallerResult /t REG_DWORD /d 2");
131 extern const TCHAR kMsiInstallerBusyExitCodeCmd[] = _T("exit 1618");
132
133 extern const TCHAR kError1619MessagePrefix[] =
134 _T("The installer encountered error 1619: ");
135 extern const int kError1619MessagePrefixLength =
136 arraysize(kError1619MessagePrefix) - 1;
137
138 void VerifyStringIsMsiPackageOpenFailedString(const CString& str) {
139 EXPECT_STREQ(kMsiPackageOpenFailedStringPartA,
140 str.Left(arraysize(kMsiPackageOpenFailedStringPartA) - 1));
141 EXPECT_STREQ(kMsiPackageOpenFailedStringPartB,
142 str.Right(arraysize(kMsiPackageOpenFailedStringPartB) - 1));
143 }
144
145 void VerifyStringIsMsiBusyString(const CString& str) {
146 EXPECT_STREQ(kMsiBusyStringPartA,
147 str.Left(arraysize(kMsiBusyStringPartA) - 1));
148 EXPECT_STREQ(kMsiBusyStringPartB,
149 str.Right(arraysize(kMsiBusyStringPartB) - 1));
150 }
151
152 // Unit tests may run while other updaters are running on the build system.
153 // Give the tests lots of time to run to avoid false negatives.
154 void AdjustMsiTries(InstallerWrapper* installer_wrapper) {
155 ASSERT1(installer_wrapper);
156 installer_wrapper->set_num_tries_when_msi_busy(GetNumMsiTries());
157 }
158
159 // Waits for the uninstall to complete to avoid race conditions with other tests
160 // that install the same MSI. It appears msiexec causes an an asynchronous
161 // request that may be processed out of order.
162 // Retries when ERROR_INSTALL_ALREADY_RUNNING is encountered.
163 void UninstallTestMsi(const CString& installer_path) {
164 CString uninstall_arguments;
165 uninstall_arguments.Format(kMsiUninstallArguments, installer_path);
166
167 const int max_tries = GetNumMsiTries();
168 int retry_delay = kMsiAlreadyRunningRetryDelayBaseMs;
169 int num_tries(0);
170 uint32 exit_code = ERROR_INSTALL_ALREADY_RUNNING;
171 for (num_tries = 0;
172 exit_code == ERROR_INSTALL_ALREADY_RUNNING && num_tries < max_tries;
173 ++num_tries) {
174 if (0 < num_tries) {
175 // Retrying - wait between attempts.
176 ::Sleep(retry_delay);
177 retry_delay *= 2; // Double the retry delay next time.
178 }
179
180 Process p(kMsiCommand, NULL);
181 EXPECT_HRESULT_SUCCEEDED(p.Start(uninstall_arguments, NULL));
182 EXPECT_TRUE(p.WaitUntilDead(10000));
183
184 EXPECT_TRUE(p.GetExitCode(&exit_code));
185 }
186
187 EXPECT_EQ(0, exit_code);
188 }
189
190 class InstallerWrapperTest : public testing::Test {
191 protected:
192 explicit InstallerWrapperTest(bool is_machine)
193 : is_machine_(is_machine),
194 hive_override_key_name_(kRegistryHiveOverrideRoot) {
195 }
196
197 static void SetUpTestCase() {
198 CString system_path;
199 EXPECT_SUCCEEDED(Shell::GetSpecialFolder(CSIDL_SYSTEM,
200 false,
201 &system_path));
202 EXPECT_FALSE(system_path.IsEmpty());
203 cmd_exe_path_.Combine(system_path, kCmdExecutable);
204 EXPECT_TRUE(File::Exists(cmd_exe_path_));
205
206 CPath reg_path;
207 reg_path.Combine(system_path, kRegExecutable);
208 set_installer_result_type_msi_error_cmd_.Format(
209 _T("%s %s"),
210 reg_path, kSetInstallerResultTypeMsiErrorRegCmdArgs);
211 }
212
213 virtual void SetUp() {
214 RegKey::DeleteKey(hive_override_key_name_, true);
215 OverrideRegistryHivesWithExecutionPermissions(hive_override_key_name_);
216
217 EXPECT_SUCCEEDED(AppManager::CreateInstance(is_machine_));
218
219 im_.reset(new InstallerWrapper(is_machine_));
220 EXPECT_SUCCEEDED(im_->Initialize());
221
222 EXPECT_SUCCEEDED(ResourceManager::Create(
223 is_machine_, app_util::GetCurrentModuleDirectory(), _T("en")));
224 }
225
226 virtual void TearDown() {
227 AppManager::DeleteInstance();
228
229 RestoreRegistryHives();
230 ASSERT_SUCCEEDED(RegKey::DeleteKey(hive_override_key_name_, true));
231 ResourceManager::Delete();
232 }
233
234 void SetupInstallerResultRegistry(const CString& app_guid,
235 bool set_installer_result,
236 DWORD installer_result,
237 bool set_installer_error,
238 DWORD installer_error,
239 bool set_installer_extra_code1,
240 DWORD installer_extra_code1,
241 bool set_installer_result_uistring,
242 const CString& installer_result_uistring,
243 bool set_installer_launch_cmd_line,
244 const CString& installer_launch_cmd_line) {
245 CString app_client_state_key =
246 app_registry_utils::GetAppClientStateKey(is_machine_, app_guid);
247 RegKey::CreateKey(app_client_state_key);
248 if (set_installer_result) {
249 RegKey::SetValue(app_client_state_key,
250 kRegValueInstallerResult,
251 installer_result);
252 }
253
254 if (set_installer_error) {
255 RegKey::SetValue(app_client_state_key,
256 kRegValueInstallerError,
257 installer_error);
258 }
259
260 if (set_installer_extra_code1) {
261 RegKey::SetValue(app_client_state_key,
262 kRegValueInstallerExtraCode1,
263 installer_extra_code1);
264 }
265
266 if (set_installer_result_uistring) {
267 RegKey::SetValue(app_client_state_key,
268 kRegValueInstallerResultUIString,
269 installer_result_uistring);
270 }
271
272 if (set_installer_launch_cmd_line) {
273 RegKey::SetValue(app_client_state_key,
274 kRegValueInstallerSuccessLaunchCmdLine,
275 installer_launch_cmd_line);
276 }
277 }
278
279 void VerifyLastRegistryValues(const CString& app_guid,
280 bool expect_installer_result,
281 DWORD expected_installer_result,
282 bool expect_installer_error,
283 DWORD expected_installer_error,
284 bool expect_installer_extra_code1,
285 DWORD expected_installer_extra_code1,
286 bool expect_installer_result_uistring,
287 const CString& expected_result_uistring,
288 bool expect_installer_launch_cmd_line,
289 const CString& expected_launch_cmd_line) {
290 ASSERT_TRUE(expect_installer_result || !expected_installer_result);
291 ASSERT_TRUE(expect_installer_error || !expected_installer_error);
292 ASSERT_TRUE(expect_installer_extra_code1 ||
293 !expected_installer_extra_code1);
294 ASSERT_TRUE(expect_installer_result_uistring ||
295 expected_result_uistring.IsEmpty());
296 ASSERT_TRUE(expect_installer_launch_cmd_line ||
297 expected_launch_cmd_line.IsEmpty());
298
299 CString app_client_state_key =
300 app_registry_utils::GetAppClientStateKey(is_machine_, app_guid);
301 EXPECT_FALSE(RegKey::HasValue(app_client_state_key,
302 kRegValueInstallerResult));
303 EXPECT_FALSE(RegKey::HasValue(app_client_state_key,
304 kRegValueInstallerError));
305 EXPECT_FALSE(RegKey::HasValue(app_client_state_key,
306 kRegValueInstallerExtraCode1));
307 EXPECT_FALSE(RegKey::HasValue(app_client_state_key,
308 kRegValueInstallerResultUIString));
309
310 if (expect_installer_result) {
311 EXPECT_TRUE(RegKey::HasValue(app_client_state_key,
312 kRegValueLastInstallerResult));
313 DWORD last_installer_result = 0;
314 EXPECT_SUCCEEDED(RegKey::GetValue(app_client_state_key,
315 kRegValueLastInstallerResult,
316 &last_installer_result));
317 EXPECT_EQ(expected_installer_result, last_installer_result);
318 } else {
319 EXPECT_FALSE(RegKey::HasValue(app_client_state_key,
320 kRegValueLastInstallerResult));
321 }
322
323 if (expect_installer_error) {
324 EXPECT_TRUE(RegKey::HasValue(app_client_state_key,
325 kRegValueLastInstallerError));
326 DWORD last_installer_error = 0;
327 EXPECT_SUCCEEDED(RegKey::GetValue(app_client_state_key,
328 kRegValueLastInstallerError,
329 &last_installer_error));
330 EXPECT_EQ(expected_installer_error, last_installer_error);
331 } else {
332 EXPECT_FALSE(RegKey::HasValue(app_client_state_key,
333 kRegValueLastInstallerError));
334 }
335
336 if (expect_installer_extra_code1) {
337 EXPECT_TRUE(RegKey::HasValue(app_client_state_key,
338 kRegValueLastInstallerExtraCode1));
339 DWORD last_installer_extracode1 = 0;
340 EXPECT_SUCCEEDED(RegKey::GetValue(app_client_state_key,
341 kRegValueLastInstallerExtraCode1,
342 &last_installer_extracode1));
343 EXPECT_EQ(expected_installer_extra_code1, last_installer_extracode1);
344 } else {
345 EXPECT_FALSE(RegKey::HasValue(app_client_state_key,
346 kRegValueLastInstallerExtraCode1));
347 }
348
349 if (expect_installer_result_uistring) {
350 EXPECT_TRUE(RegKey::HasValue(app_client_state_key,
351 kRegValueLastInstallerResultUIString));
352 CString last_installer_result_uistring;
353 EXPECT_SUCCEEDED(RegKey::GetValue(app_client_state_key,
354 kRegValueLastInstallerResultUIString,
355 &last_installer_result_uistring));
356 EXPECT_STREQ(expected_result_uistring,
357 last_installer_result_uistring);
358 } else {
359 EXPECT_FALSE(RegKey::HasValue(app_client_state_key,
360 kRegValueLastInstallerResultUIString));
361 }
362
363 if (expect_installer_launch_cmd_line) {
364 EXPECT_TRUE(RegKey::HasValue(app_client_state_key,
365 kRegValueLastInstallerSuccessLaunchCmdLine));
366 CString last_installer_launch_cmd_line;
367 EXPECT_SUCCEEDED(
368 RegKey::GetValue(app_client_state_key,
369 kRegValueLastInstallerSuccessLaunchCmdLine,
370 &last_installer_launch_cmd_line));
371 EXPECT_STREQ(expected_launch_cmd_line,
372 last_installer_launch_cmd_line);
373 } else {
374 EXPECT_FALSE(RegKey::HasValue(
375 app_client_state_key,
376 kRegValueLastInstallerSuccessLaunchCmdLine));
377 }
378 }
379
380 void VerifyNoLastRegistryValues(const CString& app_guid) {
381 VerifyLastRegistryValues(app_guid,
382 false, 0,
383 false, 0,
384 false, 0,
385 false, _T(""),
386 false, _T(""));
387 }
388
389 void CallGetInstallerResultHelper(const GUID& app_guid,
390 int installer_type,
391 uint32 exit_code,
392 InstallerResultInfo* result_info) {
393 ASSERT1(result_info);
394
395 im_->GetInstallerResultHelper(
396 app_guid,
397 static_cast<InstallerWrapper::InstallerType>(installer_type),
398 exit_code,
399 kLanguageEnglish,
400 result_info);
401 }
402
403 static const int kResultSuccess = AppManager::INSTALLER_RESULT_SUCCESS;
404 static const int kResultFailedCustomError =
405 AppManager::INSTALLER_RESULT_FAILED_CUSTOM_ERROR;
406 static const int kResultFailedMsiError =
407 AppManager::INSTALLER_RESULT_FAILED_MSI_ERROR;
408 static const int kResultFailedSystemError =
409 AppManager::INSTALLER_RESULT_FAILED_SYSTEM_ERROR;
410 static const int kResultExitCode = AppManager::INSTALLER_RESULT_EXIT_CODE;
411
412 static const int kMsiInstaller = InstallerWrapper::MSI_INSTALLER;
413 static const int kOtherInstaller = InstallerWrapper::CUSTOM_INSTALLER;
414
415 bool is_machine_;
416 CString hive_override_key_name_;
417 scoped_ptr<InstallerWrapper> im_;
418
419 // Used as an argument to various functions.
420 InstallerResultInfo result_info_;
421
422 static CPath cmd_exe_path_;
423 static CString set_installer_result_type_msi_error_cmd_;
424 };
425
426 CPath InstallerWrapperTest::cmd_exe_path_;
427 CString InstallerWrapperTest::set_installer_result_type_msi_error_cmd_;
428
429 class InstallerWrapperMachineTest : public InstallerWrapperTest {
430 protected:
431 InstallerWrapperMachineTest()
432 : InstallerWrapperTest(true) {
433 }
434 };
435
436 class InstallerWrapperUserTest : public InstallerWrapperTest {
437 protected:
438 InstallerWrapperUserTest()
439 : InstallerWrapperTest(false) {
440 }
441 };
442
443 class InstallerWrapperUserGetInstallerResultHelperTest
444 : public InstallerWrapperUserTest {
445 protected:
446 InstallerWrapperUserGetInstallerResultHelperTest()
447 : InstallerWrapperUserTest() {
448 result_info_.text = kMeaninglessErrorString;
449 }
450
451 virtual void SetUp() {
452 InstallerWrapperUserTest::SetUp();
453 AppManager::Instance()->GetRegistryStableStateLock().Lock();
454 }
455
456 virtual void TearDown() {
457 AppManager::Instance()->GetRegistryStableStateLock().Unlock();
458 InstallerWrapperUserTest::TearDown();
459 }
460
461 // Shorter names used to make test calls fit on one line.
462 static const int kMsi = kMsiInstaller;
463 static const int kOther = kOtherInstaller;
464 };
465
466 //
467 // Helper method tests
468 //
469 TEST(InstallerWrapperTest, GetMessageForSystemErrorCode) {
470 VerifyStringIsMsiPackageOpenFailedString(
471 GetMessageForSystemErrorCode(ERROR_INSTALL_PACKAGE_OPEN_FAILED));
472 }
473
474 // CheckApplicationRegistration does not read the registry. This is verified by
475 // not setting any registry values before calling it.
476
477 TEST_F(InstallerWrapperUserTest,
478 CheckApplicationRegistration_EmptyRegisteredVersion) {
479 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
480 im_->CheckApplicationRegistration(
481 kAppGuid, _T(""), _T(""), _T(""), false));
482 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
483 im_->CheckApplicationRegistration(
484 kAppGuid, _T(""), _T(""), _T(""), true));
485 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
486 im_->CheckApplicationRegistration(
487 kAppGuid, _T(""), _T("1.2.3.4"), _T(""), false));
488 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
489 im_->CheckApplicationRegistration(
490 kAppGuid, _T(""), _T("1.2.3.4"), _T(""), true));
491 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
492 im_->CheckApplicationRegistration(
493 kAppGuid, _T(""), _T("1.2.3.4"), _T("1.2.3.3"), false));
494 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
495 im_->CheckApplicationRegistration(
496 kAppGuid, _T(""), _T("1.2.3.4"), _T("1.2.3.3"), true));
497 }
498
499 TEST_F(InstallerWrapperUserTest,
500 CheckApplicationRegistration_NoExpectedOrPreviousVersion) {
501 EXPECT_SUCCEEDED(im_->CheckApplicationRegistration(
502 kAppGuid, _T("0.9.6.4"), _T(""), _T(""), false));
503 EXPECT_SUCCEEDED(im_->CheckApplicationRegistration(
504 kAppGuid, _T("0.9.6.4"), _T(""), _T(""), true));
505 }
506
507 TEST_F(InstallerWrapperUserTest,
508 CheckApplicationRegistration_ExpectedMatch_NoPreviousVersion) {
509 EXPECT_SUCCEEDED(im_->CheckApplicationRegistration(
510 kAppGuid, _T("0.9.6.4"), _T("0.9.6.4"), _T(""), false));
511 EXPECT_SUCCEEDED(im_->CheckApplicationRegistration(
512 kAppGuid, _T("0.9.6.4"), _T("0.9.6.4"), _T(""), true));
513 }
514
515 TEST_F(InstallerWrapperUserTest,
516 CheckApplicationRegistration_NoExpectedVersion_PreviousVersionOlder) {
517 EXPECT_SUCCEEDED(im_->CheckApplicationRegistration(
518 kAppGuid, _T("0.9.6.4"), _T(""), _T("0.9.6.3"), false));
519 EXPECT_SUCCEEDED(im_->CheckApplicationRegistration(
520 kAppGuid, _T("0.9.6.4"), _T(""), _T("0.9.6.3"), true));
521 }
522
523 TEST_F(InstallerWrapperUserTest,
524 CheckApplicationRegistration_ExpectedMatch_PreviousVersionSame_UnchangedA llowed) { // NOLINT
525 EXPECT_SUCCEEDED(
526 im_->CheckApplicationRegistration(
527 kAppGuid, _T("0.9.6.4"), _T(""), _T("0.9.6.4"), false));
528 EXPECT_SUCCEEDED(
529 im_->CheckApplicationRegistration(
530 kAppGuid, _T("0.9.6.4"), _T("0.9.6.4"), _T("0.9.6.4"), false));
531 }
532
533 TEST_F(InstallerWrapperUserTest,
534 CheckApplicationRegistration_ExpectedMatch_PreviousVersionSame_UnchangedN otAllowed) { // NOLINT
535 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_CHANGE_VERSION,
536 im_->CheckApplicationRegistration(
537 kAppGuid, _T("0.9.6.4"), _T(""), _T("0.9.6.4"), true));
538
539 ExpectAsserts expect_asserts; // expected_version is expected to be greater.
540 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_CHANGE_VERSION,
541 im_->CheckApplicationRegistration(
542 kAppGuid, _T("0.9.6.4"), _T("0.9.6.4"), _T("0.9.6.4"), true));
543 }
544
545 TEST_F(InstallerWrapperUserTest,
546 CheckApplicationRegistration_ExpectedMatch_PreviousVersionOlder) {
547 EXPECT_SUCCEEDED(
548 im_->CheckApplicationRegistration(
549 kAppGuid, _T("0.9.6.4"), _T("0.9.6.4"), _T("0.9.6.3"), false));
550 EXPECT_SUCCEEDED(
551 im_->CheckApplicationRegistration(
552 kAppGuid, _T("0.9.6.4"), _T("0.9.6.4"), _T("0.9.6.3"), true));
553 }
554
555 TEST_F(InstallerWrapperUserTest,
556 CheckApplicationRegistration_ExpectedMatch_PreviousVersionNewer) {
557 EXPECT_SUCCEEDED(
558 im_->CheckApplicationRegistration(
559 kAppGuid, _T("0.9.6.4"), _T("0.9.6.4"), _T("0.9.6.5"), false));
560 EXPECT_SUCCEEDED(
561 im_->CheckApplicationRegistration(
562 kAppGuid, _T("0.9.6.4"), _T("0.9.6.4"), _T("0.9.6.5"), true));
563 }
564
565 // This is the over-install when a newer version is present case. This might
566 // happen if a dev track version is installed and a stable track version is
567 // installed. For installs, this is okay.
568 TEST_F(InstallerWrapperUserTest,
569 CheckApplicationRegistration_ExpectedMatch_RegisteredNewer_NoPreviousVers ion_NewInstall) { // NOLINT
570 EXPECT_SUCCEEDED(
571 im_->CheckApplicationRegistration(
572 kAppGuid, _T("0.9.6.4"), _T("0.9.6.3"), _T(""), false));
573 }
574
575 TEST_F(InstallerWrapperUserTest,
576 CheckApplicationRegistration_ExpectedMismatch_RegisteredNewer_NoPreviousV ersion_Update) { // NOLINT
577 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
578 im_->CheckApplicationRegistration(
579 kAppGuid, _T("0.9.6.4"), _T("0.9.6.3"), _T(""), true));
580 }
581
582 // This is the over-install when a newer version is present case. This might
583 // happen if a dev track version is installed and a stable track version is
584 // installed. For installs, this is okay.
585 TEST_F(InstallerWrapperUserTest,
586 CheckApplicationRegistration_ExpectedMismatch_RegisteredNewer_PreviousVer sionSame) { // NOLINT
587 EXPECT_SUCCEEDED(
588 im_->CheckApplicationRegistration(
589 kAppGuid, _T("0.9.6.4"), _T("0.9.6.3"), _T("0.9.6.4"), false));
590 ExpectAsserts expect_asserts; // expected_version is expected to be greater.
591 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_CHANGE_VERSION,
592 im_->CheckApplicationRegistration(
593 kAppGuid, _T("0.9.6.4"), _T("0.9.6.3"), _T("0.9.6.4"), true));
594 }
595
596 TEST_F(InstallerWrapperUserTest,
597 CheckApplicationRegistration_ExpectedMismatch_RegisteredNewer_PreviousVer sionDifferent) { // NOLINT
598 EXPECT_SUCCEEDED(
599 im_->CheckApplicationRegistration(
600 kAppGuid, _T("0.9.6.4"), _T("0.9.6.3"), _T("0.9.6.3"), false));
601 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
602 im_->CheckApplicationRegistration(
603 kAppGuid, _T("0.9.6.4"), _T("0.9.6.3"), _T("0.9.6.3"), true));
604 }
605
606 TEST_F(InstallerWrapperUserTest,
607 CheckApplicationRegistration_ExpectedMismatch_RegisteredOlder_NoPreviousV ersion) { // NOLINT
608 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
609 im_->CheckApplicationRegistration(
610 kAppGuid, _T("0.9.6.2"), _T("0.9.6.3"), _T(""), false));
611 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
612 im_->CheckApplicationRegistration(
613 kAppGuid, _T("0.9.6.2"), _T("0.9.6.3"), _T(""), true));
614 }
615
616 TEST_F(InstallerWrapperUserTest,
617 CheckApplicationRegistration_ExpectedMismatch_RegisteredOlder_PreviousVer sionSame) { // NOLINT
618 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
619 im_->CheckApplicationRegistration(
620 kAppGuid, _T("0.9.6.2"), _T("0.9.6.3"), _T("0.9.6.2"), false));
621 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
622 im_->CheckApplicationRegistration(
623 kAppGuid, _T("0.9.6.2"), _T("0.9.6.3"), _T("0.9.6.2"), true));
624 }
625
626 TEST_F(InstallerWrapperUserTest,
627 CheckApplicationRegistration_ExpectedMismatch_RegisteredOlder_PreviousVer sionDifferent) { // NOLINT
628 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
629 im_->CheckApplicationRegistration(
630 kAppGuid, _T("0.9.6.2"), _T("0.9.6.3"), _T("0.9.6.1"), false));
631 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
632 im_->CheckApplicationRegistration(
633 kAppGuid, _T("0.9.6.2"), _T("0.9.6.3"), _T("0.9.6.1"), true));
634 }
635
636 TEST_F(InstallerWrapperUserTest,
637 CheckApplicationRegistration_ExpectedMismatch_RegisteredNewer_PreviousVer sionSame_UnrecognizedVersions) { // NOLINT
638 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
639 im_->CheckApplicationRegistration(
640 kAppGuid, _T("0.9.6.4.0"), _T("0.9.6.3"), _T("0.9.6.4.0"),
641 false));
642 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
643 im_->CheckApplicationRegistration(
644 kAppGuid, _T("0.9.6.4.0"), _T("0.9.6.3"), _T("0.9.6.4.0"),
645 true));
646
647 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
648 im_->CheckApplicationRegistration(
649 kAppGuid, _T("0.9.6.4"), _T("0.9.6.3.0"), _T("0.9.6.4"),
650 false));
651 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
652 im_->CheckApplicationRegistration(
653 kAppGuid, _T("0.9.6.4"), _T("0.9.6.3.0"), _T("0.9.6.4"),
654 true));
655
656 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
657 im_->CheckApplicationRegistration(
658 kAppGuid, _T("0.9.6.4.0"), _T("0.9.6.3.0"), _T("0.9.6.4.0"),
659 false));
660 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
661 im_->CheckApplicationRegistration(
662 kAppGuid, _T("0.9.6.4.0"), _T("0.9.6.3.0"), _T("0.9.6.4.0"),
663 true));
664
665 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
666 im_->CheckApplicationRegistration(
667 kAppGuid, _T("0.9.6"), _T("0.9.5"), _T("0.9.6"), false));
668 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_VERSION_MISMATCH,
669 im_->CheckApplicationRegistration(
670 kAppGuid, _T("0.9.6"), _T("0.9.5"), _T("0.9.6"), true));
671 }
672
673 //
674 // Negative Tests
675 //
676
677 TEST_F(InstallerWrapperUserTest, InstallApp_InstallerWithoutFilenameExtension) {
678 EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID,
679 im_->InstallApp(NULL,
680 kAppGuid,
681 _T("c:\\temp\\foo"),
682 _T(""), // Arguments.
683 _T(""), // Installer data.
684 kLanguageEnglish,
685 &result_info_));
686
687 EXPECT_EQ(INSTALLER_RESULT_UNKNOWN, result_info_.type);
688 EXPECT_EQ(S_OK, result_info_.code);
689 EXPECT_TRUE(result_info_.text.IsEmpty());
690 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
691 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
692 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
693 }
694
695 TEST_F(InstallerWrapperUserTest,
696 InstallApp_UnsupportedInstallerFilenameExtension) {
697 EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID,
698 im_->InstallApp(NULL,
699 kAppGuid,
700 _T("c:\\temp\\foo.bar"),
701 _T(""), // Arguments.
702 _T(""), // Installer data.
703 kLanguageEnglish,
704 &result_info_));
705
706 EXPECT_EQ(INSTALLER_RESULT_UNKNOWN, result_info_.type);
707 EXPECT_EQ(S_OK, result_info_.code);
708 EXPECT_TRUE(result_info_.text.IsEmpty());
709 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
710 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
711 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
712 }
713
714 TEST_F(InstallerWrapperUserTest, InstallApp_InstallerEmtpyFilename) {
715 EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID,
716 im_->InstallApp(NULL,
717 kAppGuid,
718 _T(""),
719 _T(""), // Arguments.
720 _T(""), // Installer data.
721 kLanguageEnglish,
722 &result_info_));
723
724 EXPECT_EQ(INSTALLER_RESULT_UNKNOWN, result_info_.type);
725 EXPECT_EQ(S_OK, result_info_.code);
726 EXPECT_TRUE(result_info_.text.IsEmpty());
727 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
728 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
729 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
730 }
731
732 TEST_F(InstallerWrapperUserTest, InstallApp_ExeFileDoesNotExist) {
733 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
734 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED_START,
735 im_->InstallApp(NULL,
736 kAppGuid,
737 _T("c:\\temp\\foo.exe"),
738 _T(""), // Arguments.
739 _T(""), // Installer data.
740 kLanguageEnglish,
741 &result_info_));
742
743 EXPECT_EQ(INSTALLER_RESULT_UNKNOWN, result_info_.type);
744 EXPECT_EQ(S_OK, result_info_.code);
745 EXPECT_TRUE(result_info_.text.IsEmpty());
746 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
747 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
748 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
749
750 EXPECT_FALSE(RegKey::HasKey(kFullAppClientsKeyPath));
751 EXPECT_FALSE(RegKey::HasKey(kFullAppClientStateKeyPath));
752 }
753
754 //
755 // EXE Installer Tests
756 //
757
758 // This test uses cmd.exe as an installer that leaves the payload
759 // kPayloadFileName.
760 TEST_F(InstallerWrapperUserTest, InstallApp_ExeInstallerWithArgumentsSucceeds) {
761 const TCHAR kPayloadFileName[] = _T("exe_payload.txt");
762 const TCHAR kCommandToExecute[] = _T("echo \"hi\" > %s");
763
764 CString full_command_to_execute;
765 full_command_to_execute.Format(kCommandToExecute, kPayloadFileName);
766 CString arguments;
767 arguments.Format(kExecuteCommandAndTerminateSwitch, full_command_to_execute);
768
769 EXPECT_SUCCEEDED(File::Remove(kPayloadFileName));
770 EXPECT_FALSE(File::Exists(kPayloadFileName));
771
772 // Create the Clients key since this isn't an actual installer.
773 EXPECT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
774 EXPECT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
775 EXPECT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
776 kRegValueProductVersion,
777 _T("0.10.69.5")));
778
779 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
780 EXPECT_SUCCEEDED(im_->InstallApp(NULL,
781 kAppGuid,
782 cmd_exe_path_,
783 arguments,
784 _T(""), // Installer data.
785 kLanguageEnglish,
786 &result_info_));
787
788 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
789 EXPECT_EQ(S_OK, result_info_.code);
790 EXPECT_TRUE(result_info_.text.IsEmpty());
791 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
792 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
793 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
794
795 // EXPECT_SUCCEEDED(
796 // im_->CheckApplicationRegistration(kAppGuid, _T("0.9.70.1"), false));
797
798 EXPECT_TRUE(File::Exists(kPayloadFileName));
799 EXPECT_SUCCEEDED(File::Remove(kPayloadFileName));
800 }
801
802 TEST_F(InstallerWrapperUserTest,
803 InstallApp_ExeInstallerReturnsNonZeroExitCode) {
804 const TCHAR kCommandToExecute[] = _T("exit 1");
805
806 CString arguments;
807 arguments.Format(kExecuteCommandAndTerminateSwitch, kCommandToExecute);
808
809 // Create the Clients key since this isn't an actual installer.
810 ASSERT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
811 ASSERT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
812 ASSERT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
813 kRegValueProductVersion,
814 _T("0.10.69.5")));
815
816 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
817 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED,
818 im_->InstallApp(NULL,
819 kAppGuid,
820 cmd_exe_path_,
821 arguments,
822 _T(""), // Installer data.
823 kLanguageEnglish,
824 &result_info_));
825
826 EXPECT_EQ(INSTALLER_RESULT_ERROR_OTHER, result_info_.type);
827 EXPECT_EQ(1, result_info_.code);
828 EXPECT_STREQ(_T("The installer encountered error 1."), result_info_.text);
829 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
830 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
831 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
832 }
833
834 /* TODO(omaha): Figure out a way to perform this test.
835 ClearInstallerResultApiValues clears the result values it sets.
836 TODO(omaha): Add another test that reports an error in using registry API.
837 // Also tests that the launch cmd is set.
838 TEST_F(InstallerWrapperUserTest,
839 InstallApp_ExeInstallerReturnsNonZeroExitCode_InstallerResultSuccess) {
840 const TCHAR kCommandToExecute[] = _T("exit 1");
841
842 CString arguments;
843 arguments.Format(kExecuteCommandAndTerminateSwitch, kCommandToExecute);
844
845 // Create the Clients key since this isn't an actual installer.
846 ASSERT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
847 ASSERT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
848 ASSERT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
849 kRegValueProductVersion,
850 _T("0.10.69.5")));
851 SetupInstallerResultRegistry(kAppId,
852 true, kResultSuccess,
853 false, 0,
854 false, _T(""),
855 true, kLaunchCmdLine);
856
857 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
858 EXPECT_SUCCEEDED(im_->InstallApp(kAppGuid,
859 cmd_exe_path_,
860 arguments,
861 _T(""), // Installer data.
862 &result_info_));
863
864 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
865 EXPECT_EQ(1, result_info_.code);
866 EXPECT_TRUE(result_info_.text.IsEmpty());
867 EXPECT_STREQ(kLaunchCmdLine, result_info_.post_install_launch_command_line);
868 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
869 EXPECT_EQ(POST_INSTALL_ACTION_LAUNCH_COMMAND,
870 result_info_.post_install_action);
871
872 EXPECT_SUCCEEDED(
873 im_->CheckApplicationRegistration(kAppGuid, _T("0.9.70.1"), false));
874
875 VerifyLastRegistryValues(kAppId,
876 true, kResultSuccess,
877 false, 0,
878 false, _T(""),
879 true, kLaunchCmdLine);
880 }
881 */
882
883 TEST_F(InstallerWrapperMachineTest, InstallApp_MsiInstallerSucceeds) {
884 if (!vista_util::IsUserAdmin()) {
885 std::wcout << _T("\tTest did not run because the user is not an admin.")
886 << std::endl;
887 return;
888 }
889 // We can't fake the registry keys because we are interacting with a real
890 // installer.
891 RestoreRegistryHives();
892
893 AdjustMsiTries(im_.get());
894
895 CString installer_full_path(
896 ConcatenatePath(app_util::GetCurrentModuleDirectory(),
897 kSetupFooV1RelativeLocation));
898 ASSERT_TRUE(File::Exists(installer_full_path));
899
900 CString installer_log_full_path;
901 installer_log_full_path.Format(kMsiLogFormat, installer_full_path);
902
903 ASSERT_SUCCEEDED(File::Remove(installer_log_full_path));
904 ASSERT_FALSE(File::Exists(installer_log_full_path));
905
906 RegKey::DeleteKey(kFullFooAppClientKeyPath);
907 ASSERT_FALSE(RegKey::HasKey(kFullFooAppClientKeyPath));
908 RegKey::DeleteKey(kFullFooAppClientStateKeyPath);
909 ASSERT_FALSE(RegKey::HasKey(kFullFooAppClientStateKeyPath));
910
911 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
912 EXPECT_SUCCEEDED(im_->InstallApp(NULL,
913 StringToGuid(kFooGuid),
914 installer_full_path,
915 _T(""), // Arguments.
916 _T(""), // Installer data.
917 kLanguageEnglish,
918 &result_info_));
919
920 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
921 EXPECT_EQ(S_OK, result_info_.code);
922 EXPECT_TRUE(result_info_.text.IsEmpty());
923 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
924 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
925 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
926
927 EXPECT_TRUE(File::Exists(installer_log_full_path));
928
929 EXPECT_TRUE(RegKey::HasKey(kFullFooAppClientKeyPath));
930 EXPECT_FALSE(RegKey::HasKey(kFullFooAppClientStateKeyPath));
931 // Verify the installer did not write a value that is to be written only in
932 // the presence of an MSI property that was not specified.
933 EXPECT_FALSE(RegKey::HasValue(kFullFooAppClientKeyPath,
934 kFooInstallerBarValueName));
935 // EXPECT_SUCCEEDED(im_->CheckApplicationRegistration(
936 // StringToGuid(kFooGuid), _T("0.9.70.1"), false));
937
938 UninstallTestMsi(installer_full_path);
939
940 EXPECT_FALSE(RegKey::HasKey(kFullFooAppClientKeyPath));
941 EXPECT_SUCCEEDED(RegKey::DeleteKey(kFullFooAppClientKeyPath));
942 }
943
944 TEST_F(InstallerWrapperMachineTest,
945 InstallApp_MsiInstallerWithArgumentSucceeds) {
946 if (!vista_util::IsUserAdmin()) {
947 std::wcout << _T("\tTest did not run because the user is not an admin.")
948 << std::endl;
949 return;
950 }
951
952 // We can't fake the registry keys because we are interacting with a real
953 // installer.
954 RestoreRegistryHives();
955
956 AdjustMsiTries(im_.get());
957
958 CString installer_full_path(
959 ConcatenatePath(app_util::GetCurrentModuleDirectory(),
960 kSetupFooV1RelativeLocation));
961 ASSERT_TRUE(File::Exists(installer_full_path));
962
963 CString installer_log_full_path;
964 installer_log_full_path.Format(kMsiLogFormat, installer_full_path);
965
966 ASSERT_SUCCEEDED(File::Remove(installer_log_full_path));
967 ASSERT_FALSE(File::Exists(installer_log_full_path));
968
969 RegKey::DeleteKey(kFullFooAppClientKeyPath);
970 ASSERT_FALSE(RegKey::HasKey(kFullFooAppClientKeyPath));
971 RegKey::DeleteKey(kFullFooAppClientStateKeyPath);
972 ASSERT_FALSE(RegKey::HasKey(kFullFooAppClientStateKeyPath));
973
974 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
975 EXPECT_SUCCEEDED(im_->InstallApp(NULL,
976 StringToGuid(kFooGuid),
977 installer_full_path,
978 kFooInstallerBarPropertyArg,
979 _T(""), // Installer data.
980 kLanguageEnglish,
981 &result_info_));
982
983 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
984 EXPECT_EQ(S_OK, result_info_.code);
985 EXPECT_TRUE(result_info_.text.IsEmpty());
986 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
987 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
988 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
989
990 EXPECT_TRUE(File::Exists(installer_log_full_path));
991
992 EXPECT_TRUE(RegKey::HasKey(kFullFooAppClientKeyPath));
993 EXPECT_FALSE(RegKey::HasKey(kFullFooAppClientStateKeyPath));
994 EXPECT_TRUE(RegKey::HasValue(kFullFooAppClientKeyPath,
995 kFooInstallerBarValueName));
996 DWORD barprop_value = 0;
997 EXPECT_SUCCEEDED(RegKey::GetValue(kFullFooAppClientKeyPath,
998 kFooInstallerBarValueName,
999 &barprop_value));
1000 EXPECT_EQ(7, barprop_value);
1001
1002 // EXPECT_SUCCEEDED(im_->CheckApplicationRegistration(
1003 // StringToGuid(kFooGuid), _T("0.9.70.1"), false));
1004
1005 UninstallTestMsi(installer_full_path);
1006
1007 EXPECT_FALSE(RegKey::HasKey(kFullFooAppClientKeyPath));
1008 EXPECT_SUCCEEDED(RegKey::DeleteKey(kFullFooAppClientKeyPath));
1009 }
1010
1011 // The use of kGoogleUpdateAppId is the key to this test.
1012 // Note that the version is not changed - this is the normal self-update case.
1013 TEST_F(InstallerWrapperUserTest, InstallApp_UpdateOmahaSucceeds) {
1014 CString arguments;
1015 arguments.Format(kExecuteCommandAndTerminateSwitch, _T(""));
1016
1017 const CString kExistingVersion(_T("0.9.69.5"));
1018
1019 // Because we don't actually run the Omaha installer, we need to make sure
1020 // its Clients key and pv value exist to avoid an error.
1021 ASSERT_SUCCEEDED(RegKey::CreateKey(USER_REG_CLIENTS_GOOPDATE));
1022 ASSERT_TRUE(RegKey::HasKey(USER_REG_CLIENTS_GOOPDATE));
1023 ASSERT_SUCCEEDED(RegKey::SetValue(USER_REG_CLIENTS_GOOPDATE,
1024 kRegValueProductVersion,
1025 kExistingVersion));
1026
1027 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
1028 EXPECT_SUCCEEDED(im_->InstallApp(NULL,
1029 kGoopdateGuid,
1030 cmd_exe_path_,
1031 arguments,
1032 _T(""), // Installer data.
1033 kLanguageEnglish,
1034 &result_info_));
1035
1036 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1037 EXPECT_EQ(S_OK, result_info_.code);
1038 EXPECT_TRUE(result_info_.text.IsEmpty());
1039 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1040 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1041 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1042
1043 EXPECT_TRUE(RegKey::HasKey(USER_REG_CLIENTS_GOOPDATE));
1044 CString version;
1045 EXPECT_SUCCEEDED(RegKey::GetValue(USER_REG_CLIENTS_GOOPDATE,
1046 kRegValueProductVersion,
1047 &version));
1048 EXPECT_STREQ(kExistingVersion, version);
1049
1050 // Do not call CheckApplicationRegistration for Omaha.
1051 }
1052
1053 // The main purpose of this test is to ensure that self-updates don't fail if
1054 // Omaha's Clients key doesn't exist for some reason.
1055 TEST_F(InstallerWrapperUserTest,
1056 InstallApp_UpdateOmahaSucceedsWhenClientsKeyAbsent) {
1057 CString arguments;
1058 arguments.Format(kExecuteCommandAndTerminateSwitch, _T(""));
1059
1060 const CString kExistingVersion(_T("0.9.69.5"));
1061
1062 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
1063 EXPECT_SUCCEEDED(im_->InstallApp(NULL,
1064 kGoopdateGuid,
1065 cmd_exe_path_,
1066 arguments,
1067 _T(""), // Installer data.
1068 kLanguageEnglish,
1069 &result_info_));
1070
1071 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1072 EXPECT_EQ(S_OK, result_info_.code);
1073 EXPECT_TRUE(result_info_.text.IsEmpty());
1074 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1075 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1076 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1077
1078 EXPECT_FALSE(RegKey::HasKey(USER_REG_CLIENTS_GOOPDATE));
1079
1080 // Do not call CheckApplicationRegistration for Omaha.
1081 }
1082
1083 TEST_F(InstallerWrapperUserTest, InstallApp_InstallerDoesNotWriteClientsKey) {
1084 CString arguments;
1085 arguments.Format(kExecuteCommandAndTerminateSwitch, _T(""));
1086
1087 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
1088 EXPECT_SUCCEEDED(im_->InstallApp(NULL,
1089 kAppGuid,
1090 cmd_exe_path_,
1091 arguments,
1092 _T(""), // Installer data.
1093 kLanguageEnglish,
1094 &result_info_));
1095
1096 EXPECT_FALSE(RegKey::HasKey(kFullAppClientsKeyPath));
1097 EXPECT_FALSE(RegKey::HasKey(kFullAppClientStateKeyPath));
1098
1099 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1100 EXPECT_EQ(S_OK, result_info_.code);
1101 EXPECT_TRUE(result_info_.text.IsEmpty());
1102 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1103 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1104 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1105
1106 // EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
1107 // im_->CheckApplicationRegistration(kAppGuid, _T(""), true));
1108 }
1109
1110 TEST_F(InstallerWrapperUserTest,
1111 InstallApp_InstallerFailureMsiFileDoesNotExist) {
1112 CPath msi_path(app_util::GetTempDir());
1113 msi_path.Append(_T("foo.msi"));
1114 const CString log_path = msi_path + _T(".log");
1115
1116 AdjustMsiTries(im_.get());
1117
1118 ASSERT_SUCCEEDED(File::Remove(log_path));
1119 ASSERT_FALSE(File::Exists(log_path));
1120
1121 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
1122 EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED,
1123 im_->InstallApp(NULL,
1124 kAppGuid,
1125 msi_path,
1126 _T(""), // Arguments.
1127 _T(""), // Installer data.
1128 kLanguageEnglish,
1129 &result_info_));
1130
1131 EXPECT_EQ(INSTALLER_RESULT_ERROR_MSI, result_info_.type);
1132 EXPECT_EQ(ERROR_INSTALL_PACKAGE_OPEN_FAILED, result_info_.code);
1133 EXPECT_STREQ(kError1619MessagePrefix,
1134 result_info_.text.Left(kError1619MessagePrefixLength));
1135 VerifyStringIsMsiPackageOpenFailedString(
1136 result_info_.text.Mid(kError1619MessagePrefixLength));
1137 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1138 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1139 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1140
1141 // msiexec creates an empty log file.
1142 EXPECT_TRUE(File::Exists(log_path));
1143 EXPECT_SUCCEEDED(File::Remove(log_path));
1144
1145 EXPECT_FALSE(RegKey::HasKey(kFullAppClientsKeyPath));
1146 EXPECT_FALSE(RegKey::HasKey(kFullAppClientStateKeyPath));
1147 }
1148
1149 // Simulates the MSI busy error by having an exe installer return the error
1150 // as its exit code and specifying MSI error using Installer Result API.
1151 // Assumes reg.exe is in the path.
1152 TEST_F(InstallerWrapperUserTest, InstallApp_MsiIsBusy_NoRetries) {
1153 CString commands;
1154 commands.Format(kExecuteTwoCommandsFormat,
1155 set_installer_result_type_msi_error_cmd_,
1156 kMsiInstallerBusyExitCodeCmd);
1157
1158 CString arguments;
1159 arguments.Format(kExecuteCommandAndTerminateSwitch, commands);
1160
1161 LowResTimer install_timer(true);
1162
1163 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
1164 EXPECT_EQ(GOOPDATEINSTALL_E_MSI_INSTALL_ALREADY_RUNNING,
1165 im_->InstallApp(NULL,
1166 kAppGuid,
1167 cmd_exe_path_,
1168 arguments,
1169 _T(""), // Installer data.
1170 kLanguageEnglish,
1171 &result_info_));
1172
1173 EXPECT_GT(2, install_timer.GetSeconds()); // Check Omaha did not retry.
1174
1175 EXPECT_EQ(INSTALLER_RESULT_ERROR_MSI, result_info_.type);
1176 EXPECT_EQ(ERROR_INSTALL_ALREADY_RUNNING, result_info_.code);
1177 EXPECT_STREQ(kError1618MessagePrefix,
1178 result_info_.text.Left(kError1618MessagePrefixLength));
1179 VerifyStringIsMsiBusyString(
1180 result_info_.text.Mid(kError1618MessagePrefixLength));
1181 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1182 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1183 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1184 }
1185
1186 // This test takes at least 5 seconds, so it is not run all the time.
1187 TEST_F(InstallerWrapperUserTest, InstallApp_MsiIsBusy_TwoTries) {
1188 if (!ShouldRunLargeTest()) {
1189 return;
1190 }
1191
1192 CString commands;
1193 commands.Format(kExecuteTwoCommandsFormat,
1194 set_installer_result_type_msi_error_cmd_,
1195 kMsiInstallerBusyExitCodeCmd);
1196
1197 CString arguments;
1198 arguments.Format(kExecuteCommandAndTerminateSwitch, commands);
1199
1200 im_->set_num_tries_when_msi_busy(2);
1201
1202 LowResTimer install_timer(true);
1203
1204 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
1205 EXPECT_EQ(GOOPDATEINSTALL_E_MSI_INSTALL_ALREADY_RUNNING,
1206 im_->InstallApp(NULL,
1207 kAppGuid,
1208 cmd_exe_path_,
1209 arguments,
1210 _T(""), // Installer data.
1211 kLanguageEnglish,
1212 &result_info_));
1213
1214 EXPECT_LE(5, install_timer.GetSeconds()); // Check Omaha did retry.
1215 EXPECT_GT(10, install_timer.GetSeconds());
1216
1217 EXPECT_EQ(INSTALLER_RESULT_ERROR_MSI, result_info_.type);
1218 EXPECT_EQ(ERROR_INSTALL_ALREADY_RUNNING, result_info_.code);
1219 EXPECT_STREQ(kError1618MessagePrefix,
1220 result_info_.text.Left(kError1618MessagePrefixLength));
1221 VerifyStringIsMsiBusyString(
1222 result_info_.text.Mid(kError1618MessagePrefixLength));
1223 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1224 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1225 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1226 }
1227
1228 // This test uses cmd.exe as an installer that leaves the payload files.
1229 TEST_F(InstallerWrapperUserTest, InstallApp_InstallMultipleApps) {
1230 const TCHAR kPayloadFileName1[] = _T("exe_payload1.txt");
1231 const TCHAR kPayloadFileName2[] = _T("exe_payload2.txt");
1232 const TCHAR kCommandToExecute[] = _T("echo \"hi\" > %s");
1233
1234 CString full_command_to_execute;
1235 full_command_to_execute.Format(kCommandToExecute, kPayloadFileName1);
1236 CString arguments1;
1237 arguments1.Format(kExecuteCommandAndTerminateSwitch, full_command_to_execute);
1238
1239 full_command_to_execute.Format(kCommandToExecute, kPayloadFileName2);
1240 CString arguments2;
1241 arguments2.Format(kExecuteCommandAndTerminateSwitch, full_command_to_execute);
1242
1243 EXPECT_SUCCEEDED(File::Remove(kPayloadFileName1));
1244 EXPECT_FALSE(File::Exists(kPayloadFileName1));
1245 EXPECT_SUCCEEDED(File::Remove(kPayloadFileName2));
1246 EXPECT_FALSE(File::Exists(kPayloadFileName2));
1247
1248 // Create the Clients key since this isn't an actual installer.
1249 EXPECT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
1250 EXPECT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
1251 EXPECT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
1252 kRegValueProductVersion,
1253 _T("0.10.69.5")));
1254
1255 __mutexScope(AppManager::Instance()->GetRegistryStableStateLock());
1256
1257 EXPECT_SUCCEEDED(im_->InstallApp(NULL,
1258 kAppGuid,
1259 cmd_exe_path_,
1260 arguments1,
1261 _T(""), // Installer data.
1262 kLanguageEnglish,
1263 &result_info_));
1264
1265 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1266 EXPECT_EQ(S_OK, result_info_.code);
1267 EXPECT_TRUE(result_info_.text.IsEmpty());
1268 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1269 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1270 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1271
1272 // EXPECT_SUCCEEDED(
1273 // im_->CheckApplicationRegistration(kAppGuid, _T("0.9.70.1"), false));
1274
1275 EXPECT_TRUE(File::Exists(kPayloadFileName1));
1276 EXPECT_SUCCEEDED(File::Remove(kPayloadFileName1));
1277
1278 // Run the second installer.
1279
1280 result_info_.type = INSTALLER_RESULT_UNKNOWN;
1281 result_info_.code = kInitialErrorValue;
1282
1283 EXPECT_SUCCEEDED(im_->InstallApp(NULL,
1284 kAppGuid,
1285 cmd_exe_path_,
1286 arguments2,
1287 _T(""), // Installer data.
1288 kLanguageEnglish,
1289 &result_info_));
1290
1291 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1292 EXPECT_EQ(S_OK, result_info_.code);
1293 EXPECT_TRUE(result_info_.text.IsEmpty());
1294 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1295 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1296 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1297
1298 // EXPECT_SUCCEEDED(
1299 // im_->CheckApplicationRegistration(kAppGuid, _T("0.9.70.1"), false));
1300
1301 EXPECT_TRUE(File::Exists(kPayloadFileName2));
1302 EXPECT_SUCCEEDED(File::Remove(kPayloadFileName2));
1303 }
1304
1305 //
1306 // GetInstallerResultHelper tests
1307 //
1308
1309 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1310 GetInstallerResultHelper_NoRegistry_MSI_ZeroExitCode) {
1311 CallGetInstallerResultHelper(kAppGuid, kMsi, 0, &result_info_);
1312
1313 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1314 EXPECT_EQ(0, result_info_.code);
1315 EXPECT_TRUE(result_info_.text.IsEmpty());
1316 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1317 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1318 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1319
1320 VerifyNoLastRegistryValues(kAppId);
1321 }
1322
1323 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1324 GetInstallerResultHelper_NoRegistry_MSI_NonZeroExitCode) {
1325 CallGetInstallerResultHelper(kAppGuid, kMsi, 1603, &result_info_);
1326
1327 EXPECT_EQ(INSTALLER_RESULT_ERROR_MSI, result_info_.type);
1328 EXPECT_EQ(1603, result_info_.code);
1329 EXPECT_STREQ(kError1603Text, result_info_.text);
1330 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1331 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1332 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1333
1334 VerifyNoLastRegistryValues(kAppId);
1335 }
1336
1337 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1338 GetInstallerResultHelper_NoRegistry_EXE_ZeroExitCode) {
1339 CallGetInstallerResultHelper(kAppGuid, kOther, 0, &result_info_);
1340
1341 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1342 EXPECT_EQ(0, result_info_.code);
1343 EXPECT_TRUE(result_info_.text.IsEmpty());
1344 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1345 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1346 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1347
1348 VerifyNoLastRegistryValues(kAppId);
1349 }
1350
1351 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1352 GetInstallerResultHelper_NoRegistry_EXE_NonZeroExitCode_SmallNumber) {
1353 CallGetInstallerResultHelper(kAppGuid, kOther, 8, &result_info_);
1354
1355 EXPECT_EQ(INSTALLER_RESULT_ERROR_OTHER, result_info_.type);
1356 EXPECT_EQ(8, result_info_.code);
1357 EXPECT_STREQ(_T("The installer encountered error 8."), result_info_.text);
1358 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1359 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1360 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1361
1362 VerifyNoLastRegistryValues(kAppId);
1363 }
1364
1365 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1366 GetInstallerResultHelper_NoRegistry_EXE_NonZeroExitCode_HRESULTFailure) {
1367 CallGetInstallerResultHelper(kAppGuid, kOther, 0x80004005, &result_info_);
1368
1369 EXPECT_EQ(INSTALLER_RESULT_ERROR_OTHER, result_info_.type);
1370 EXPECT_EQ(0x80004005, result_info_.code);
1371 EXPECT_STREQ(_T("The installer encountered error 0x80004005."),
1372 result_info_.text);
1373 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1374 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1375 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1376
1377 VerifyNoLastRegistryValues(kAppId);
1378 }
1379
1380 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1381 GetInstallerResultHelper_ExitCode_MSI) {
1382 SetupInstallerResultRegistry(kAppId,
1383 true, kResultExitCode,
1384 false, 0,
1385 false, 0,
1386 false, _T(""),
1387 false, _T(""));
1388
1389 CallGetInstallerResultHelper(kAppGuid, kMsi, 1603, &result_info_);
1390
1391 EXPECT_EQ(INSTALLER_RESULT_ERROR_MSI, result_info_.type);
1392 EXPECT_EQ(1603, result_info_.code);
1393 EXPECT_STREQ(kError1603Text, result_info_.text);
1394 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1395 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1396 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1397
1398 VerifyLastRegistryValues(kAppId,
1399 true, kResultExitCode,
1400 false, 0,
1401 false, 0,
1402 false, _T(""),
1403 false, _T(""));
1404 }
1405
1406 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1407 GetInstallerResultHelper_NoRegistry_MSI_RebootRequired) {
1408 CallGetInstallerResultHelper(kAppGuid, kMsi, ERROR_SUCCESS_REBOOT_REQUIRED,
1409 &result_info_);
1410
1411 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1412 EXPECT_EQ(0, result_info_.code);
1413 EXPECT_TRUE(result_info_.text.IsEmpty());
1414 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1415 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1416 EXPECT_EQ(POST_INSTALL_ACTION_REBOOT, result_info_.post_install_action);
1417
1418 VerifyNoLastRegistryValues(kAppId);
1419 }
1420
1421 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1422 GetInstallerResultHelper_SystemError_EXE_RebootRequired) {
1423 SetupInstallerResultRegistry(kAppId,
1424 true, kResultFailedSystemError,
1425 true, ERROR_SUCCESS_REBOOT_REQUIRED,
1426 false, 0,
1427 false, _T(""),
1428 true, kLaunchCmdLine);
1429
1430 CallGetInstallerResultHelper(kAppGuid, kOther, 1, &result_info_);
1431
1432 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1433 EXPECT_EQ(0, result_info_.code);
1434 EXPECT_TRUE(result_info_.text.IsEmpty());
1435 EXPECT_EQ(POST_INSTALL_ACTION_REBOOT, result_info_.post_install_action);
1436
1437 VerifyLastRegistryValues(kAppId,
1438 true, kResultFailedSystemError,
1439 true, ERROR_SUCCESS_REBOOT_REQUIRED,
1440 false, 0,
1441 false, _T(""),
1442 true, kLaunchCmdLine);
1443 }
1444
1445 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1446 GetInstallerResultHelper_CustomError_ShouldNotReboot) {
1447 SetupInstallerResultRegistry(kAppId,
1448 true, kResultFailedCustomError,
1449 true, ERROR_SUCCESS_REBOOT_REQUIRED,
1450 false, 0,
1451 false, _T(""),
1452 false, _T(""));
1453
1454 CallGetInstallerResultHelper(kAppGuid, kMsi, 0, &result_info_);
1455
1456 EXPECT_EQ(INSTALLER_RESULT_ERROR_OTHER, result_info_.type);
1457 EXPECT_EQ(ERROR_SUCCESS_REBOOT_REQUIRED, result_info_.code);
1458 EXPECT_STREQ(_T("The installer encountered error 3010."), result_info_.text);
1459 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1460 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1461 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1462 }
1463
1464 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1465 GetInstallerResultHelper_Success_NoErrorCode) {
1466 SetupInstallerResultRegistry(kAppId,
1467 true, kResultSuccess,
1468 false, 0,
1469 false, 0,
1470 false, _T(""),
1471 false, _T(""));
1472
1473 CallGetInstallerResultHelper(kAppGuid, kOther, 99, &result_info_);
1474
1475 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1476 EXPECT_EQ(99, result_info_.code);
1477 EXPECT_TRUE(result_info_.text.IsEmpty());
1478 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1479 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1480 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1481
1482 VerifyLastRegistryValues(kAppId,
1483 true, kResultSuccess,
1484 false, 0,
1485 false, 0,
1486 false, _T(""),
1487 false, _T(""));
1488 }
1489
1490 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1491 GetInstallerResultHelper_Success_AllValues) {
1492 SetupInstallerResultRegistry(kAppId,
1493 true, kResultSuccess,
1494 true, 555,
1495 false, 0,
1496 true, _T("an ignored error"),
1497 true, kLaunchCmdLine);
1498
1499 CallGetInstallerResultHelper(kAppGuid, kOther, 99, &result_info_);
1500
1501 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1502 EXPECT_EQ(555, result_info_.code) <<
1503 _T("InstallerError overwrites exit code.");
1504 EXPECT_FALSE(result_info_.text.IsEmpty()) <<
1505 _T("UIString is ignored for Success.");
1506 EXPECT_STREQ(kLaunchCmdLine, result_info_.post_install_launch_command_line);
1507 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1508 EXPECT_EQ(POST_INSTALL_ACTION_LAUNCH_COMMAND,
1509 result_info_.post_install_action);
1510
1511 VerifyLastRegistryValues(kAppId,
1512 true, kResultSuccess,
1513 true, 555,
1514 false, 0,
1515 true, _T("an ignored error"),
1516 true, kLaunchCmdLine);
1517 }
1518
1519 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1520 GetInstallerResultHelper_LaunchCmdOnly_MSI_ZeroExitCode) {
1521 SetupInstallerResultRegistry(kAppId,
1522 false, 0,
1523 false, 0,
1524 false, 0,
1525 false, _T(""),
1526 true, kLaunchCmdLine);
1527
1528 CallGetInstallerResultHelper(kAppGuid, kMsi, 0, &result_info_);
1529
1530 EXPECT_EQ(INSTALLER_RESULT_SUCCESS, result_info_.type);
1531 EXPECT_EQ(0, result_info_.code);
1532 EXPECT_TRUE(result_info_.text.IsEmpty());
1533 EXPECT_STREQ(kLaunchCmdLine, result_info_.post_install_launch_command_line);
1534 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1535 EXPECT_EQ(POST_INSTALL_ACTION_LAUNCH_COMMAND,
1536 result_info_.post_install_action);
1537
1538 VerifyLastRegistryValues(kAppId,
1539 false, 0,
1540 false, 0,
1541 false, 0,
1542 false, _T(""),
1543 true, kLaunchCmdLine);
1544 }
1545
1546 // Exit code is used when no error code is present. It's interpreted as a system
1547 // error even though the installer is not an MSI.
1548 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1549 GetInstallerResultHelper_Failed_NoErrorCodeOrUiString) {
1550 SetupInstallerResultRegistry(kAppId,
1551 true, kResultFailedCustomError,
1552 false, 0,
1553 false, 0,
1554 false, _T(""),
1555 false, _T(""));
1556
1557 CallGetInstallerResultHelper(kAppGuid, kOther, 8, &result_info_);
1558
1559 EXPECT_EQ(INSTALLER_RESULT_ERROR_OTHER, result_info_.type);
1560 EXPECT_EQ(8, result_info_.code);
1561 EXPECT_STREQ(_T("The installer encountered error 8."), result_info_.text);
1562 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1563 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1564 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1565
1566 VerifyLastRegistryValues(kAppId,
1567 true, kResultFailedCustomError,
1568 false, 0,
1569 false, 0,
1570 false, _T(""),
1571 false, _T(""));
1572 }
1573
1574 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1575 GetInstallerResultHelper_Failed_WithErrorCode) {
1576 SetupInstallerResultRegistry(kAppId,
1577 true, kResultFailedCustomError,
1578 true, 8,
1579 false, 0,
1580 false, _T(""),
1581 false, _T(""));
1582
1583 CallGetInstallerResultHelper(kAppGuid, kOther, 1618, &result_info_);
1584
1585 EXPECT_EQ(INSTALLER_RESULT_ERROR_OTHER, result_info_.type);
1586 EXPECT_EQ(8, result_info_.code);
1587 EXPECT_STREQ(_T("The installer encountered error 8."), result_info_.text);
1588 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1589 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1590 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1591
1592 VerifyLastRegistryValues(kAppId,
1593 true, kResultFailedCustomError,
1594 true, 8,
1595 false, 0,
1596 false, _T(""),
1597 false, _T(""));
1598 }
1599
1600 // This test shows that command line is read and
1601 // POST_INSTALL_ACTION_LAUNCH_COMMAND is set.
1602 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1603 GetInstallerResultHelper_Failed_AllValues) {
1604 const DWORD kInstallerErrorValue = 8;
1605 const TCHAR* const kUiString = _T("a message from the installer");
1606
1607 SetupInstallerResultRegistry(kAppId,
1608 true, kResultFailedCustomError,
1609 true, kInstallerErrorValue,
1610 false, 0,
1611 true, kUiString,
1612 true, kLaunchCmdLine);
1613
1614 CallGetInstallerResultHelper(kAppGuid, kOther, 1618, &result_info_);
1615
1616 EXPECT_EQ(INSTALLER_RESULT_ERROR_OTHER, result_info_.type);
1617 EXPECT_EQ(kInstallerErrorValue, result_info_.code);
1618 EXPECT_STREQ(kUiString, result_info_.text);
1619 EXPECT_STREQ(kLaunchCmdLine, result_info_.post_install_launch_command_line);
1620 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1621 EXPECT_EQ(POST_INSTALL_ACTION_LAUNCH_COMMAND,
1622 result_info_.post_install_action);
1623
1624 VerifyLastRegistryValues(kAppId,
1625 true, kResultFailedCustomError,
1626 true, kInstallerErrorValue,
1627 false, 0,
1628 true, kUiString,
1629 true, kLaunchCmdLine);
1630 }
1631
1632 // Exit code is used and interpreted as MSI error when no error code present.
1633 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1634 GetInstallerResultHelper_FailedMsiError_NoErrorCode) {
1635 SetupInstallerResultRegistry(kAppId,
1636 true, kResultFailedMsiError,
1637 false, 0,
1638 false, 0,
1639 false, _T(""),
1640 false, _T(""));
1641
1642 CallGetInstallerResultHelper(kAppGuid, kOther, 1603, &result_info_);
1643
1644 EXPECT_EQ(INSTALLER_RESULT_ERROR_MSI, result_info_.type);
1645 EXPECT_EQ(1603, result_info_.code);
1646 EXPECT_STREQ(kError1603Text, result_info_.text);
1647 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1648 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1649 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1650
1651 VerifyLastRegistryValues(kAppId,
1652 true, kResultFailedMsiError,
1653 false, 0,
1654 false, 0,
1655 false, _T(""),
1656 false, _T(""));
1657 }
1658
1659 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1660 GetInstallerResultHelper_FailedMsiError_WithErrorCode) {
1661 const DWORD kInstallerErrorValue = 1603;
1662
1663 SetupInstallerResultRegistry(kAppId,
1664 true, kResultFailedMsiError,
1665 true, kInstallerErrorValue,
1666 false, 0,
1667 false, _T(""),
1668 false, _T(""));
1669
1670 CallGetInstallerResultHelper(kAppGuid, kOther, 1618, &result_info_);
1671
1672 EXPECT_EQ(INSTALLER_RESULT_ERROR_MSI, result_info_.type);
1673 EXPECT_EQ(kInstallerErrorValue, result_info_.code);
1674 EXPECT_STREQ(kError1603Text, result_info_.text);
1675 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1676 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1677 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1678
1679 VerifyLastRegistryValues(kAppId,
1680 true, kResultFailedMsiError,
1681 true, kInstallerErrorValue,
1682 false, 0,
1683 false, _T(""),
1684 false, _T(""));
1685 }
1686
1687 // This test shows that command line is read and
1688 // POST_INSTALL_ACTION_LAUNCH_COMMAND is set.
1689 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1690 GetInstallerResultHelper_FailedMsiError_AllValues) {
1691 const DWORD kInstallerErrorValue = 1603;
1692
1693 SetupInstallerResultRegistry(kAppId,
1694 true, kResultFailedMsiError,
1695 true, kInstallerErrorValue,
1696 false, 0,
1697 true, _T("an ignored error"),
1698 true, kLaunchCmdLine);
1699
1700 CallGetInstallerResultHelper(kAppGuid, kOther, 1618, &result_info_);
1701
1702 EXPECT_EQ(INSTALLER_RESULT_ERROR_MSI, result_info_.type);
1703 EXPECT_EQ(kInstallerErrorValue, result_info_.code);
1704 EXPECT_STREQ(kError1603Text, result_info_.text) << _T("UIString is ignored.");
1705 EXPECT_STREQ(kLaunchCmdLine, result_info_.post_install_launch_command_line);
1706 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1707 EXPECT_EQ(POST_INSTALL_ACTION_LAUNCH_COMMAND,
1708 result_info_.post_install_action);
1709
1710 VerifyLastRegistryValues(kAppId,
1711 true, kResultFailedMsiError,
1712 true, kInstallerErrorValue,
1713 false, 0,
1714 true, _T("an ignored error"),
1715 true, kLaunchCmdLine);
1716 }
1717
1718 // Exit code is used and interpreted as system error when no error code present.
1719 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1720 GetInstallerResultHelper_FailedSystemError_NoErrorCode) {
1721 SetupInstallerResultRegistry(kAppId,
1722 true, kResultFailedSystemError,
1723 false, 0,
1724 false, 0,
1725 false, _T(""),
1726 false, _T(""));
1727
1728 CallGetInstallerResultHelper(kAppGuid, kOther, 1603, &result_info_);
1729
1730 EXPECT_EQ(INSTALLER_RESULT_ERROR_SYSTEM, result_info_.type);
1731 EXPECT_EQ(1603, result_info_.code);
1732 EXPECT_STREQ(kError1603Text, result_info_.text);
1733 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1734 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1735 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1736
1737 VerifyLastRegistryValues(kAppId,
1738 true, kResultFailedSystemError,
1739 false, 0,
1740 false, 0,
1741 false, _T(""),
1742 false, _T(""));
1743 }
1744
1745 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1746 GetInstallerResultHelper_FailedSystemError_WithErrorCode) {
1747 const DWORD kInstallerErrorValue = 1603;
1748
1749 SetupInstallerResultRegistry(kAppId,
1750 true, kResultFailedSystemError,
1751 true, kInstallerErrorValue,
1752 false, 0,
1753 false, _T(""),
1754 false, _T(""));
1755
1756 CallGetInstallerResultHelper(kAppGuid, kOther, 1618, &result_info_);
1757
1758 EXPECT_EQ(INSTALLER_RESULT_ERROR_SYSTEM, result_info_.type);
1759 EXPECT_EQ(kInstallerErrorValue, result_info_.code);
1760 EXPECT_STREQ(kError1603Text, result_info_.text);
1761 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1762 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1763 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1764
1765 VerifyLastRegistryValues(kAppId,
1766 true, kResultFailedSystemError,
1767 true, kInstallerErrorValue,
1768 false, 0,
1769 false, _T(""),
1770 false, _T(""));
1771 }
1772
1773 // INSTALLER_RESULT_FAILED_SYSTEM_ERROR supports values beyond the basic
1774 // "System Error Codes" and their HRESULT equivalents.
1775 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1776 GetInstallerResultHelper_FailedSystemError_WithHRESULTSystemError) {
1777 const DWORD kInstallerErrorValue = 0x800B010F;
1778
1779 SetupInstallerResultRegistry(kAppId,
1780 true, kResultFailedSystemError,
1781 true, kInstallerErrorValue,
1782 false, 0,
1783 false, _T(""),
1784 false, _T(""));
1785
1786 CallGetInstallerResultHelper(kAppGuid, kOther, 1618, &result_info_);
1787
1788 EXPECT_EQ(INSTALLER_RESULT_ERROR_SYSTEM, result_info_.type);
1789 EXPECT_EQ(kInstallerErrorValue, result_info_.code);
1790 EXPECT_STREQ(kError0x800B010FText, result_info_.text);
1791 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1792 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1793 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1794
1795 VerifyLastRegistryValues(kAppId,
1796 true, kResultFailedSystemError,
1797 true, kInstallerErrorValue,
1798 false, 0,
1799 false, _T(""),
1800 false, _T(""));
1801 }
1802
1803 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1804 GetInstallerResultHelper_FailedSystemError_WithUnrecognizedError) {
1805 const DWORD kInstallerErrorValue = 0x80040200;
1806
1807 SetupInstallerResultRegistry(kAppId,
1808 true, kResultFailedSystemError,
1809 true, kInstallerErrorValue,
1810 false, 0,
1811 false, _T(""),
1812 false, _T(""));
1813
1814 CallGetInstallerResultHelper(kAppGuid, kOther, 1618, &result_info_);
1815
1816 EXPECT_EQ(INSTALLER_RESULT_ERROR_SYSTEM, result_info_.type);
1817 EXPECT_EQ(kInstallerErrorValue, result_info_.code);
1818 EXPECT_STREQ(_T("The installer encountered error 0x80040200."),
1819 result_info_.text);
1820 EXPECT_TRUE(result_info_.post_install_launch_command_line.IsEmpty());
1821 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1822 EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info_.post_install_action);
1823
1824 VerifyLastRegistryValues(kAppId,
1825 true, kResultFailedSystemError,
1826 true, kInstallerErrorValue,
1827 false, 0,
1828 false, _T(""),
1829 false, _T(""));
1830 }
1831
1832 // This test shows that command line is read and
1833 // POST_INSTALL_ACTION_LAUNCH_COMMAND is set.
1834 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1835 GetInstallerResultHelper_FailedSystemError_AllValues) {
1836 const DWORD kInstallerErrorValue = 1603;
1837
1838 SetupInstallerResultRegistry(kAppId,
1839 true, kResultFailedSystemError,
1840 true, kInstallerErrorValue,
1841 false, 0,
1842 true, _T("an ignored error"),
1843 true, kLaunchCmdLine);
1844
1845 CallGetInstallerResultHelper(kAppGuid, kOther, 1618, &result_info_);
1846
1847 EXPECT_EQ(INSTALLER_RESULT_ERROR_SYSTEM, result_info_.type);
1848 EXPECT_EQ(kInstallerErrorValue, result_info_.code);
1849 EXPECT_STREQ(kError1603Text, result_info_.text) << _T("UIString is ignored.");
1850 EXPECT_STREQ(kLaunchCmdLine, result_info_.post_install_launch_command_line);
1851 EXPECT_TRUE(result_info_.post_install_url.IsEmpty());
1852 EXPECT_EQ(POST_INSTALL_ACTION_LAUNCH_COMMAND,
1853 result_info_.post_install_action);
1854
1855 VerifyLastRegistryValues(kAppId,
1856 true, kResultFailedSystemError,
1857 true, kInstallerErrorValue,
1858 false, 0,
1859 true, _T("an ignored error"),
1860 true, kLaunchCmdLine);
1861 }
1862
1863 TEST_F(InstallerWrapperUserGetInstallerResultHelperTest,
1864 GetInstallerResultHelper_ExtraCode1) {
1865 const DWORD kInstallerErrorValue = 10;
1866 const DWORD kInstallerExtraCode1 = 0xabcd;
1867
1868 SetupInstallerResultRegistry(kAppId,
1869 true, kResultFailedCustomError,
1870 true, kInstallerErrorValue,
1871 true, kInstallerExtraCode1,
1872 false, _T(""),
1873 false, _T(""));
1874
1875 CallGetInstallerResultHelper(kAppGuid,
1876 kOther,
1877 kInstallerErrorValue,
1878 &result_info_);
1879
1880 EXPECT_EQ(INSTALLER_RESULT_ERROR_OTHER, result_info_.type);
1881 EXPECT_EQ(kInstallerErrorValue, result_info_.code);
1882 EXPECT_EQ(kInstallerExtraCode1, result_info_.extra_code1);
1883
1884 VerifyLastRegistryValues(kAppId,
1885 true, kResultFailedCustomError,
1886 true, kInstallerErrorValue,
1887 true, kInstallerExtraCode1,
1888 false, _T(""),
1889 false, _T(""));
1890 }
1891
1892 // TODO(omaha): Add a machine test.
1893
1894 } // namespace omaha
OLDNEW
« no previous file with comments | « goopdate/installer_wrapper.cc ('k') | goopdate/job_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698