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

Unified Diff: chrome/installer/setup/install_worker_unittest.cc

Issue 6588003: Add support for the quick-enable-cf command to the installer. This encompase... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/installer/setup/install_worker.cc ('k') | chrome/installer/setup/setup_main.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/installer/setup/install_worker_unittest.cc
===================================================================
--- chrome/installer/setup/install_worker_unittest.cc (revision 76747)
+++ chrome/installer/setup/install_worker_unittest.cc (working copy)
@@ -7,8 +7,12 @@
#include "base/win/registry.h"
#include "base/version.h"
#include "chrome/common/chrome_constants.h"
+#include "chrome/installer/util/delete_reg_key_work_item.h"
+#include "chrome/installer/util/create_reg_key_work_item.h"
+#include "chrome/installer/util/helper.h"
#include "chrome/installer/util/installation_state.h"
#include "chrome/installer/util/installer_state.h"
+#include "chrome/installer/util/set_reg_value_work_item.h"
#include "chrome/installer/util/util_constants.h"
#include "chrome/installer/util/work_item_list.h"
@@ -17,11 +21,17 @@
using installer::InstallationState;
using installer::InstallerState;
+using installer::Product;
using installer::ProductState;
using ::testing::_;
using ::testing::AtLeast;
+using ::testing::AtMost;
+using ::testing::Eq;
+using ::testing::Return;
+using ::testing::StrCaseEq;
using ::testing::StrEq;
+using ::testing::StrictMock;
// Mock classes to help with testing
//------------------------------------------------------------------------------
@@ -81,6 +91,9 @@
// Takes ownership of |version|.
void set_version(Version* version) { version_.reset(version); }
void set_multi_install(bool multi) { multi_install_ = multi; }
+ void SetUninstallProgram(const FilePath& setup_exe) {
+ uninstall_command_ = CommandLine(setup_exe);
+ }
void AddUninstallSwitch(const std::string& option) {
uninstall_command_.AppendSwitch(option);
}
@@ -142,26 +155,81 @@
virtual void TearDown() {
}
- MockInstallationState* BuildChromeInstallationState(bool system_level,
- bool multi_install) {
- scoped_ptr<MockInstallationState> installation_state(
- new MockInstallationState());
-
+ void AddChromeToInstallationState(
+ bool system_level,
+ bool multi_install,
+ bool with_chrome_frame_ready_mode,
+ MockInstallationState* installation_state) {
MockProductState product_state;
product_state.set_version(current_version_->Clone());
product_state.set_multi_install(multi_install);
+ BrowserDistribution* dist =
+ BrowserDistribution::GetSpecificDistribution(
+ BrowserDistribution::CHROME_BROWSER);
+ FilePath install_path =
+ installer::GetChromeInstallPath(system_level, dist);
+ product_state.SetUninstallProgram(
+ install_path.Append(installer::kSetupExe));
robertshield 2011/03/03 19:32:26 don't you also need to add a --uninstall switch he
grt (UTC plus 2) 2011/03/03 19:38:44 Nice catch! Done.
+ if (system_level)
+ product_state.AddUninstallSwitch(installer::switches::kSystemLevel);
if (multi_install) {
product_state.AddUninstallSwitch(installer::switches::kMultiInstall);
+ product_state.AddUninstallSwitch(installer::switches::kChrome);
+ if (with_chrome_frame_ready_mode) {
+ product_state.AddUninstallSwitch(installer::switches::kChromeFrame);
+ product_state.AddUninstallSwitch(
+ installer::switches::kChromeFrameReadyMode);
+ }
}
installation_state->SetProductState(system_level,
BrowserDistribution::CHROME_BROWSER,
product_state);
+ }
+ void AddChromeFrameToInstallationState(
+ bool system_level,
+ bool multi_install,
+ bool ready_mode,
+ MockInstallationState* installation_state) {
+ MockProductState product_state;
+ product_state.set_version(current_version_->Clone());
+ product_state.set_multi_install(multi_install);
+ BrowserDistribution* dist =
+ BrowserDistribution::GetSpecificDistribution(
+ multi_install ? BrowserDistribution::CHROME_BINARIES :
+ BrowserDistribution::CHROME_FRAME);
+ FilePath install_path =
+ installer::GetChromeInstallPath(system_level, dist);
+ product_state.SetUninstallProgram(
+ install_path.Append(installer::kSetupExe));
robertshield 2011/03/03 19:32:26 ditto
grt (UTC plus 2) 2011/03/03 19:38:44 Done.
+ product_state.AddUninstallSwitch(installer::switches::kChromeFrame);
+ if (system_level)
+ product_state.AddUninstallSwitch(installer::switches::kSystemLevel);
+ if (multi_install) {
+ product_state.AddUninstallSwitch(installer::switches::kMultiInstall);
+ if (ready_mode) {
+ product_state.AddUninstallSwitch(
+ installer::switches::kChromeFrameReadyMode);
+ }
+ }
+
+ installation_state->SetProductState(system_level,
+ BrowserDistribution::CHROME_FRAME,
+ product_state);
+ }
+
+ MockInstallationState* BuildChromeInstallationState(bool system_level,
+ bool multi_install) {
+ scoped_ptr<MockInstallationState> installation_state(
+ new MockInstallationState());
+ AddChromeToInstallationState(system_level, multi_install, false,
+ installation_state.get());
return installation_state.release();
}
- MockInstallerState* BuildChromeInstallerState(bool system_install,
+ static MockInstallerState* BuildBasicInstallerState(
+ bool system_install,
bool multi_install,
const InstallationState& machine_state,
InstallerState::Operation operation) {
@@ -173,17 +241,84 @@
installer_state->set_operation(operation);
// Hope this next one isn't checked for now.
installer_state->set_state_key(L"PROBABLY_INVALID_REG_PATH");
- if (multi_install) {
- installer_state->set_package_type(InstallerState::MULTI_PACKAGE);
- }
+ installer_state->set_package_type(multi_install ?
+ InstallerState::MULTI_PACKAGE :
+ InstallerState::SINGLE_PACKAGE);
+ return installer_state.release();
+ }
+
+ static void AddChromeToInstallerState(
+ const InstallationState& machine_state,
+ MockInstallerState* installer_state) {
+ // Fresh install or upgrade?
const ProductState* chrome =
- machine_state.GetProductState(system_install,
+ machine_state.GetProductState(installer_state->system_install(),
BrowserDistribution::CHROME_BROWSER);
- installer_state->AddProductFromState(BrowserDistribution::CHROME_BROWSER,
- *chrome);
+ if (chrome != NULL) {
+ installer_state->AddProductFromState(BrowserDistribution::CHROME_BROWSER,
+ *chrome);
+ } else {
+ BrowserDistribution* dist =
+ BrowserDistribution::GetSpecificDistribution(
+ BrowserDistribution::CHROME_BROWSER);
+ scoped_ptr<Product> product(new Product(dist));
+ if (installer_state->is_multi_install())
+ product->SetOption(installer::kOptionMultiInstall, true);
+ installer_state->AddProduct(&product);
+ }
+ }
+
+ static void AddChromeFrameToInstallerState(
+ const InstallationState& machine_state,
+ bool ready_mode,
+ MockInstallerState* installer_state) {
+ // Fresh install or upgrade?
+ const ProductState* cf =
+ machine_state.GetProductState(installer_state->system_install(),
+ BrowserDistribution::CHROME_FRAME);
+ if (cf != NULL) {
+ installer_state->AddProductFromState(BrowserDistribution::CHROME_FRAME,
+ *cf);
+ } else {
+ BrowserDistribution* dist =
+ BrowserDistribution::GetSpecificDistribution(
+ BrowserDistribution::CHROME_FRAME);
+ scoped_ptr<Product> product(new Product(dist));
+ if (installer_state->is_multi_install()) {
+ product->SetOption(installer::kOptionMultiInstall, true);
+ if (ready_mode)
+ product->SetOption(installer::kOptionReadyMode, true);
+ }
+ installer_state->AddProduct(&product);
+ }
+ }
+
+ static MockInstallerState* BuildChromeInstallerState(
+ bool system_install,
+ bool multi_install,
+ const InstallationState& machine_state,
+ InstallerState::Operation operation) {
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_install, multi_install, machine_state,
+ operation));
+ AddChromeToInstallerState(machine_state, installer_state.get());
return installer_state.release();
}
+ static MockInstallerState* BuildChromeFrameInstallerState(
+ bool system_install,
+ bool multi_install,
+ bool ready_mode,
+ const InstallationState& machine_state,
+ InstallerState::Operation operation) {
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_install, multi_install, machine_state,
+ operation));
+ AddChromeFrameToInstallerState(machine_state, ready_mode,
+ installer_state.get());
+ return installer_state.release();
+ }
+
protected:
scoped_ptr<Version> current_version_;
scoped_ptr<Version> new_version_;
@@ -368,3 +503,224 @@
*new_version_.get(),
&work_item_list);
}
+
+// Test scenarios under which the quick-enable-cf command should not exist after
+// the run. We're permissive in that we allow the DeleteRegKeyWorkItem even if
+// it isn't strictly needed.
+class QuickEnableAbsentTest : public InstallWorkerTest {
+ public:
+ virtual void SetUp() {
+ InstallWorkerTest::SetUp();
+ root_key_ = system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+ delete_reg_key_item_.reset(
+ WorkItem::CreateDeleteRegKeyWorkItem(root_key_, kRegKeyPath));
+ machine_state_.reset(new MockInstallationState());
+ EXPECT_CALL(work_item_list_,
+ AddDeleteRegKeyWorkItem(Eq(root_key_), StrCaseEq(kRegKeyPath)))
+ .Times(AtMost(1))
+ .WillRepeatedly(Return(delete_reg_key_item_.get()));
+ }
+ virtual void TearDown() {
+ machine_state_.reset();
+ delete_reg_key_item_.reset();
+ root_key_ = NULL;
+ InstallWorkerTest::TearDown();
+ }
+ protected:
+ static const bool system_level_ = false;
+ static const wchar_t kRegKeyPath[];
+ HKEY root_key_;
+ scoped_ptr<DeleteRegKeyWorkItem> delete_reg_key_item_;
+ scoped_ptr<MockInstallationState> machine_state_;
+ StrictMock<MockWorkItemList> work_item_list_;
+};
+
+const wchar_t QuickEnableAbsentTest::kRegKeyPath[] =
+ L"Software\\Google\\Update\\Clients\\"
+ L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}\\Commands\\quick-enable-cf";
+
+TEST_F(QuickEnableAbsentTest, CleanInstallSingleChrome) {
+ // Install single Chrome on a clean system.
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildChromeInstallerState(system_level_, false, *machine_state_,
+ InstallerState::SINGLE_INSTALL_OR_UPDATE));
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnableAbsentTest, CleanInstallSingleChromeFrame) {
+ // Install single Chrome Frame on a clean system.
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildChromeFrameInstallerState(system_level_, false, false,
+ *machine_state_,
+ InstallerState::SINGLE_INSTALL_OR_UPDATE));
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnableAbsentTest, CleanInstallMultiChromeFrame) {
+ // Install multi Chrome Frame on a clean system.
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildChromeFrameInstallerState(system_level_, true, false,
+ *machine_state_,
+ InstallerState::MULTI_INSTALL));
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnableAbsentTest, CleanInstallMultiChromeChromeFrame) {
+ // Install multi Chrome and Chrome Frame on a clean system.
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_level_, true, *machine_state_,
+ InstallerState::MULTI_INSTALL));
+ AddChromeToInstallerState(*machine_state_, installer_state.get());
+ AddChromeFrameToInstallerState(*machine_state_, false,
+ installer_state.get());
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnableAbsentTest, UninstallMultiChromeLeaveMultiChromeFrame) {
+ // Uninstall multi Chrome on a machine with multi Chrome Frame.
+ AddChromeToInstallationState(system_level_, true, false,
+ machine_state_.get());
+ AddChromeFrameToInstallationState(system_level_, true, false,
+ machine_state_.get());
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_level_, true, *machine_state_,
+ InstallerState::UNINSTALL));
+ AddChromeToInstallerState(*machine_state_, installer_state.get());
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnableAbsentTest, UninstallMultiChromeLeaveSingleChromeFrame) {
+ // Uninstall multi Chrome on a machine with single Chrome Frame.
+ AddChromeToInstallationState(system_level_, true, false,
+ machine_state_.get());
+ AddChromeFrameToInstallationState(system_level_, false, false,
+ machine_state_.get());
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_level_, true, *machine_state_,
+ InstallerState::UNINSTALL));
+ AddChromeToInstallerState(*machine_state_, installer_state.get());
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnableAbsentTest, AcceptReadyMode) {
+ // Accept ready-mode.
+ AddChromeToInstallationState(system_level_, true, true,
+ machine_state_.get());
+ AddChromeFrameToInstallationState(system_level_, true, true,
+ machine_state_.get());
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_level_, true, *machine_state_,
+ InstallerState::UNINSTALL));
+ AddChromeToInstallerState(*machine_state_, installer_state.get());
+ AddChromeFrameToInstallerState(*machine_state_, false, installer_state.get());
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+// Test scenarios under which the quick-enable-cf command should exist after the
+// run.
+class QuickEnablePresentTest : public InstallWorkerTest {
+ public:
+ virtual void SetUp() {
+ InstallWorkerTest::SetUp();
+ root_key_ = system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+ create_reg_key_work_item_.reset(
+ WorkItem::CreateCreateRegKeyWorkItem(root_key_, kRegKeyPath));
+ set_reg_value_work_item_.reset(
+ WorkItem::CreateSetRegValueWorkItem(root_key_, kRegKeyPath, L"", L"",
+ false));
+ machine_state_.reset(new MockInstallationState());
+ EXPECT_CALL(work_item_list_,
+ AddCreateRegKeyWorkItem(Eq(root_key_), StrCaseEq(kRegKeyPath)))
+ .Times(1)
+ .WillOnce(Return(create_reg_key_work_item_.get()));
+ EXPECT_CALL(work_item_list_,
+ AddSetRegStringValueWorkItem(Eq(root_key_),
+ StrCaseEq(kRegKeyPath),
+ StrEq(L"CommandLine"), _,
+ Eq(true)))
+ .Times(1)
+ .WillOnce(Return(set_reg_value_work_item_.get()));
+ EXPECT_CALL(work_item_list_,
+ AddSetRegDwordValueWorkItem(Eq(root_key_),
+ StrCaseEq(kRegKeyPath), _,
+ Eq(static_cast<DWORD>(1)),
+ Eq(true)))
+ .Times(2)
+ .WillRepeatedly(Return(set_reg_value_work_item_.get()));
+ }
+ virtual void TearDown() {
+ machine_state_.reset();
+ set_reg_value_work_item_.reset();
+ create_reg_key_work_item_.reset();
+ root_key_ = NULL;
+ InstallWorkerTest::TearDown();
+ }
+ protected:
+ static const bool system_level_ = false;
+ static const wchar_t kRegKeyPath[];
+ HKEY root_key_;
+ scoped_ptr<CreateRegKeyWorkItem> create_reg_key_work_item_;
+ scoped_ptr<SetRegValueWorkItem> set_reg_value_work_item_;
+ scoped_ptr<MockInstallationState> machine_state_;
+ StrictMock<MockWorkItemList> work_item_list_;
+};
+
+const wchar_t QuickEnablePresentTest::kRegKeyPath[] =
+ L"Software\\Google\\Update\\Clients\\"
+ L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}\\Commands\\quick-enable-cf";
+
+TEST_F(QuickEnablePresentTest, CleanInstallMultiChrome) {
+ // Install multi Chrome on a clean system.
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildChromeInstallerState(system_level_, true, *machine_state_,
+ InstallerState::MULTI_INSTALL));
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnablePresentTest, CleanInstallMultiChromeReadyMode) {
+ // Install multi Chrome with Chrome Frame ready-mode on a clean system.
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_level_, true, *machine_state_,
+ InstallerState::MULTI_INSTALL));
+ AddChromeToInstallerState(*machine_state_, installer_state.get());
+ AddChromeFrameToInstallerState(*machine_state_, true,
+ installer_state.get());
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnablePresentTest, UninstallSingleChromeFrame) {
+ // Uninstall single Chrome Frame on a machine with multi Chrome.
+ AddChromeToInstallationState(system_level_, true, false,
+ machine_state_.get());
+ AddChromeFrameToInstallationState(system_level_, false, false,
+ machine_state_.get());
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_level_, false, *machine_state_,
+ InstallerState::UNINSTALL));
+ AddChromeFrameToInstallerState(*machine_state_, false, installer_state.get());
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
+
+TEST_F(QuickEnablePresentTest, UninstallMultiChromeFrame) {
+ // Uninstall multi Chrome Frame on a machine with multi Chrome.
+ AddChromeToInstallationState(system_level_, true, false,
+ machine_state_.get());
+ AddChromeFrameToInstallationState(system_level_, true, false,
+ machine_state_.get());
+ scoped_ptr<MockInstallerState> installer_state(
+ BuildBasicInstallerState(system_level_, true, *machine_state_,
+ InstallerState::UNINSTALL));
+ AddChromeFrameToInstallerState(*machine_state_, false, installer_state.get());
+ AddQuickEnableWorkItems(*installer_state, *machine_state_, &setup_path_,
+ new_version_.get(), &work_item_list_);
+}
« no previous file with comments | « chrome/installer/setup/install_worker.cc ('k') | chrome/installer/setup/setup_main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698