Index: chrome/installer/setup/install_worker_unittest.cc |
diff --git a/chrome/installer/setup/install_worker_unittest.cc b/chrome/installer/setup/install_worker_unittest.cc |
index 9cd28f086d8db0137ec9b6c6e623c343b4d516e7..5570620edf1620a8c025c8c4a3aac73abd80fd8c 100644 |
--- a/chrome/installer/setup/install_worker_unittest.cc |
+++ b/chrome/installer/setup/install_worker_unittest.cc |
@@ -4,22 +4,26 @@ |
#include "chrome/installer/setup/install_worker.h" |
-#include "base/win/registry.h" |
+#include <iostream> |
+ |
+#include "base/test/test_reg_util_win.h" |
#include "base/version.h" |
+#include "base/win/registry.h" |
#include "chrome/common/chrome_constants.h" |
#include "chrome/installer/setup/setup_util.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/delete_reg_key_work_item.h" |
#include "chrome/installer/util/google_update_constants.h" |
+#include "chrome/installer/util/helper.h" |
+#include "chrome/installer/util/install_util.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.h" |
#include "chrome/installer/util/work_item_list.h" |
- |
-#include "testing/gtest/include/gtest/gtest.h" |
#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
using base::win::RegKey; |
using installer::InstallationState; |
@@ -38,7 +42,7 @@ using ::testing::Return; |
using ::testing::StrCaseEq; |
using ::testing::StrEq; |
using ::testing::StrictMock; |
-using ::testing::Values; |
+using ::testing::ValuesIn; |
// Mock classes to help with testing |
//------------------------------------------------------------------------------ |
@@ -166,7 +170,12 @@ class MockInstallerState : public InstallerState { |
class InstallWorkerTest : public testing::Test { |
public: |
+ InstallWorkerTest() {} |
+ |
void SetUp() override { |
+ registry_override_manager_.OverrideRegistry(HKEY_CURRENT_USER); |
+ registry_override_manager_.OverrideRegistry(HKEY_LOCAL_MACHINE); |
+ |
current_version_.reset(new Version("1.0.0.0")); |
new_version_.reset(new Version("42.0.0.0")); |
@@ -424,6 +433,11 @@ class InstallWorkerTest : public testing::Test { |
base::FilePath setup_path_; |
base::FilePath src_path_; |
base::FilePath temp_dir_; |
+ |
+ private: |
+ registry_util::RegistryOverrideManager registry_override_manager_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InstallWorkerTest); |
}; |
// Tests |
@@ -671,6 +685,109 @@ TEST_F(InstallWorkerTest, AddUsageStatsWorkItems) { |
&work_item_list); |
} |
+struct ActiveSetupWorkerTestCase { |
+ // The initial value to be set in the registry prior to simulating the update. |
+ // No value will be set if this null. |
+ const wchar_t* initial_value; |
+ |
+ // The expected value after simulating the update. |
+ const wchar_t* expected_result; |
+}; |
+ |
+// Implements PrintTo in order for gtest to be able to print the problematic |
+// ActiveSetupWorkerTestCase on failure. |
+void PrintTo(const ActiveSetupWorkerTestCase& test_case, ::std::ostream* os) { |
+ *os << "Initial value: " |
+ << (test_case.initial_value ? test_case.initial_value : L"(empty)") |
+ << ", expected result: " << test_case.expected_result; |
+} |
+ |
+class ActiveSetupWorkerTest |
+ : public InstallWorkerTest, |
+ public ::testing::WithParamInterface<ActiveSetupWorkerTestCase> {}; |
+ |
+// Test that active setup version installing/updating is handled properly. |
+TEST_P(ActiveSetupWorkerTest, AddAndRunActiveSetupWorkItems) { |
+ // Active Setup only makes sense at system-level. |
+ const bool system_level = true; |
+ const bool multi_install = false; |
+ |
+ scoped_ptr<MockInstallationState> installation_state( |
+ BuildChromeInstallationState(system_level, multi_install)); |
+ |
+ MockProductState chrome_state; |
+ chrome_state.set_version(new Version(*current_version_)); |
+ chrome_state.set_multi_install(multi_install); |
+ |
+ installation_state->SetProductState( |
+ system_level, BrowserDistribution::CHROME_BROWSER, chrome_state); |
+ |
+ scoped_ptr<MockInstallerState> installer_state( |
+ BuildChromeInstallerState(system_level, multi_install, |
+ *installation_state, |
+ InstallerState::MULTI_INSTALL)); |
+ |
+ |
+ const HKEY kRoot = HKEY_LOCAL_MACHINE; |
+ const std::wstring active_setup_path(InstallUtil::GetActiveSetupPath( |
+ BrowserDistribution::GetSpecificDistribution( |
+ BrowserDistribution::CHROME_BROWSER))); |
+ RegKey test_key; |
+ |
+ EXPECT_NE(ERROR_SUCCESS, |
+ test_key.Open(kRoot, active_setup_path.c_str(), KEY_READ)); |
+ |
+ // Get the |test_case| which defines 3 steps: |
+ // 1) Maybe set an initial Active Setup version. |
+ // 2) Unconditionally execute the Active Setup work items. |
+ // 3) Verify that the updated Active Setup version is as expected. |
+ const ActiveSetupWorkerTestCase& test_case = GetParam(); |
+ |
+ if (test_case.initial_value) { |
+ EXPECT_EQ(ERROR_SUCCESS, |
+ test_key.Create(kRoot, active_setup_path.c_str(), KEY_SET_VALUE)); |
+ EXPECT_EQ(ERROR_SUCCESS, |
+ test_key.WriteValue(L"Version", test_case.initial_value)); |
+ } |
+ |
+ // Note: This performs real operations, it's *not* a MockWorkItemList like in |
+ // the other tests (the registry itself is mocked in the fixture however so |
+ // this is okay). |
+ scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); |
+ AddActiveSetupWorkItems( |
+ *installer_state, *current_version_, |
+ *installer_state->FindProduct(BrowserDistribution::CHROME_BROWSER), |
+ work_item_list.get()); |
+ work_item_list->Do(); |
+ |
+ std::wstring version_out; |
+ EXPECT_EQ(ERROR_SUCCESS, |
+ test_key.Open(kRoot, active_setup_path.c_str(), KEY_QUERY_VALUE)); |
+ EXPECT_EQ(ERROR_SUCCESS, test_key.ReadValue(L"Version", &version_out)); |
+ EXPECT_EQ(test_case.expected_result, version_out); |
+} |
+ |
+const ActiveSetupWorkerTestCase kActiveSetupTestCases[] = { |
+ // Initial install. |
+ {nullptr, L"43,0,0,0"}, |
+ // No-op update. |
+ {L"43.0.0.0", L"43,0,0,0"}, |
+ // Update only major component. |
+ {L"24,1,2,3", L"43,1,2,3"}, |
+ // Reset from bogus value. |
+ {L"zzz", L"43,0,0,0"}, |
+ // Reset from invalid version (too few components). |
+ {L"1,2", L"43,0,0,0"}, |
+ // Reset from invalid version (too many components). |
+ {L"43,1,2,3,10", L"43,0,0,0"}, |
+ // Reset from empty string. |
+ {L"", L"43,0,0,0"}, |
+}; |
+ |
+INSTANTIATE_TEST_CASE_P(ActiveSetupWorkerTestInstance, |
+ ActiveSetupWorkerTest, |
+ ValuesIn(kActiveSetupTestCases)); |
+ |
// The Quick Enable tests only make sense for the Google Chrome build as it |
// interacts with registry values that are specific to Google Update. |
#if defined(GOOGLE_CHROME_BUILD) |