summaryrefslogtreecommitdiffstats
path: root/chrome/installer/util/google_update_settings_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/installer/util/google_update_settings_unittest.cc')
-rw-r--r--chrome/installer/util/google_update_settings_unittest.cc266
1 files changed, 265 insertions, 1 deletions
diff --git a/chrome/installer/util/google_update_settings_unittest.cc b/chrome/installer/util/google_update_settings_unittest.cc
index 69348b6..a483c6a 100644
--- a/chrome/installer/util/google_update_settings_unittest.cc
+++ b/chrome/installer/util/google_update_settings_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -6,6 +6,7 @@
#include <shlwapi.h> // For SHDeleteKey.
#include "base/memory/scoped_ptr.h"
+#include "base/test/test_reg_util_win.h"
#include "base/win/registry.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/installer/util/browser_distribution.h"
@@ -587,3 +588,266 @@ TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyAppOverride) {
}
#endif // defined(GOOGLE_CHROME_BUILD)
+
+// Test values for use by the CollectStatsConsent test fixture.
+class StatsState {
+ public:
+ enum InstallType {
+ SINGLE_INSTALL,
+ MULTI_INSTALL,
+ };
+ enum StateSetting {
+ NO_SETTING,
+ FALSE_SETTING,
+ TRUE_SETTING,
+ };
+ struct UserLevelState {};
+ struct SystemLevelState {};
+ static const UserLevelState kUserLevel;
+ static const SystemLevelState kSystemLevel;
+
+ StatsState(const UserLevelState&,
+ InstallType install_type,
+ StateSetting state_value)
+ : system_level_(false),
+ multi_install_(install_type == MULTI_INSTALL),
+ state_value_(state_value),
+ state_medium_value_(NO_SETTING) {
+ }
+ StatsState(const SystemLevelState&,
+ InstallType install_type,
+ StateSetting state_value,
+ StateSetting state_medium_value)
+ : system_level_(true),
+ multi_install_(install_type == MULTI_INSTALL),
+ state_value_(state_value),
+ state_medium_value_(state_medium_value) {
+ }
+ bool system_level() const { return system_level_; }
+ bool multi_install() const { return multi_install_; }
+ HKEY root_key() const {
+ return system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+ }
+ StateSetting state_value() const { return state_value_; }
+ StateSetting state_medium_value() const {
+ return state_medium_value_;
+ }
+ bool is_consent_granted() const {
+ return (system_level_ && state_medium_value_ != NO_SETTING) ?
+ (state_medium_value_ == TRUE_SETTING) :
+ (state_value_ == TRUE_SETTING);
+ }
+ private:
+ bool system_level_;
+ bool multi_install_;
+ StateSetting state_value_;
+ StateSetting state_medium_value_;
+};
+
+const StatsState::UserLevelState StatsState::kUserLevel;
+const StatsState::SystemLevelState StatsState::kSystemLevel;
+
+// A value parameterized test for testing the stats collection consent setting.
+class CollectStatsConsent : public ::testing::TestWithParam<StatsState> {
+ public:
+ static void SetUpTestCase();
+ static void TearDownTestCase();
+ protected:
+ virtual void SetUp() OVERRIDE;
+ static void MakeChromeMultiInstall(HKEY root_key);
+ static void ApplySetting(StatsState::StateSetting setting,
+ HKEY root_key,
+ const std::wstring& reg_key);
+
+ static std::wstring* chrome_version_key_;
+ static std::wstring* chrome_state_key_;
+ static std::wstring* chrome_state_medium_key_;
+ static std::wstring* binaries_state_key_;
+ static std::wstring* binaries_state_medium_key_;
+ registry_util::RegistryOverrideManager override_manager_;
+};
+
+std::wstring* CollectStatsConsent::chrome_version_key_;
+std::wstring* CollectStatsConsent::chrome_state_key_;
+std::wstring* CollectStatsConsent::chrome_state_medium_key_;
+std::wstring* CollectStatsConsent::binaries_state_key_;
+std::wstring* CollectStatsConsent::binaries_state_medium_key_;
+
+void CollectStatsConsent::SetUpTestCase() {
+ BrowserDistribution* dist =
+ BrowserDistribution::GetSpecificDistribution(
+ BrowserDistribution::CHROME_BROWSER);
+ chrome_version_key_ = new std::wstring(dist->GetVersionKey());
+ chrome_state_key_ = new std::wstring(dist->GetStateKey());
+ chrome_state_medium_key_ = new std::wstring(dist->GetStateMediumKey());
+
+ dist = BrowserDistribution::GetSpecificDistribution(
+ BrowserDistribution::CHROME_BINARIES);
+ binaries_state_key_ = new std::wstring(dist->GetStateKey());
+ binaries_state_medium_key_ = new std::wstring(dist->GetStateMediumKey());
+}
+
+void CollectStatsConsent::TearDownTestCase() {
+ delete chrome_version_key_;
+ delete chrome_state_key_;
+ delete chrome_state_medium_key_;
+ delete binaries_state_key_;
+ delete binaries_state_medium_key_;
+}
+
+// Install the registry override and apply the settings to the registry.
+void CollectStatsConsent::SetUp() {
+ const StatsState& stats_state = GetParam();
+ const HKEY root_key = stats_state.root_key();
+ std::wstring reg_temp_name(stats_state.system_level() ? L"HKLM_" : L"HKCU_");
+ reg_temp_name += L"CollectStatsConsent";
+ override_manager_.OverrideRegistry(root_key, reg_temp_name);
+
+ if (stats_state.multi_install()) {
+ MakeChromeMultiInstall(root_key);
+ ApplySetting(stats_state.state_value(), root_key, *binaries_state_key_);
+ ApplySetting(stats_state.state_medium_value(), root_key,
+ *binaries_state_medium_key_);
+ } else {
+ ApplySetting(stats_state.state_value(), root_key, *chrome_state_key_);
+ ApplySetting(stats_state.state_medium_value(), root_key,
+ *chrome_state_medium_key_);
+ }
+}
+
+// Write values into the registry so that Chrome is considered to be installed
+// as multi-install.
+void CollectStatsConsent::MakeChromeMultiInstall(HKEY root_key) {
+ ASSERT_EQ(
+ ERROR_SUCCESS,
+ RegKey(root_key, chrome_version_key_->c_str(),
+ KEY_SET_VALUE).WriteValue(google_update::kRegVersionField,
+ L"1.2.3.4"));
+ ASSERT_EQ(
+ ERROR_SUCCESS,
+ RegKey(root_key, chrome_state_key_->c_str(),
+ KEY_SET_VALUE).WriteValue(installer::kUninstallArgumentsField,
+ L"--multi-install"));
+}
+
+// Write the correct value to represent |setting| in the registry.
+void CollectStatsConsent::ApplySetting(StatsState::StateSetting setting,
+ HKEY root_key,
+ const std::wstring& reg_key) {
+ if (setting != StatsState::NO_SETTING) {
+ DWORD value = setting != StatsState::FALSE_SETTING ? 1 : 0;
+ ASSERT_EQ(
+ ERROR_SUCCESS,
+ RegKey(root_key, reg_key.c_str(),
+ KEY_SET_VALUE).WriteValue(google_update::kRegUsageStatsField,
+ value));
+ }
+}
+
+// Test that stats consent can be read.
+TEST_P(CollectStatsConsent, GetCollectStatsConsentAtLevel) {
+ if (GetParam().is_consent_granted()) {
+ EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
+ GetParam().system_level()));
+ } else {
+ EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
+ GetParam().system_level()));
+ }
+}
+
+// Test that stats consent can be flipped to the opposite setting, that the new
+// setting takes affect, and that the correct registry location is modified.
+TEST_P(CollectStatsConsent, SetCollectStatsConsentAtLevel) {
+ EXPECT_TRUE(GoogleUpdateSettings::SetCollectStatsConsentAtLevel(
+ GetParam().system_level(),
+ !GetParam().is_consent_granted()));
+ const std::wstring* const reg_keys[] = {
+ chrome_state_key_,
+ chrome_state_medium_key_,
+ binaries_state_key_,
+ binaries_state_medium_key_,
+ };
+ int key_index = ((GetParam().system_level() ? 1 : 0) +
+ (GetParam().multi_install() ? 2 : 0));
+ const std::wstring& reg_key = *reg_keys[key_index];
+ DWORD value = 0;
+ EXPECT_EQ(
+ ERROR_SUCCESS,
+ RegKey(GetParam().root_key(), reg_key.c_str(),
+ KEY_QUERY_VALUE).ReadValueDW(google_update::kRegUsageStatsField,
+ &value));
+ if (GetParam().is_consent_granted()) {
+ EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
+ GetParam().system_level()));
+ EXPECT_EQ(0UL, value);
+ } else {
+ EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
+ GetParam().system_level()));
+ EXPECT_EQ(1UL, value);
+ }
+}
+
+INSTANTIATE_TEST_CASE_P(
+ UserLevelSingleInstall,
+ CollectStatsConsent,
+ ::testing::Values(
+ StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
+ StatsState::NO_SETTING),
+ StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
+ StatsState::FALSE_SETTING),
+ StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
+ StatsState::TRUE_SETTING)));
+INSTANTIATE_TEST_CASE_P(
+ UserLevelMultiInstall,
+ CollectStatsConsent,
+ ::testing::Values(
+ StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
+ StatsState::NO_SETTING),
+ StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
+ StatsState::FALSE_SETTING),
+ StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
+ StatsState::TRUE_SETTING)));
+INSTANTIATE_TEST_CASE_P(
+ SystemLevelSingleInstall,
+ CollectStatsConsent,
+ ::testing::Values(
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::NO_SETTING, StatsState::NO_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::NO_SETTING, StatsState::FALSE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::NO_SETTING, StatsState::TRUE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::FALSE_SETTING, StatsState::NO_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::FALSE_SETTING, StatsState::FALSE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::FALSE_SETTING, StatsState::TRUE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::TRUE_SETTING, StatsState::NO_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::TRUE_SETTING, StatsState::FALSE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
+ StatsState::TRUE_SETTING, StatsState::TRUE_SETTING)));
+INSTANTIATE_TEST_CASE_P(
+ SystemLevelMultiInstall,
+ CollectStatsConsent,
+ ::testing::Values(
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::NO_SETTING, StatsState::NO_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::NO_SETTING, StatsState::FALSE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::NO_SETTING, StatsState::TRUE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::FALSE_SETTING, StatsState::NO_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::FALSE_SETTING, StatsState::FALSE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::FALSE_SETTING, StatsState::TRUE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::TRUE_SETTING, StatsState::NO_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::TRUE_SETTING, StatsState::FALSE_SETTING),
+ StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
+ StatsState::TRUE_SETTING, StatsState::TRUE_SETTING)));