| Index: goopdate/install_manager_unittest.cc
|
| diff --git a/goopdate/install_manager_unittest.cc b/goopdate/install_manager_unittest.cc
|
| deleted file mode 100644
|
| index 96f0f7946e3b7d1fe8c77ed1dbff4075ebdfd8b9..0000000000000000000000000000000000000000
|
| --- a/goopdate/install_manager_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1143 +0,0 @@
|
| -// Copyright 2007-2010 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -
|
| -#include <atlpath.h>
|
| -#include <atlstr.h>
|
| -#include "base/scoped_ptr.h"
|
| -#include "omaha/base/app_util.h"
|
| -#include "omaha/base/error.h"
|
| -#include "omaha/base/file.h"
|
| -#include "omaha/base/path.h"
|
| -#include "omaha/base/reg_key.h"
|
| -#include "omaha/base/scoped_ptr_address.h"
|
| -#include "omaha/base/shell.h"
|
| -#include "omaha/base/synchronized.h"
|
| -#include "omaha/base/system.h"
|
| -#include "omaha/base/timer.h"
|
| -#include "omaha/base/utils.h"
|
| -#include "omaha/base/vistautil.h"
|
| -#include "omaha/common/const_goopdate.h"
|
| -#include "omaha/common/goopdate_utils.h"
|
| -#include "omaha/common/install_manifest.h"
|
| -#include "omaha/common/ping_event.h"
|
| -#include "omaha/goopdate/app_bundle_state_initialized.h"
|
| -#include "omaha/goopdate/app_state_waiting_to_install.h"
|
| -#include "omaha/goopdate/app_unittest_base.h"
|
| -#include "omaha/goopdate/installer_wrapper.h"
|
| -#include "omaha/goopdate/install_manager.h"
|
| -#include "omaha/testing/unit_test.h"
|
| -
|
| -using ::testing::_;
|
| -using ::testing::Return;
|
| -
|
| -namespace omaha {
|
| -
|
| -// TODO(omaha): there is a problem with this unit test. The model is built
|
| -// bottom up. This makes it impossible to set the references to parents. Will
|
| -// have to fix the code, eventually using Builder DP to create a bunch of
|
| -// models containing bundles, apps, and such.
|
| -
|
| -namespace {
|
| -
|
| -const TCHAR kAppId[] = _T("{B18BC01B-E0BD-4BF0-A33E-1133055E5FDE}");
|
| -const GUID kAppGuid = {0xB18BC01B, 0xE0BD, 0x4BF0,
|
| - {0xA3, 0x3E, 0x11, 0x33, 0x05, 0x5E, 0x5F, 0xDE}};
|
| -const TCHAR kApp2Id[] = _T("{85794B39-42E5-457c-B567-4A0F2A0FB272}");
|
| -
|
| -const TCHAR kFullAppClientsKeyPath[] =
|
| - _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
|
| - _T("\\Clients\\{B18BC01B-E0BD-4BF0-A33E-1133055E5FDE}");
|
| -const TCHAR kFullAppClientStateKeyPath[] =
|
| - _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
|
| - _T("\\ClientState\\{B18BC01B-E0BD-4BF0-A33E-1133055E5FDE}");
|
| -const TCHAR kFullFooAppClientKeyPath[] =
|
| - _T("HKLM\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
|
| - _T("\\Clients\\{D6B08267-B440-4C85-9F79-E195E80D9937}");
|
| -const TCHAR kFullFooAppClientStateKeyPath[] =
|
| - _T("HKLM\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
|
| - _T("\\ClientState\\{D6B08267-B440-4C85-9F79-E195E80D9937}");
|
| -
|
| -const TCHAR kFullApp2ClientsKeyPath[] =
|
| - _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
|
| - _T("\\Clients\\{85794B39-42E5-457c-B567-4A0F2A0FB272}");
|
| -
|
| -const TCHAR kSetupFooV1RelativeLocation[] =
|
| - _T("unittest_support\\test_foo_v1.0.101.0.msi");
|
| -const TCHAR kFooId[] = _T("{D6B08267-B440-4C85-9F79-E195E80D9937}");
|
| -const TCHAR kFooVersion[] = _T("1.0.101.0");
|
| -const TCHAR kFooInstallerBarPropertyArg[] = _T("PROPBAR=7");
|
| -const TCHAR kFooInstallerBarValueName[] = _T("propbar");
|
| -
|
| -// Values related to using cmd.exe as an "installer".
|
| -const TCHAR kCmdExecutable[] = _T("cmd.exe");
|
| -const TCHAR kExecuteCommandAndTerminateSwitch[] = _T("/c %s");
|
| -const TCHAR kExecuteTwoCommandsFormat[] = _T("\"%s & %s\"");
|
| -
|
| -const TCHAR kMsiInstallerBusyErrorMessage[] =
|
| - _T("Installation failed because the Windows Installer is busy. Please ")
|
| - _T("wait for any installers to finish, close all installer windows, and ")
|
| - _T("try installing again. If this problem persists, you may need ")
|
| - _T("to reboot your computer.");
|
| -
|
| -const TCHAR kMsiLogFormat[] = _T("%s.log");
|
| -
|
| -// brand, InstallTime, and LastCheckSuccess are automatically populated.
|
| -const int kNumAutoPopulatedValues = 3;
|
| -
|
| -} // namespace
|
| -
|
| -// Values and functions in installer_wrapper_unittest.cc.
|
| -extern const TCHAR kRegExecutable[];
|
| -extern const TCHAR kSetInstallerResultTypeMsiErrorRegCmdArgs[];
|
| -extern const TCHAR kMsiInstallerBusyExitCodeCmd[];
|
| -extern const TCHAR kError1619MessagePrefix[];
|
| -extern const int kError1619MessagePrefixLength;
|
| -void VerifyStringIsMsiPackageOpenFailedString(const CString& str);
|
| -void UninstallTestMsi(const CString& installer_path);
|
| -void AdjustMsiTries(InstallerWrapper* installer_wrapper);
|
| -
|
| -// TODO(omaha3): Test the rest of InstallManager.
|
| -class InstallManagerTest : public testing::Test {
|
| - virtual void SetUp() {}
|
| - virtual void TearDown() {}
|
| -};
|
| -
|
| -class InstallManagerInstallAppTest : public AppTestBaseWithRegistryOverride {
|
| - protected:
|
| - explicit InstallManagerInstallAppTest(bool is_machine)
|
| - : AppTestBaseWithRegistryOverride(is_machine, false) {}
|
| -
|
| - static void SetUpTestCase() {
|
| - CString system_path;
|
| - EXPECT_SUCCEEDED(Shell::GetSpecialFolder(CSIDL_SYSTEM,
|
| - false,
|
| - &system_path));
|
| - EXPECT_FALSE(system_path.IsEmpty());
|
| - cmd_exe_dir_ += system_path;
|
| -
|
| - CPath cmd_exe_path;
|
| - cmd_exe_path.Combine(system_path, kCmdExecutable);
|
| - EXPECT_TRUE(File::Exists(cmd_exe_path));
|
| -
|
| - CPath reg_path;
|
| - reg_path.Combine(system_path, kRegExecutable);
|
| - set_installer_result_type_msi_error_cmd_.Format(
|
| - _T("%s %s"),
|
| - reg_path, kSetInstallerResultTypeMsiErrorRegCmdArgs);
|
| - }
|
| -
|
| - virtual void SetUp() {
|
| - AppTestBaseWithRegistryOverride::SetUp();
|
| -
|
| - installer_wrapper_.reset(new InstallerWrapper(is_machine_));
|
| - EXPECT_SUCCEEDED(installer_wrapper_->Initialize());
|
| -
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppId), &app_));
|
| -
|
| - SetAppStateWaitingToInstall(app_);
|
| - }
|
| -
|
| - HRESULT InstallApp(const CString& existing_version,
|
| - App* app,
|
| - const CString& dir) {
|
| - ASSERT1(app);
|
| - return InstallManager::InstallApp(is_machine_,
|
| - NULL,
|
| - existing_version,
|
| - app->model()->lock(),
|
| - installer_wrapper_.get(),
|
| - app,
|
| - dir);
|
| - }
|
| -
|
| - void SetArgumentsInManifest(const CString& arguments,
|
| - const CString& expected_version,
|
| - App* app) {
|
| - ASSERT1(app);
|
| -
|
| - // TODO(omaha3): Consider using a mock object.
|
| - xml::InstallManifest* install_manifest = new xml::InstallManifest;
|
| - install_manifest->version = expected_version;
|
| -
|
| - xml::InstallAction install_event_action;
|
| - install_event_action.install_event = xml::InstallAction::kInstall;
|
| - install_event_action.needs_admin = is_machine_ ? NEEDS_ADMIN_YES :
|
| - NEEDS_ADMIN_NO;
|
| - // TODO(omaha3): Set install_event_action.program_to_run?
|
| - install_event_action.program_arguments = arguments;
|
| -
|
| - install_manifest->install_actions.push_back(install_event_action);
|
| - app->next_version()->set_install_manifest(install_manifest);
|
| - }
|
| -
|
| - void SetPostInstallActionInManifest(SuccessfulInstallAction success_action,
|
| - const CString& success_url,
|
| - bool terminate_all_browsers,
|
| - App* app) {
|
| - xml::InstallManifest* install_manifest = new xml::InstallManifest;
|
| - install_manifest->version = _T("1.2.3.4");
|
| -
|
| - xml::InstallAction post_install_event_action;
|
| - post_install_event_action.install_event = xml::InstallAction::kPostInstall;
|
| - post_install_event_action.needs_admin = is_machine_ ? NEEDS_ADMIN_YES :
|
| - NEEDS_ADMIN_NO;
|
| - post_install_event_action.success_url = success_url;
|
| - post_install_event_action.terminate_all_browsers = terminate_all_browsers;
|
| - post_install_event_action.success_action = success_action;
|
| - install_manifest->install_actions.push_back(post_install_event_action);
|
| - app->next_version()->set_install_manifest(install_manifest);
|
| - }
|
| -
|
| - static void SetAppStateWaitingToInstall(App* app) {
|
| - SetAppStateForUnitTest(app, new fsm::AppStateWaitingToInstall);
|
| - }
|
| -
|
| - static HRESULT GetResultCode(const App* app) {
|
| - return app->error_context_.error_code;
|
| - }
|
| -
|
| - static CString GetCompletionMessage(const App* app) {
|
| - return app->completion_message_;
|
| - }
|
| -
|
| - static PingEvent::Results GetCompletionResult(const App* app) {
|
| - return app->completion_result_;
|
| - }
|
| -
|
| - static CString GetPostInstallLaunchCommandLine(const App* app) {
|
| - return app->post_install_launch_command_line_;
|
| - }
|
| -
|
| - static CString GetPostInstallUrl(const App* app) {
|
| - return app->post_install_url_;
|
| - }
|
| -
|
| - static PostInstallAction GetPostInstallAction(const App* app) {
|
| - return app->post_install_action_;
|
| - }
|
| -
|
| - static void PopulateSuccessfulInstallResultInfo(
|
| - const App* app, InstallerResultInfo* result_info) {
|
| - return InstallManager::PopulateSuccessfulInstallResultInfo(
|
| - app, result_info);
|
| - }
|
| -
|
| - scoped_ptr<InstallerWrapper> installer_wrapper_;
|
| -
|
| - App* app_;
|
| -
|
| - static CPath cmd_exe_dir_;
|
| - static CString set_installer_result_type_msi_error_cmd_;
|
| -};
|
| -
|
| -CPath InstallManagerInstallAppTest::cmd_exe_dir_;
|
| -CString InstallManagerInstallAppTest::set_installer_result_type_msi_error_cmd_;
|
| -
|
| -class InstallManagerInstallAppMachineTest
|
| - : public InstallManagerInstallAppTest {
|
| - protected:
|
| - InstallManagerInstallAppMachineTest()
|
| - : InstallManagerInstallAppTest(true) {
|
| - }
|
| -};
|
| -
|
| -class InstallManagerInstallAppUserTest : public InstallManagerInstallAppTest {
|
| - protected:
|
| - InstallManagerInstallAppUserTest()
|
| - : InstallManagerInstallAppTest(false) {
|
| - }
|
| -};
|
| -
|
| -//
|
| -// Helper method tests
|
| -//
|
| -
|
| -// TODO(omaha3): We may replace these with the tests from
|
| -// installer_wrapper_unittest.cc if CheckApplicationRegistration() is moved to
|
| -// InstallManager.
|
| -#if 0
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - CheckApplicationRegistration_FailsWhenClientsKeyAbsent) {
|
| - AppData app_data(kAppGuid, is_machine_);
|
| - Job job(false, &ping_);
|
| - job.set_app_data(app_data);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
|
| - CheckApplicationRegistration(CString(), &job));
|
| -
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientStateKeyPath));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - CheckApplicationRegistration_FailsWhenVersionValueAbsent) {
|
| - ASSERT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
|
| -
|
| - AppData app_data(kAppGuid, is_machine_);
|
| - Job job(false, &ping_);
|
| - job.set_app_data(app_data);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
|
| - CheckApplicationRegistration(CString(), &job));
|
| -
|
| - EXPECT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientStateKeyPath));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - CheckApplicationRegistration_SucceedsWhenStateKeyAbsent) {
|
| - ASSERT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
|
| - kRegValueProductVersion,
|
| - _T("0.9.68.4")));
|
| -
|
| - AppData app_data(kAppGuid, is_machine_);
|
| - Job job(false, &ping_);
|
| - job.set_app_data(app_data);
|
| -
|
| - EXPECT_SUCCEEDED(CheckApplicationRegistration(CString(), &job));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - CheckApplicationRegistration_SucceedsWhenStateKeyPresent) {
|
| - const TCHAR* keys_to_create[] = {kFullAppClientsKeyPath,
|
| - kFullAppClientStateKeyPath};
|
| - ASSERT_SUCCEEDED(RegKey::CreateKeys(keys_to_create, 2));
|
| - ASSERT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - ASSERT_TRUE(RegKey::HasKey(kFullAppClientStateKeyPath));
|
| - ASSERT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
|
| - kRegValueProductVersion,
|
| - _T("0.9.70.0")));
|
| -
|
| - AppData app_data(kAppGuid, is_machine_);
|
| - Job job(false, &ping_);
|
| - job.set_app_data(app_data);
|
| -
|
| - // The install should succeed even if the version is the same.
|
| - EXPECT_SUCCEEDED(CheckApplicationRegistration(_T("0.9.70.0"), &job));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - CheckApplicationRegistration_UpdateSucceeds) {
|
| - const TCHAR* keys_to_create[] = {kFullAppClientsKeyPath,
|
| - kFullAppClientStateKeyPath};
|
| - ASSERT_SUCCEEDED(RegKey::CreateKeys(keys_to_create, 2));
|
| - ASSERT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - ASSERT_TRUE(RegKey::HasKey(kFullAppClientStateKeyPath));
|
| - ASSERT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
|
| - kRegValueProductVersion,
|
| - _T("0.9.70.0")));
|
| -
|
| - AppData app_data(kAppGuid, is_machine_);
|
| - Job job(true, &ping_);
|
| - job.set_app_data(app_data);
|
| -
|
| - EXPECT_SUCCEEDED(CheckApplicationRegistration(_T("0.9.70.1"), &job));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - CheckApplicationRegistration_UpdateFailsWhenVersionDoesNotChange) {
|
| - const TCHAR* keys_to_create[] = {kFullAppClientsKeyPath,
|
| - kFullAppClientStateKeyPath};
|
| - ASSERT_SUCCEEDED(RegKey::CreateKeys(keys_to_create,
|
| - arraysize(keys_to_create)));
|
| - ASSERT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - ASSERT_TRUE(RegKey::HasKey(kFullAppClientStateKeyPath));
|
| - ASSERT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
|
| - kRegValueProductVersion,
|
| - _T("0.9.70.0")));
|
| -
|
| - AppData app_data(kAppGuid, is_machine_);
|
| - Job job(true, &ping_);
|
| - job.set_app_data(app_data);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_CHANGE_VERSION,
|
| - CheckApplicationRegistration(_T("0.9.70.0"), &job));
|
| -}
|
| -#endif
|
| -
|
| -//
|
| -// Negative Tests
|
| -//
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - InstallApp_InstallerWithoutFilenameExtension) {
|
| - app_->next_version()->AddPackage(_T("foo"), 100, _T("hash"));
|
| -
|
| - // TODO(omaha): We should be able to eliminate this.
|
| - SetArgumentsInManifest(CString(), _T("1.2.3.4"), app_);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID,
|
| - InstallApp(_T(""), app_, _T("c:\\temp")));
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_ERROR, GetCompletionResult(app_));
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID, GetResultCode(app_));
|
| - EXPECT_STREQ(
|
| - _T("The installer filename c:\\temp\\foo is invalid or unsupported."),
|
| - GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - InstallApp_UnsupportedInstallerFilenameExtension) {
|
| - app_->next_version()->AddPackage(_T("foo.bar"), 100, _T("hash"));
|
| -
|
| - // TODO(omaha): We should be able to eliminate this.
|
| - SetArgumentsInManifest(CString(), _T("1.2.3.4"), app_);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID,
|
| - InstallApp(_T(""), app_, _T("c:\\temp")));
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_ERROR, GetCompletionResult(app_));
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID, GetResultCode(app_));
|
| - EXPECT_STREQ(
|
| - _T("The installer filename c:\\temp\\foo.bar is invalid or unsupported."),
|
| - GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest, InstallApp_InstallerEmtpyFilename) {
|
| - // Package asserts that the filename and file path are not NULL.
|
| - ExpectAsserts expect_asserts;
|
| -
|
| - app_->next_version()->AddPackage(_T(""), 100, _T("hash"));
|
| - // This test does not call
|
| - // app_->next_version()->GetPackage(0)->set_local_file_path().
|
| -
|
| - // TODO(omaha): We should be able to eliminate this.
|
| - SetArgumentsInManifest(CString(), _T("1.2.3.4"), app_);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID,
|
| - InstallApp(_T(""), app_, NULL));
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_ERROR, GetCompletionResult(app_));
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_FILENAME_INVALID, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("The installer filename \\ is invalid or unsupported."),
|
| - GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest, InstallApp_NoPackage) {
|
| - // InstallApp asserts that there is at least one package.
|
| - ExpectAsserts expect_asserts;
|
| -
|
| - EXPECT_EQ(E_FAIL, InstallApp(_T(""), app_, NULL));
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_ERROR, GetCompletionResult(app_));
|
| - EXPECT_EQ(E_FAIL, GetResultCode(app_));
|
| - EXPECT_STREQ(
|
| - _T("Installation failed. Please try again."),
|
| - GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest, InstallApp_ExeFileDoesNotExist) {
|
| - app_->next_version()->AddPackage(_T("foo.exe"), 100, _T("hash"));
|
| -
|
| - // TODO(omaha): We should be able to eliminate this.
|
| - SetArgumentsInManifest(CString(), _T("1.2.3.4"), app_);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED_START,
|
| - InstallApp(_T(""), app_, _T("c:\\temp")));
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_ERROR, GetCompletionResult(app_));
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED_START, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("The installer failed to start."),
|
| - GetCompletionMessage(app_));
|
| -
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientStateKeyPath));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -}
|
| -
|
| -//
|
| -// EXE Installer Tests
|
| -//
|
| -
|
| -// TODO(omaha3): Add InstallApp_ExeInstallerWithoutArgumentsSucceeds using
|
| -// SaveArguments.exe. Do the same in InstallerWrapperUserTest.
|
| -
|
| -// TODO(omaha3): Add InstallApp tests that cause
|
| -// ReadInstallerRegistrationValues & CheckApplicationRegistration to fail.
|
| -
|
| -// This test uses cmd.exe as an installer that leaves the payload
|
| -// kPayloadFileName.
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - InstallApp_ExeInstallerWithArgumentsSucceeds) {
|
| - const TCHAR kPayloadFileName[] = _T("exe_payload.txt");
|
| - const TCHAR kCommandToExecute[] = _T("echo \"hi\" > %s");
|
| -
|
| - CString full_command_to_execute;
|
| - full_command_to_execute.Format(kCommandToExecute, kPayloadFileName);
|
| - CString arguments;
|
| - arguments.Format(kExecuteCommandAndTerminateSwitch, full_command_to_execute);
|
| -
|
| - EXPECT_SUCCEEDED(File::Remove(kPayloadFileName));
|
| - EXPECT_FALSE(File::Exists(kPayloadFileName));
|
| -
|
| - // Create the Clients key since this isn't an actual installer.
|
| - EXPECT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
|
| - EXPECT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - EXPECT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
|
| - kRegValueProductVersion,
|
| - _T("0.10.69.5")));
|
| -
|
| - app_->next_version()->AddPackage(kCmdExecutable, 100, _T("hash"));
|
| - EXPECT_SUCCEEDED(app_->put_displayName(CComBSTR(_T("Exe App"))));
|
| -
|
| - SetArgumentsInManifest(arguments, _T("0.10.69.5"), app_);
|
| -
|
| - EXPECT_SUCCEEDED(InstallApp(_T(""), app_, cmd_exe_dir_));
|
| -
|
| - EXPECT_EQ(STATE_INSTALL_COMPLETE, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_SUCCESS, GetCompletionResult(app_));
|
| - EXPECT_EQ(S_OK, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("Thanks for installing."), GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -
|
| - RegKey state_key;
|
| - EXPECT_SUCCEEDED(state_key.Open(kFullAppClientStateKeyPath));
|
| - EXPECT_EQ(1 + kNumAutoPopulatedValues, state_key.GetValueCount());
|
| - EXPECT_STREQ(_T("0.10.69.5"), GetSzValue(kFullAppClientStateKeyPath,
|
| - kRegValueProductVersion));
|
| -
|
| - EXPECT_TRUE(File::Exists(kPayloadFileName));
|
| - EXPECT_SUCCEEDED(File::Remove(kPayloadFileName));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - InstallApp_ExeInstallerReturnsNonZeroExitCode) {
|
| - const TCHAR kCommandToExecute[] = _T("exit 1");
|
| -
|
| - CString arguments;
|
| - arguments.Format(kExecuteCommandAndTerminateSwitch, kCommandToExecute);
|
| -
|
| - // Create the Clients key since this isn't an actual installer.
|
| - ASSERT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
|
| - ASSERT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - ASSERT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
|
| - kRegValueProductVersion,
|
| - _T("0.10.69.5")));
|
| -
|
| - app_->next_version()->AddPackage(kCmdExecutable, 100, _T("hash"));
|
| -
|
| - SetArgumentsInManifest(arguments, _T("0.10.69.5"), app_);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED,
|
| - InstallApp(_T(""), app_, cmd_exe_dir_));
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_INSTALLER_ERROR_OTHER,
|
| - GetCompletionResult(app_));
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("The installer encountered error 1."),
|
| - GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppMachineTest, InstallApp_MsiInstallerSucceeds) {
|
| - if (!vista_util::IsUserAdmin()) {
|
| - std::wcout << _T("\tTest did not run because the user is not an admin.")
|
| - << std::endl;
|
| - return;
|
| - }
|
| -
|
| - const CString kIid = _T("{F7598FEE-4BA9-4755-A1FC-6EB0A6F3D126}");
|
| -
|
| - // We can't fake the registry keys because we are interacting with a real
|
| - // installer.
|
| - RestoreRegistryHives();
|
| -
|
| - AdjustMsiTries(installer_wrapper_.get());
|
| -
|
| - CString installer_dir(app_util::GetCurrentModuleDirectory());
|
| -
|
| - CString installer_full_path(
|
| - ConcatenatePath(installer_dir, kSetupFooV1RelativeLocation));
|
| - ASSERT_TRUE(File::Exists(installer_full_path));
|
| -
|
| - CString installer_log_full_path;
|
| - installer_log_full_path.Format(kMsiLogFormat, installer_full_path);
|
| -
|
| - ASSERT_SUCCEEDED(File::Remove(installer_log_full_path));
|
| - ASSERT_FALSE(File::Exists(installer_log_full_path));
|
| -
|
| - RegKey::DeleteKey(kFullFooAppClientKeyPath);
|
| - ASSERT_FALSE(RegKey::HasKey(kFullFooAppClientKeyPath));
|
| - RegKey::DeleteKey(kFullFooAppClientStateKeyPath);
|
| - ASSERT_FALSE(RegKey::HasKey(kFullFooAppClientStateKeyPath));
|
| -
|
| - // Accepting the EULA prevents "eulaaccepted" value from being written.
|
| - EXPECT_SUCCEEDED(app_->put_isEulaAccepted(VARIANT_TRUE));
|
| -
|
| - // TODO(omaha): This should be just a filename.
|
| - app_->next_version()->AddPackage(kSetupFooV1RelativeLocation,
|
| - 100, _T("hash"));
|
| - app_->set_app_guid(StringToGuid(kFooId));
|
| - EXPECT_SUCCEEDED(app_->put_displayName(CComBSTR(_T("Foo"))));
|
| - EXPECT_SUCCEEDED(app_->put_iid(CComBSTR(kIid)));
|
| -
|
| - // TODO(omaha): We should be able to eliminate this.
|
| - SetArgumentsInManifest(CString(), kFooVersion, app_);
|
| -
|
| - EXPECT_SUCCEEDED(InstallApp(_T(""), app_, installer_dir));
|
| -
|
| - EXPECT_EQ(STATE_INSTALL_COMPLETE, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_SUCCESS, GetCompletionResult(app_));
|
| - EXPECT_EQ(S_OK, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("Thanks for installing."),
|
| - GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -
|
| - EXPECT_TRUE(File::Exists(installer_log_full_path));
|
| -
|
| - EXPECT_TRUE(RegKey::HasKey(kFullFooAppClientKeyPath));
|
| - EXPECT_TRUE(RegKey::HasKey(kFullFooAppClientStateKeyPath));
|
| - RegKey state_key;
|
| - EXPECT_SUCCEEDED(state_key.Open(kFullFooAppClientStateKeyPath));
|
| - EXPECT_EQ(2 + kNumAutoPopulatedValues, state_key.GetValueCount());
|
| - EXPECT_STREQ(kFooVersion, GetSzValue(kFullFooAppClientStateKeyPath,
|
| - kRegValueProductVersion));
|
| - EXPECT_FALSE(RegKey::HasValue(kFullFooAppClientStateKeyPath,
|
| - kRegValueLanguage));
|
| - EXPECT_STREQ(kIid, GetSzValue(kFullFooAppClientStateKeyPath,
|
| - kRegValueInstallationId));
|
| -
|
| - // Verify the installer did not write a value that is to be written only in
|
| - // the presence of an MSI property that was not specified.
|
| - EXPECT_FALSE(RegKey::HasValue(kFullFooAppClientKeyPath,
|
| - kFooInstallerBarValueName));
|
| -
|
| - UninstallTestMsi(installer_full_path);
|
| -
|
| - EXPECT_FALSE(RegKey::HasKey(kFullFooAppClientKeyPath));
|
| - EXPECT_SUCCEEDED(RegKey::DeleteKey(kFullFooAppClientKeyPath));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppMachineTest,
|
| - InstallApp_MsiInstallerWithArgumentSucceeds) {
|
| - if (!vista_util::IsUserAdmin()) {
|
| - std::wcout << _T("\tTest did not run because the user is not an admin.")
|
| - << std::endl;
|
| - return;
|
| - }
|
| -
|
| - // We can't fake the registry keys because we are interacting with a real
|
| - // installer.
|
| - RestoreRegistryHives();
|
| -
|
| - AdjustMsiTries(installer_wrapper_.get());
|
| -
|
| - CString installer_dir(app_util::GetCurrentModuleDirectory());
|
| -
|
| - CString installer_full_path(
|
| - ConcatenatePath(installer_dir, kSetupFooV1RelativeLocation));
|
| - ASSERT_TRUE(File::Exists(installer_full_path));
|
| -
|
| - CString installer_log_full_path;
|
| - installer_log_full_path.Format(kMsiLogFormat, installer_full_path);
|
| -
|
| - ASSERT_SUCCEEDED(File::Remove(installer_log_full_path));
|
| - ASSERT_FALSE(File::Exists(installer_log_full_path));
|
| -
|
| - RegKey::DeleteKey(kFullFooAppClientKeyPath);
|
| - ASSERT_FALSE(RegKey::HasKey(kFullFooAppClientKeyPath));
|
| - RegKey::DeleteKey(kFullFooAppClientStateKeyPath);
|
| - ASSERT_FALSE(RegKey::HasKey(kFullFooAppClientStateKeyPath));
|
| -
|
| - // Write an iid to verify it gets deleted below.
|
| - EXPECT_SUCCEEDED(
|
| - RegKey::SetValue(kFullFooAppClientStateKeyPath,
|
| - kRegValueInstallationId,
|
| - _T("{A30B6C0A-B491-473e-9D24-E1AC1BC1D42F}")));
|
| -
|
| - // Accepting the EULA prevents "eulaaccepted" value from being written.
|
| - EXPECT_SUCCEEDED(app_->put_isEulaAccepted(VARIANT_TRUE));
|
| -
|
| - // TODO(omaha): This should be just a filename.
|
| - app_->next_version()->AddPackage(kSetupFooV1RelativeLocation,
|
| - 100, _T("hash"));
|
| - app_->set_app_guid(StringToGuid(kFooId));
|
| - EXPECT_SUCCEEDED(app_->put_displayName(CComBSTR(_T("Foo"))));
|
| -
|
| - SetArgumentsInManifest(kFooInstallerBarPropertyArg, kFooVersion, app_);
|
| -
|
| - EXPECT_SUCCEEDED(InstallApp(_T(""), app_, installer_dir));
|
| -
|
| - EXPECT_EQ(STATE_INSTALL_COMPLETE, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_SUCCESS, GetCompletionResult(app_));
|
| - EXPECT_EQ(S_OK, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("Thanks for installing."),
|
| - GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -
|
| - EXPECT_TRUE(File::Exists(installer_log_full_path));
|
| -
|
| - EXPECT_TRUE(RegKey::HasKey(kFullFooAppClientKeyPath));
|
| - EXPECT_TRUE(RegKey::HasKey(kFullFooAppClientStateKeyPath));
|
| - RegKey state_key;
|
| - EXPECT_SUCCEEDED(state_key.Open(kFullFooAppClientStateKeyPath));
|
| - EXPECT_EQ(1 + kNumAutoPopulatedValues, state_key.GetValueCount());
|
| - EXPECT_STREQ(kFooVersion, GetSzValue(kFullFooAppClientStateKeyPath,
|
| - kRegValueProductVersion));
|
| - EXPECT_FALSE(RegKey::HasValue(kFullFooAppClientStateKeyPath,
|
| - kRegValueLanguage));
|
| - EXPECT_FALSE(RegKey::HasValue(kFullFooAppClientStateKeyPath,
|
| - kRegValueInstallationId));
|
| -
|
| - EXPECT_TRUE(RegKey::HasValue(kFullFooAppClientKeyPath,
|
| - kFooInstallerBarValueName));
|
| - DWORD barprop_value;
|
| - EXPECT_SUCCEEDED(RegKey::GetValue(kFullFooAppClientKeyPath,
|
| - kFooInstallerBarValueName,
|
| - &barprop_value));
|
| - EXPECT_EQ(7, barprop_value);
|
| -
|
| - UninstallTestMsi(installer_full_path);
|
| -
|
| - EXPECT_FALSE(RegKey::HasKey(kFullFooAppClientKeyPath));
|
| - EXPECT_SUCCEEDED(RegKey::DeleteKey(kFullFooAppClientKeyPath));
|
| -}
|
| -
|
| -// The use of kGoogleUpdateAppId is the key to this test.
|
| -// Note that the version is not changed - this is the normal self-update case.
|
| -// Among other things, this test verifies that CheckApplicationRegistration() is
|
| -// not called for self-updates.
|
| -TEST_F(InstallManagerInstallAppUserTest, InstallApp_UpdateOmahaSucceeds) {
|
| - CString arguments;
|
| - arguments.Format(kExecuteCommandAndTerminateSwitch, _T(""));
|
| -
|
| - const CString kExistingVersion(_T("0.9.69.5"));
|
| -
|
| - app_->next_version()->AddPackage(kCmdExecutable, 100, _T("hash"));
|
| - app_->set_app_guid(StringToGuid(kGoogleUpdateAppId));
|
| -
|
| - // TODO(omaha3): This isn't supported yet.
|
| -#if 0
|
| - isupdate = true
|
| -#endif
|
| -
|
| - SetArgumentsInManifest(arguments, _T("1.2.9.8"), app_);
|
| -
|
| - // Because we don't actually run the Omaha installer, we need to make sure
|
| - // its Clients key and pv value exist to avoid an error.
|
| - ASSERT_SUCCEEDED(RegKey::CreateKey(USER_REG_CLIENTS_GOOPDATE));
|
| - ASSERT_TRUE(RegKey::HasKey(USER_REG_CLIENTS_GOOPDATE));
|
| - ASSERT_SUCCEEDED(RegKey::SetValue(USER_REG_CLIENTS_GOOPDATE,
|
| - kRegValueProductVersion,
|
| - kExistingVersion));
|
| -
|
| - EXPECT_SUCCEEDED(InstallApp(kExistingVersion, app_, cmd_exe_dir_));
|
| -
|
| - EXPECT_EQ(STATE_INSTALL_COMPLETE, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_SUCCESS, GetCompletionResult(app_));
|
| - EXPECT_EQ(S_OK, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("Thanks for installing."), GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -
|
| - EXPECT_TRUE(RegKey::HasKey(USER_REG_CLIENTS_GOOPDATE));
|
| - CString version;
|
| - EXPECT_SUCCEEDED(RegKey::GetValue(USER_REG_CLIENTS_GOOPDATE,
|
| - kRegValueProductVersion,
|
| - &version));
|
| - EXPECT_STREQ(kExistingVersion, version);
|
| -}
|
| -
|
| -// The main purpose of this test is to ensure that self-updates don't fail if
|
| -// Omaha's Clients key doesn't exist for some reason.
|
| -// In other words, it tests that CheckApplicationRegistration() is not called.
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - InstallApp_UpdateOmahaSucceedsWhenClientsKeyAbsent) {
|
| - CString arguments;
|
| - arguments.Format(kExecuteCommandAndTerminateSwitch, _T(""));
|
| -
|
| - const CString kExistingVersion(_T("0.9.69.5"));
|
| -
|
| - app_->next_version()->AddPackage(kCmdExecutable, 100, _T("hash"));
|
| - app_->set_app_guid(StringToGuid(kGoogleUpdateAppId));
|
| -
|
| - // TODO(omaha3): This isn't supported yet.
|
| -#if 0
|
| - isupdate = true
|
| -#endif
|
| -
|
| - SetArgumentsInManifest(arguments, _T("1.2.9.8"), app_);
|
| -
|
| - EXPECT_SUCCEEDED(InstallApp(kExistingVersion, app_, cmd_exe_dir_));
|
| -
|
| - EXPECT_EQ(STATE_INSTALL_COMPLETE, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_SUCCESS, GetCompletionResult(app_));
|
| - EXPECT_EQ(S_OK, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("Thanks for installing."), GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -
|
| - EXPECT_FALSE(RegKey::HasKey(USER_REG_CLIENTS_GOOPDATE));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - InstallApp_InstallerDoesNotWriteClientsKey) {
|
| - CString arguments;
|
| - arguments.Format(kExecuteCommandAndTerminateSwitch, _T(""));
|
| -
|
| - app_->next_version()->AddPackage(kCmdExecutable, 100, _T("hash"));
|
| - EXPECT_SUCCEEDED(app_->put_displayName(CComBSTR(_T("Some App"))));
|
| -
|
| - SetArgumentsInManifest(arguments, _T("5.6.7.8"), app_);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
|
| - InstallApp(_T(""), app_, cmd_exe_dir_));
|
| -
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientStateKeyPath));
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_ERROR, GetCompletionResult(app_));
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_DID_NOT_WRITE_CLIENTS_KEY,
|
| - GetResultCode(app_));
|
| - EXPECT_STREQ(
|
| - _T("Installation failed. Please try again."),
|
| - GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -}
|
| -
|
| -// TODO(omaha3): Test for GOOPDATEINSTALL_E_INSTALLER_DID_NOT_CHANGE_VERSION
|
| -// once is_update is supported.
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - InstallApp_InstallerFailureMsiFileDoesNotExist) {
|
| - CPath msi_dir(app_util::GetTempDir());
|
| - CPath msi_path(msi_dir);
|
| - msi_path.Append(_T("foo.msi"));
|
| - const CString log_path = msi_path + _T(".log");
|
| -
|
| - AdjustMsiTries(installer_wrapper_.get());
|
| -
|
| - ASSERT_SUCCEEDED(File::Remove(log_path));
|
| - ASSERT_FALSE(File::Exists(log_path));
|
| -
|
| - app_->next_version()->AddPackage(_T("foo.msi"), 100, _T("hash"));
|
| -
|
| - // TODO(omaha): We should be able to eliminate this.
|
| - SetArgumentsInManifest(CString(), _T("1.2.3.4"), app_);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED,
|
| - InstallApp(_T(""), app_, msi_dir));
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_INSTALLER_ERROR_MSI,
|
| - GetCompletionResult(app_));
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_INSTALLER_FAILED, GetResultCode(app_));
|
| - const CString message = GetCompletionMessage(app_);
|
| - EXPECT_STREQ(kError1619MessagePrefix,
|
| - message.Left(kError1619MessagePrefixLength));
|
| - VerifyStringIsMsiPackageOpenFailedString(
|
| - message.Mid(kError1619MessagePrefixLength));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -
|
| - // msiexec creates an empty log file.
|
| - EXPECT_TRUE(File::Exists(log_path));
|
| - EXPECT_SUCCEEDED(File::Remove(log_path));
|
| -
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - EXPECT_FALSE(RegKey::HasKey(kFullAppClientStateKeyPath));
|
| -}
|
| -
|
| -// Simulates the MSI busy error by having an exe installer return the error
|
| -// as its exit code and specifying MSI error using Installer Result API.
|
| -// Assumes reg.exe is in the path.
|
| -// This works because the number of retries is set before InstallApp() and thus
|
| -// defaults to 1 in the InstallerWrapper.
|
| -TEST_F(InstallManagerInstallAppUserTest, InstallApp_MsiIsBusy_NoRetries) {
|
| - CString commands;
|
| - commands.Format(kExecuteTwoCommandsFormat,
|
| - set_installer_result_type_msi_error_cmd_,
|
| - kMsiInstallerBusyExitCodeCmd);
|
| -
|
| - CString arguments;
|
| - arguments.Format(kExecuteCommandAndTerminateSwitch, commands);
|
| -
|
| - app_->next_version()->AddPackage(kCmdExecutable, 100, _T("hash"));
|
| - EXPECT_SUCCEEDED(app_->put_displayName(CComBSTR(_T("Some App"))));
|
| -
|
| - SetArgumentsInManifest(arguments, _T("1.2.3.4"), app_);
|
| -
|
| - LowResTimer install_timer(true);
|
| -
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_MSI_INSTALL_ALREADY_RUNNING,
|
| - InstallApp(_T(""), app_, cmd_exe_dir_));
|
| -
|
| - EXPECT_GT(2, install_timer.GetSeconds()); // Check Omaha did not retry.
|
| -
|
| - EXPECT_EQ(STATE_ERROR, app_->state());
|
| - // Even though the error came from the installer, the error type is not
|
| - // set because we have a custom error for this case.
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_ERROR, GetCompletionResult(app_));
|
| - EXPECT_EQ(GOOPDATEINSTALL_E_MSI_INSTALL_ALREADY_RUNNING,
|
| - GetResultCode(app_));
|
| - EXPECT_STREQ(kMsiInstallerBusyErrorMessage, GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -}
|
| -
|
| -// This test uses cmd.exe as an installer that leaves the payload files.
|
| -TEST_F(InstallManagerInstallAppUserTest, InstallApp_InstallMultipleApps) {
|
| - const TCHAR kPayloadFileName1[] = _T("exe_payload1.txt");
|
| - const TCHAR kPayloadFileName2[] = _T("exe_payload2.txt");
|
| - const TCHAR kCommandToExecute[] = _T("echo \"hi\" > %s");
|
| -
|
| - CString full_command_to_execute;
|
| - full_command_to_execute.Format(kCommandToExecute, kPayloadFileName1);
|
| - CString arguments1;
|
| - arguments1.Format(kExecuteCommandAndTerminateSwitch, full_command_to_execute);
|
| -
|
| - full_command_to_execute.Format(kCommandToExecute, kPayloadFileName2);
|
| - CString arguments2;
|
| - arguments2.Format(kExecuteCommandAndTerminateSwitch, full_command_to_execute);
|
| -
|
| - EXPECT_SUCCEEDED(File::Remove(kPayloadFileName1));
|
| - EXPECT_FALSE(File::Exists(kPayloadFileName1));
|
| - EXPECT_SUCCEEDED(File::Remove(kPayloadFileName2));
|
| - EXPECT_FALSE(File::Exists(kPayloadFileName2));
|
| -
|
| - // Create the Clients key since this isn't an actual installer.
|
| - EXPECT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
|
| - EXPECT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - EXPECT_SUCCEEDED(RegKey::SetValue(kFullAppClientsKeyPath,
|
| - kRegValueProductVersion,
|
| - _T("0.10.69.5")));
|
| -
|
| - app_->next_version()->AddPackage(kCmdExecutable, 100, _T("hash"));
|
| - EXPECT_SUCCEEDED(app_->put_displayName(CComBSTR(_T("Exe App"))));
|
| -
|
| - SetArgumentsInManifest(arguments1, _T("0.10.69.5"), app_);
|
| -
|
| - EXPECT_SUCCEEDED(InstallApp(_T(""), app_, cmd_exe_dir_));
|
| -
|
| - EXPECT_EQ(STATE_INSTALL_COMPLETE, app_->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_SUCCESS, GetCompletionResult(app_));
|
| - EXPECT_EQ(S_OK, GetResultCode(app_));
|
| - EXPECT_STREQ(_T("Thanks for installing."), GetCompletionMessage(app_));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -
|
| - EXPECT_TRUE(File::Exists(kPayloadFileName1));
|
| - EXPECT_SUCCEEDED(File::Remove(kPayloadFileName1));
|
| -
|
| - // Run the second installer.
|
| -
|
| - App* app2 = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kApp2Id), &app2));
|
| - SetAppStateWaitingToInstall(app2);
|
| -
|
| - // Create the Clients key since this isn't an actual installer.
|
| - EXPECT_SUCCEEDED(RegKey::CreateKey(kFullAppClientsKeyPath));
|
| - EXPECT_TRUE(RegKey::HasKey(kFullAppClientsKeyPath));
|
| - EXPECT_SUCCEEDED(RegKey::SetValue(kFullApp2ClientsKeyPath,
|
| - kRegValueProductVersion,
|
| - _T("0.10.69.5")));
|
| -
|
| - app2->next_version()->AddPackage(kCmdExecutable, 100, _T("hash"));
|
| - EXPECT_SUCCEEDED(app2->put_displayName(CComBSTR(_T("Exe App"))));
|
| -
|
| - SetArgumentsInManifest(arguments2, _T("0.10.69.5"), app2);
|
| -
|
| - EXPECT_SUCCEEDED(InstallApp(_T(""), app2, cmd_exe_dir_));
|
| -
|
| - EXPECT_EQ(STATE_INSTALL_COMPLETE, app2->state());
|
| - EXPECT_EQ(PingEvent::EVENT_RESULT_SUCCESS, GetCompletionResult(app2));
|
| - EXPECT_EQ(S_OK, GetResultCode(app2));
|
| - EXPECT_STREQ(_T("Thanks for installing."), GetCompletionMessage(app2));
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, GetPostInstallAction(app_));
|
| -
|
| - EXPECT_TRUE(File::Exists(kPayloadFileName2));
|
| - EXPECT_SUCCEEDED(File::Remove(kPayloadFileName2));
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - PopulateSuccessfulInstallResultInfo_ExitSilentlyOnLaunchCommandWithNoCommand) { // NOLINT
|
| - SetPostInstallActionInManifest(SUCCESS_ACTION_EXIT_SILENTLY_ON_LAUNCH_CMD,
|
| - _T(""),
|
| - false,
|
| - app_);
|
| -
|
| - InstallerResultInfo result_info;
|
| - result_info.type = INSTALLER_RESULT_SUCCESS;
|
| - PopulateSuccessfulInstallResultInfo(app_, &result_info);
|
| - EXPECT_TRUE(GetPostInstallLaunchCommandLine(app_).IsEmpty());
|
| - EXPECT_TRUE(GetPostInstallUrl(app_).IsEmpty());
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info.post_install_action);
|
| -}
|
| -
|
| -// Verify that launch command is converted to silently launch command
|
| -// if success action is silently launch command. Also tests that launch cmd
|
| -// takes precedence over URL.
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - PopulateSuccessfulInstallResultInfo_ExitSilentlyOnLaunchCommand) {
|
| - SetPostInstallActionInManifest(SUCCESS_ACTION_EXIT_SILENTLY_ON_LAUNCH_CMD,
|
| - _T("http://post_install_succeeded"),
|
| - true,
|
| - app_);
|
| -
|
| - InstallerResultInfo result_info;
|
| - result_info.type = INSTALLER_RESULT_SUCCESS;
|
| - result_info.post_install_action = POST_INSTALL_ACTION_LAUNCH_COMMAND;
|
| - result_info.post_install_launch_command_line = _T("notepad.exe");
|
| - PopulateSuccessfulInstallResultInfo(app_, &result_info);
|
| -
|
| - EXPECT_EQ(POST_INSTALL_ACTION_EXIT_SILENTLY_ON_LAUNCH_COMMAND,
|
| - result_info.post_install_action);
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - PopulateSuccessfulInstallResultInfo_LaunchCommandWithDefaultSuccessAction) {
|
| - SetPostInstallActionInManifest(SUCCESS_ACTION_DEFAULT,
|
| - _T(""),
|
| - true,
|
| - app_);
|
| -
|
| - InstallerResultInfo result_info;
|
| - result_info.type = INSTALLER_RESULT_SUCCESS;
|
| - result_info.post_install_action = POST_INSTALL_ACTION_LAUNCH_COMMAND;
|
| - result_info.post_install_launch_command_line = _T("notepad.exe");
|
| - PopulateSuccessfulInstallResultInfo(app_, &result_info);
|
| -
|
| - EXPECT_EQ(POST_INSTALL_ACTION_LAUNCH_COMMAND,
|
| - result_info.post_install_action);
|
| -}
|
| -
|
| -// Verify that default install action is converted to exit silently if
|
| -// if success action is exit silently.
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - PopulateSuccessfulInstallResultInfo_ExitSilently) {
|
| - SetPostInstallActionInManifest(SUCCESS_ACTION_EXIT_SILENTLY,
|
| - _T(""),
|
| - false,
|
| - app_);
|
| -
|
| - InstallerResultInfo result_info;
|
| - result_info.type = INSTALLER_RESULT_SUCCESS;
|
| - result_info.post_install_action = POST_INSTALL_ACTION_DEFAULT;
|
| - PopulateSuccessfulInstallResultInfo(app_, &result_info);
|
| -
|
| - EXPECT_EQ(POST_INSTALL_ACTION_EXIT_SILENTLY, result_info.post_install_action);
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - PopulateSuccessfulInstallResultInfo_RestartBrowser) {
|
| - SetPostInstallActionInManifest(SUCCESS_ACTION_DEFAULT,
|
| - _T("http://www.google.com/foo/installed_ok"),
|
| - false,
|
| - app_);
|
| -
|
| - InstallerResultInfo result_info;
|
| - result_info.type = INSTALLER_RESULT_SUCCESS;
|
| - result_info.post_install_action = POST_INSTALL_ACTION_DEFAULT;
|
| - PopulateSuccessfulInstallResultInfo(app_, &result_info);
|
| -
|
| - EXPECT_EQ(POST_INSTALL_ACTION_RESTART_BROWSER,
|
| - result_info.post_install_action);
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - PopulateSuccessfulInstallResultInfo_RestartAllBrowsers) {
|
| - SetPostInstallActionInManifest(SUCCESS_ACTION_DEFAULT,
|
| - _T("http://www.google.com/gears/installed_ok"),
|
| - true,
|
| - app_);
|
| -
|
| - InstallerResultInfo result_info;
|
| - result_info.type = INSTALLER_RESULT_SUCCESS;
|
| - result_info.post_install_action = POST_INSTALL_ACTION_DEFAULT;
|
| - PopulateSuccessfulInstallResultInfo(app_, &result_info);
|
| -
|
| - EXPECT_EQ(POST_INSTALL_ACTION_RESTART_ALL_BROWSERS,
|
| - result_info.post_install_action);
|
| -}
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - PopulateSuccessfulInstallResultInfo_NoPostInstallUrl) {
|
| - SetPostInstallActionInManifest(SUCCESS_ACTION_DEFAULT,
|
| - _T(""),
|
| - true,
|
| - app_);
|
| -
|
| - InstallerResultInfo result_info;
|
| - result_info.type = INSTALLER_RESULT_SUCCESS;
|
| - result_info.post_install_action = POST_INSTALL_ACTION_DEFAULT;
|
| - PopulateSuccessfulInstallResultInfo(app_, &result_info);
|
| -
|
| - EXPECT_EQ(POST_INSTALL_ACTION_DEFAULT, result_info.post_install_action);
|
| -}
|
| -
|
| -
|
| -TEST_F(InstallManagerInstallAppUserTest,
|
| - PopulateSuccessfulInstallResultInfo_RebootShouldNotBeOverridden) {
|
| - const SuccessfulInstallAction kSuccessActions[] = {
|
| - SUCCESS_ACTION_DEFAULT,
|
| - SUCCESS_ACTION_EXIT_SILENTLY,
|
| - SUCCESS_ACTION_EXIT_SILENTLY_ON_LAUNCH_CMD,
|
| - };
|
| -
|
| - for (int i = 0; i < arraysize(kSuccessActions); ++i) {
|
| - SetPostInstallActionInManifest(kSuccessActions[i],
|
| - _T("http://foo/bar"),
|
| - true,
|
| - app_);
|
| -
|
| - InstallerResultInfo result_info;
|
| - result_info.type = INSTALLER_RESULT_SUCCESS;
|
| - result_info.post_install_action = POST_INSTALL_ACTION_REBOOT;
|
| - result_info.post_install_launch_command_line = _T("foo.exe");
|
| - PopulateSuccessfulInstallResultInfo(app_, &result_info);
|
| -
|
| - EXPECT_EQ(POST_INSTALL_ACTION_REBOOT, result_info.post_install_action);
|
| - }
|
| -}
|
| -
|
| -} // namespace omaha
|
|
|