blob: b4fc671131897cce7a539fe894501b056c63fba3 [file] [log] [blame]
// Copyright (c) 2010 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.
#include <gtest/gtest.h>
#include <windows.h>
#include "base/logging.h"
#include "base/registry.h"
#include "base/scoped_ptr.h"
#include "base/string_piece.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/configuration_policy_provider_win.h"
#include "chrome/browser/mock_configuration_policy_store.h"
#include "chrome/common/pref_names.h"
namespace {
const wchar_t kUnitTestRegistrySubKey[] = L"SOFTWARE\\Chromium Unit Tests";
const wchar_t kUnitTestMachineOverrideSubKey[] =
L"SOFTWARE\\Chromium Unit Tests\\HKLM Override";
const wchar_t kUnitTestUserOverrideSubKey[] =
L"SOFTWARE\\Chromium Unit Tests\\HKCU Override";
} // namespace
// A subclass of |ConfigurationPolicyProviderWin| providing access to
// internal protected constants without an orgy of FRIEND_TESTS.
class TestConfigurationPolicyProviderWin
: public ConfigurationPolicyProviderWin {
public:
TestConfigurationPolicyProviderWin() : ConfigurationPolicyProviderWin() { }
virtual ~TestConfigurationPolicyProviderWin() { }
void SetHomepageRegistryValue(HKEY hive, const wchar_t* value);
void SetHomepageRegistryValueWrongType(HKEY hive);
void SetHomepageIsNewTabPage(HKEY hive, bool value);
void SetCookiesMode(HKEY hive, uint32 value);
typedef std::vector<PolicyValueMapEntry> PolicyValueMap;
static const PolicyValueMap* PolicyValueMapping() {
return ConfigurationPolicyProvider::PolicyValueMapping();
}
};
namespace {
std::wstring NameForPolicy(ConfigurationPolicyStore::PolicyType policy) {
const TestConfigurationPolicyProviderWin::PolicyValueMap* mapping =
TestConfigurationPolicyProviderWin::PolicyValueMapping();
for (TestConfigurationPolicyProviderWin::PolicyValueMap::const_iterator
current = mapping->begin(); current != mapping->end(); ++current) {
if (current->policy_type == policy)
return UTF8ToWide(current->name);
}
return NULL;
}
} // namespace
void TestConfigurationPolicyProviderWin::SetHomepageRegistryValue(
HKEY hive,
const wchar_t* value) {
RegKey key(hive,
ConfigurationPolicyProviderWin::kPolicyRegistrySubKey,
KEY_ALL_ACCESS);
EXPECT_TRUE(key.WriteValue(
NameForPolicy(ConfigurationPolicyStore::kPolicyHomePage).c_str(),
value));
}
void TestConfigurationPolicyProviderWin::SetHomepageRegistryValueWrongType(
HKEY hive) {
RegKey key(hive,
ConfigurationPolicyProviderWin::kPolicyRegistrySubKey,
KEY_ALL_ACCESS);
EXPECT_TRUE(key.WriteValue(
NameForPolicy(ConfigurationPolicyStore::kPolicyHomePage).c_str(),
5));
}
void TestConfigurationPolicyProviderWin::SetHomepageIsNewTabPage(
HKEY hive,
bool value) {
RegKey key(hive,
ConfigurationPolicyProviderWin::kPolicyRegistrySubKey,
KEY_ALL_ACCESS);
EXPECT_TRUE(key.WriteValue(NameForPolicy(
ConfigurationPolicyStore::kPolicyHomepageIsNewTabPage).c_str(),
value));
}
void TestConfigurationPolicyProviderWin::SetCookiesMode(
HKEY hive,
uint32 value) {
RegKey key(hive,
ConfigurationPolicyProviderWin::kPolicyRegistrySubKey,
KEY_ALL_ACCESS);
EXPECT_TRUE(key.WriteValue(
NameForPolicy(ConfigurationPolicyStore::kPolicyCookiesMode).c_str(),
value));
}
// This test class provides sandboxing and mocking for the parts of the
// Windows Registry implementing Group Policy. The |SetUp| method prepares
// two temporary sandbox keys in |kUnitTestRegistrySubKey|, one for HKLM and one
// for HKCU. A test's calls to the registry are redirected by Windows to these
// sandboxes, allowing the tests to manipulate and access policy as if it
// were active, but without actually changing the parts of the Registry that
// are managed by Group Policy.
class ConfigurationPolicyProviderWinTest : public testing::Test {
public:
ConfigurationPolicyProviderWinTest();
// testing::Test method overrides:
virtual void SetUp();
virtual void TearDown();
void ActivateOverrides();
void DeactivateOverrides();
// Deletes the registry key created during the tests.
void DeleteRegistrySandbox();
private:
// Keys are created for the lifetime of a test to contain
// the sandboxed HKCU and HKLM hives, respectively.
RegKey temp_hkcu_hive_key_;
RegKey temp_hklm_hive_key_;
};
ConfigurationPolicyProviderWinTest::ConfigurationPolicyProviderWinTest()
: temp_hklm_hive_key_(HKEY_CURRENT_USER, kUnitTestMachineOverrideSubKey),
temp_hkcu_hive_key_(HKEY_CURRENT_USER, kUnitTestUserOverrideSubKey) {
}
void ConfigurationPolicyProviderWinTest::SetUp() {
// Cleanup any remnants of previous tests.
DeleteRegistrySandbox();
// Create the subkeys to hold the overridden HKLM and HKCU
// policy settings.
temp_hklm_hive_key_.Create(HKEY_CURRENT_USER,
kUnitTestMachineOverrideSubKey,
KEY_ALL_ACCESS);
temp_hkcu_hive_key_.Create(HKEY_CURRENT_USER,
kUnitTestUserOverrideSubKey,
KEY_ALL_ACCESS);
ActivateOverrides();
}
void ConfigurationPolicyProviderWinTest::ActivateOverrides() {
HRESULT result = RegOverridePredefKey(HKEY_LOCAL_MACHINE,
temp_hklm_hive_key_.Handle());
EXPECT_EQ(ERROR_SUCCESS, result);
result = RegOverridePredefKey(HKEY_CURRENT_USER,
temp_hkcu_hive_key_.Handle());
EXPECT_EQ(ERROR_SUCCESS, result);
}
void ConfigurationPolicyProviderWinTest::DeactivateOverrides() {
uint32 result = RegOverridePredefKey(HKEY_LOCAL_MACHINE, 0);
EXPECT_EQ(ERROR_SUCCESS, result);
result = RegOverridePredefKey(HKEY_CURRENT_USER, 0);
EXPECT_EQ(ERROR_SUCCESS, result);
}
void ConfigurationPolicyProviderWinTest::TearDown() {
DeactivateOverrides();
DeleteRegistrySandbox();
}
void ConfigurationPolicyProviderWinTest::DeleteRegistrySandbox() {
temp_hklm_hive_key_.Close();
temp_hkcu_hive_key_.Close();
RegKey key(HKEY_CURRENT_USER, kUnitTestRegistrySubKey, KEY_ALL_ACCESS);
key.DeleteKey(L"");
}
TEST_F(ConfigurationPolicyProviderWinTest, TestHomePagePolicyDefault) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyHomePage);
EXPECT_TRUE(i == map.end());
}
TEST_F(ConfigurationPolicyProviderWinTest, TestHomePagePolicyHKCU) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.SetHomepageRegistryValue(HKEY_CURRENT_USER,
L"http://chromium.org");
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyHomePage);
EXPECT_TRUE(i != map.end());
string16 value;
i->second->GetAsString(&value);
EXPECT_EQ(L"http://chromium.org", value);
}
TEST_F(ConfigurationPolicyProviderWinTest, TestHomePagePolicyHKCUWrongType) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.SetHomepageRegistryValueWrongType(HKEY_CURRENT_USER);
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyHomePage);
EXPECT_TRUE(i == map.end());
}
TEST_F(ConfigurationPolicyProviderWinTest, TestHomePagePolicyHKLM) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.SetHomepageRegistryValue(HKEY_LOCAL_MACHINE,
L"http://chromium.org");
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyHomePage);
EXPECT_TRUE(i != map.end());
string16 value;
i->second->GetAsString(&value);
EXPECT_EQ(L"http://chromium.org", value);
}
TEST_F(ConfigurationPolicyProviderWinTest, TestHomePagePolicyHKLMOverHKCU) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.SetHomepageRegistryValue(HKEY_CURRENT_USER,
L"http://chromium.org");
provider.SetHomepageRegistryValue(HKEY_LOCAL_MACHINE,
L"http://crbug.com");
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyHomePage);
EXPECT_TRUE(i != map.end());
string16 value;
i->second->GetAsString(&value);
EXPECT_EQ(L"http://crbug.com", value);
}
TEST_F(ConfigurationPolicyProviderWinTest,
TestHomepageIsNewTabPagePolicyDefault) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyHomepageIsNewTabPage);
EXPECT_TRUE(i == map.end());
}
TEST_F(ConfigurationPolicyProviderWinTest,
TestHomepageIsNewTabPagePolicyHKLM) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.SetHomepageIsNewTabPage(HKEY_LOCAL_MACHINE, true);
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyHomepageIsNewTabPage);
EXPECT_TRUE(i != map.end());
bool value = false;
i->second->GetAsBoolean(&value);
EXPECT_EQ(true, value);
}
TEST_F(ConfigurationPolicyProviderWinTest,
TestCookiesModePolicyDefault) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyCookiesMode);
EXPECT_TRUE(i == map.end());
}
TEST_F(ConfigurationPolicyProviderWinTest,
TestCookiesModePolicyHKLM) {
MockConfigurationPolicyStore store;
TestConfigurationPolicyProviderWin provider;
provider.SetCookiesMode(HKEY_LOCAL_MACHINE, 2);
provider.Provide(&store);
const MockConfigurationPolicyStore::PolicyMap& map(store.policy_map());
MockConfigurationPolicyStore::PolicyMap::const_iterator i =
map.find(ConfigurationPolicyStore::kPolicyCookiesMode);
EXPECT_TRUE(i != map.end());
int value = 0;
i->second->GetAsInteger(&value);
EXPECT_EQ(2, value);
}