Index: chrome/browser/policy/policy_loader_win_unittest.cc |
diff --git a/chrome/browser/policy/policy_loader_win_unittest.cc b/chrome/browser/policy/policy_loader_win_unittest.cc |
deleted file mode 100644 |
index 12ee9f6dc95fe38be7fc45120c7ed34418fe631f..0000000000000000000000000000000000000000 |
--- a/chrome/browser/policy/policy_loader_win_unittest.cc |
+++ /dev/null |
@@ -1,1218 +0,0 @@ |
-// 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. |
- |
-#include "chrome/browser/policy/policy_loader_win.h" |
- |
-#include <windows.h> |
-#include <userenv.h> |
- |
-#include <algorithm> |
-#include <cstring> |
-#include <functional> |
-#include <iterator> |
-#include <vector> |
- |
-#include "base/base_paths.h" |
-#include "base/callback.h" |
-#include "base/file_util.h" |
-#include "base/files/file_path.h" |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/json/json_writer.h" |
-#include "base/path_service.h" |
-#include "base/process/process.h" |
-#include "base/strings/string16.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/sys_byteorder.h" |
-#include "base/win/registry.h" |
-#include "chrome/browser/policy/preg_parser_win.h" |
-#include "components/json_schema/json_schema_constants.h" |
-#include "components/policy/core/common/async_policy_provider.h" |
-#include "components/policy/core/common/configuration_policy_provider_test.h" |
-#include "components/policy/core/common/external_data_fetcher.h" |
-#include "components/policy/core/common/policy_bundle.h" |
-#include "components/policy/core/common/policy_map.h" |
-#include "components/policy/core/common/schema_map.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace schema = json_schema_constants; |
- |
-using base::win::RegKey; |
- |
-namespace policy { |
- |
-namespace { |
- |
-// Constants for registry key names. |
-const wchar_t kPathSep[] = L"\\"; |
-const wchar_t kThirdParty[] = L"3rdparty"; |
-const wchar_t kMandatory[] = L"policy"; |
-const wchar_t kRecommended[] = L"recommended"; |
-const wchar_t kSchema[] = L"schema"; |
-const wchar_t kTestPolicyKey[] = L"chrome.policy.key"; |
- |
-// Installs |value| in the given registry |path| and |hive|, under the key |
-// |name|. Returns false on errors. |
-// Some of the possible Value types are stored after a conversion (e.g. doubles |
-// are stored as strings), and can only be retrieved if a corresponding schema |
-// is written. |
-bool InstallValue(const base::Value& value, |
- HKEY hive, |
- const string16& path, |
- const string16& name) { |
- // KEY_ALL_ACCESS causes the ctor to create the key if it does not exist yet. |
- RegKey key(hive, path.c_str(), KEY_ALL_ACCESS); |
- EXPECT_TRUE(key.Valid()); |
- switch (value.GetType()) { |
- case base::Value::TYPE_NULL: |
- return key.WriteValue(name.c_str(), L"") == ERROR_SUCCESS; |
- |
- case base::Value::TYPE_BOOLEAN: { |
- bool bool_value; |
- if (!value.GetAsBoolean(&bool_value)) |
- return false; |
- return key.WriteValue(name.c_str(), bool_value ? 1 : 0) == ERROR_SUCCESS; |
- } |
- |
- case base::Value::TYPE_INTEGER: { |
- int int_value; |
- if (!value.GetAsInteger(&int_value)) |
- return false; |
- return key.WriteValue(name.c_str(), int_value) == ERROR_SUCCESS; |
- } |
- |
- case base::Value::TYPE_DOUBLE: { |
- double double_value; |
- if (!value.GetAsDouble(&double_value)) |
- return false; |
- string16 str_value = UTF8ToUTF16(base::DoubleToString(double_value)); |
- return key.WriteValue(name.c_str(), str_value.c_str()) == ERROR_SUCCESS; |
- } |
- |
- case base::Value::TYPE_STRING: { |
- string16 str_value; |
- if (!value.GetAsString(&str_value)) |
- return false; |
- return key.WriteValue(name.c_str(), str_value.c_str()) == ERROR_SUCCESS; |
- } |
- |
- case base::Value::TYPE_DICTIONARY: { |
- const base::DictionaryValue* sub_dict = NULL; |
- if (!value.GetAsDictionary(&sub_dict)) |
- return false; |
- for (base::DictionaryValue::Iterator it(*sub_dict); |
- !it.IsAtEnd(); it.Advance()) { |
- if (!InstallValue(it.value(), hive, path + kPathSep + name, |
- UTF8ToUTF16(it.key()))) { |
- return false; |
- } |
- } |
- return true; |
- } |
- |
- case base::Value::TYPE_LIST: { |
- const base::ListValue* list = NULL; |
- if (!value.GetAsList(&list)) |
- return false; |
- for (size_t i = 0; i < list->GetSize(); ++i) { |
- const base::Value* item; |
- if (!list->Get(i, &item)) |
- return false; |
- if (!InstallValue(*item, hive, path + kPathSep + name, |
- base::UintToString16(i + 1))) { |
- return false; |
- } |
- } |
- return true; |
- } |
- |
- case base::Value::TYPE_BINARY: |
- return false; |
- } |
- NOTREACHED(); |
- return false; |
-} |
- |
-// Builds a JSON schema that represents the types contained in |value|. |
-// Ownership is transferred to the caller. |
-base::DictionaryValue* BuildSchema(const base::Value& value) { |
- base::DictionaryValue* schema = new base::DictionaryValue(); |
- switch (value.GetType()) { |
- case base::Value::TYPE_NULL: |
- schema->SetString(schema::kType, "null"); |
- break; |
- case base::Value::TYPE_BOOLEAN: |
- schema->SetString(schema::kType, "boolean"); |
- break; |
- case base::Value::TYPE_INTEGER: |
- schema->SetString(schema::kType, "integer"); |
- break; |
- case base::Value::TYPE_DOUBLE: |
- schema->SetString(schema::kType, "number"); |
- break; |
- case base::Value::TYPE_STRING: |
- schema->SetString(schema::kType, "string"); |
- break; |
- |
- case base::Value::TYPE_LIST: { |
- // Assumes every list element has the same type. |
- const base::ListValue* list = NULL; |
- if (value.GetAsList(&list) && !list->empty()) { |
- schema->SetString(schema::kType, "array"); |
- schema->Set(schema::kItems, BuildSchema(**list->begin())); |
- } |
- break; |
- } |
- |
- case base::Value::TYPE_DICTIONARY: { |
- const base::DictionaryValue* dict = NULL; |
- if (value.GetAsDictionary(&dict)) { |
- base::DictionaryValue* properties = new base::DictionaryValue(); |
- for (base::DictionaryValue::Iterator it(*dict); |
- !it.IsAtEnd(); it.Advance()) { |
- properties->Set(it.key(), BuildSchema(it.value())); |
- } |
- schema->SetString(schema::kType, "object"); |
- schema->Set(schema::kProperties, properties); |
- } |
- break; |
- } |
- |
- case base::Value::TYPE_BINARY: |
- break; |
- } |
- return schema; |
-} |
- |
-// Writes a JSON |schema| at the registry entry |name| at |path| |
-// in the given |hive|. Returns false on failure. |
-bool WriteSchema(const base::DictionaryValue& schema, |
- HKEY hive, |
- const string16& path, |
- const string16& name) { |
- std::string encoded; |
- base::JSONWriter::Write(&schema, &encoded); |
- if (encoded.empty()) |
- return false; |
- string16 encoded16 = UTF8ToUTF16(encoded); |
- // KEY_ALL_ACCESS causes the ctor to create the key if it does not exist yet. |
- RegKey key(hive, path.c_str(), KEY_ALL_ACCESS); |
- EXPECT_TRUE(key.Valid()); |
- return key.WriteValue(name.c_str(), encoded16.c_str()) == ERROR_SUCCESS; |
-} |
- |
-// Builds a JSON schema for |value| and writes it at the registry entry |name| |
-// at |path| in the given |hive|. Returns false on failure. |
-bool InstallSchema(const base::Value& value, |
- HKEY hive, |
- const string16& path, |
- const string16& name) { |
- scoped_ptr<base::DictionaryValue> schema_dict(BuildSchema(value)); |
- return WriteSchema(*schema_dict, hive, path, name); |
-} |
- |
-// This class provides sandboxing and mocking for the parts of the Windows |
-// Registry implementing Group Policy. It prepares two temporary sandbox keys, |
-// 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 ScopedGroupPolicyRegistrySandbox { |
- public: |
- ScopedGroupPolicyRegistrySandbox(); |
- ~ScopedGroupPolicyRegistrySandbox(); |
- |
- private: |
- void ActivateOverrides(); |
- void RemoveOverrides(); |
- |
- // Deletes the sandbox keys. |
- void DeleteKeys(); |
- |
- std::wstring key_name_; |
- |
- // 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_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ScopedGroupPolicyRegistrySandbox); |
-}; |
- |
-// A test harness that feeds policy via the Chrome GPO registry subtree. |
-class RegistryTestHarness : public PolicyProviderTestHarness, |
- public AppliedGPOListProvider { |
- public: |
- RegistryTestHarness(HKEY hive, PolicyScope scope); |
- virtual ~RegistryTestHarness(); |
- |
- // PolicyProviderTestHarness: |
- virtual void SetUp() OVERRIDE; |
- |
- virtual ConfigurationPolicyProvider* CreateProvider( |
- SchemaRegistry* registry, |
- scoped_refptr<base::SequencedTaskRunner> task_runner) OVERRIDE; |
- |
- virtual void InstallEmptyPolicy() OVERRIDE; |
- virtual void InstallStringPolicy(const std::string& policy_name, |
- const std::string& policy_value) OVERRIDE; |
- virtual void InstallIntegerPolicy(const std::string& policy_name, |
- int policy_value) OVERRIDE; |
- virtual void InstallBooleanPolicy(const std::string& policy_name, |
- bool policy_value) OVERRIDE; |
- virtual void InstallStringListPolicy( |
- const std::string& policy_name, |
- const base::ListValue* policy_value) OVERRIDE; |
- virtual void InstallDictionaryPolicy( |
- const std::string& policy_name, |
- const base::DictionaryValue* policy_value) OVERRIDE; |
- virtual void Install3rdPartyPolicy( |
- const base::DictionaryValue* policies) OVERRIDE; |
- |
- // AppliedGPOListProvider: |
- virtual DWORD GetAppliedGPOList(DWORD flags, |
- LPCTSTR machine_name, |
- PSID sid_user, |
- GUID* extension_guid, |
- PGROUP_POLICY_OBJECT* gpo_list) OVERRIDE; |
- virtual BOOL FreeGPOList(PGROUP_POLICY_OBJECT gpo_list) OVERRIDE; |
- |
- // Creates a harness instance that will install policy in HKCU or HKLM, |
- // respectively. |
- static PolicyProviderTestHarness* CreateHKCU(); |
- static PolicyProviderTestHarness* CreateHKLM(); |
- |
- private: |
- HKEY hive_; |
- |
- ScopedGroupPolicyRegistrySandbox registry_sandbox_; |
- |
- DISALLOW_COPY_AND_ASSIGN(RegistryTestHarness); |
-}; |
- |
-// A test harness that generates PReg files for the provider to read. |
-class PRegTestHarness : public PolicyProviderTestHarness, |
- public AppliedGPOListProvider { |
- public: |
- PRegTestHarness(); |
- virtual ~PRegTestHarness(); |
- |
- // PolicyProviderTestHarness: |
- virtual void SetUp() OVERRIDE; |
- |
- virtual ConfigurationPolicyProvider* CreateProvider( |
- SchemaRegistry* registry, |
- scoped_refptr<base::SequencedTaskRunner> task_runner) OVERRIDE; |
- |
- virtual void InstallEmptyPolicy() OVERRIDE; |
- virtual void InstallStringPolicy(const std::string& policy_name, |
- const std::string& policy_value) OVERRIDE; |
- virtual void InstallIntegerPolicy(const std::string& policy_name, |
- int policy_value) OVERRIDE; |
- virtual void InstallBooleanPolicy(const std::string& policy_name, |
- bool policy_value) OVERRIDE; |
- virtual void InstallStringListPolicy( |
- const std::string& policy_name, |
- const base::ListValue* policy_value) OVERRIDE; |
- virtual void InstallDictionaryPolicy( |
- const std::string& policy_name, |
- const base::DictionaryValue* policy_value) OVERRIDE; |
- virtual void Install3rdPartyPolicy( |
- const base::DictionaryValue* policies) OVERRIDE; |
- |
- // AppliedGPOListProvider: |
- virtual DWORD GetAppliedGPOList(DWORD flags, |
- LPCTSTR machine_name, |
- PSID sid_user, |
- GUID* extension_guid, |
- PGROUP_POLICY_OBJECT* gpo_list) OVERRIDE; |
- virtual BOOL FreeGPOList(PGROUP_POLICY_OBJECT gpo_list) OVERRIDE; |
- |
- // Creates a harness instance. |
- static PolicyProviderTestHarness* Create(); |
- |
- private: |
- // Helper to append a string16 to an uint8 buffer. |
- static void AppendChars(std::vector<uint8>* buffer, const string16& chars); |
- |
- // Appends a record with the given fields to the PReg file. |
- void AppendRecordToPRegFile(const string16& path, |
- const std::string& key, |
- DWORD type, |
- DWORD size, |
- uint8* data); |
- |
- // Appends the given DWORD |value| for |path| + |key| to the PReg file. |
- void AppendDWORDToPRegFile(const string16& path, |
- const std::string& key, |
- DWORD value); |
- |
- // Appends the given string |value| for |path| + |key| to the PReg file. |
- void AppendStringToPRegFile(const string16& path, |
- const std::string& key, |
- const std::string& value); |
- |
- // Appends the given policy |value| for |path| + |key| to the PReg file, |
- // converting and recursing as necessary. |
- void AppendPolicyToPRegFile(const string16& path, |
- const std::string& key, |
- const base::Value* value); |
- |
- base::ScopedTempDir temp_dir_; |
- base::FilePath preg_file_path_; |
- GROUP_POLICY_OBJECT gpo_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PRegTestHarness); |
-}; |
- |
-ScopedGroupPolicyRegistrySandbox::ScopedGroupPolicyRegistrySandbox() { |
- // Generate a unique registry key for the override for each test. This |
- // makes sure that tests executing in parallel won't delete each other's |
- // key, at DeleteKeys(). |
- key_name_ = ASCIIToWide(base::StringPrintf( |
- "SOFTWARE\\chromium unittest %d", |
- base::Process::Current().pid())); |
- std::wstring hklm_key_name = key_name_ + L"\\HKLM"; |
- std::wstring hkcu_key_name = key_name_ + L"\\HKCU"; |
- |
- // Create the subkeys to hold the overridden HKLM and HKCU |
- // policy settings. |
- temp_hklm_hive_key_.Create(HKEY_CURRENT_USER, |
- hklm_key_name.c_str(), |
- KEY_ALL_ACCESS); |
- temp_hkcu_hive_key_.Create(HKEY_CURRENT_USER, |
- hkcu_key_name.c_str(), |
- KEY_ALL_ACCESS); |
- |
- ActivateOverrides(); |
-} |
- |
-ScopedGroupPolicyRegistrySandbox::~ScopedGroupPolicyRegistrySandbox() { |
- RemoveOverrides(); |
- DeleteKeys(); |
-} |
- |
-void ScopedGroupPolicyRegistrySandbox::ActivateOverrides() { |
- ASSERT_HRESULT_SUCCEEDED(RegOverridePredefKey(HKEY_LOCAL_MACHINE, |
- temp_hklm_hive_key_.Handle())); |
- ASSERT_HRESULT_SUCCEEDED(RegOverridePredefKey(HKEY_CURRENT_USER, |
- temp_hkcu_hive_key_.Handle())); |
-} |
- |
-void ScopedGroupPolicyRegistrySandbox::RemoveOverrides() { |
- ASSERT_HRESULT_SUCCEEDED(RegOverridePredefKey(HKEY_LOCAL_MACHINE, 0)); |
- ASSERT_HRESULT_SUCCEEDED(RegOverridePredefKey(HKEY_CURRENT_USER, 0)); |
-} |
- |
-void ScopedGroupPolicyRegistrySandbox::DeleteKeys() { |
- RegKey key(HKEY_CURRENT_USER, key_name_.c_str(), KEY_ALL_ACCESS); |
- ASSERT_TRUE(key.Valid()); |
- key.DeleteKey(L""); |
-} |
- |
-RegistryTestHarness::RegistryTestHarness(HKEY hive, PolicyScope scope) |
- : PolicyProviderTestHarness(POLICY_LEVEL_MANDATORY, scope), hive_(hive) {} |
- |
-RegistryTestHarness::~RegistryTestHarness() {} |
- |
-void RegistryTestHarness::SetUp() {} |
- |
-ConfigurationPolicyProvider* RegistryTestHarness::CreateProvider( |
- SchemaRegistry* registry, |
- scoped_refptr<base::SequencedTaskRunner> task_runner) { |
- scoped_ptr<AsyncPolicyLoader> loader( |
- new PolicyLoaderWin(task_runner, kTestPolicyKey, this)); |
- return new AsyncPolicyProvider(registry, loader.Pass()); |
-} |
- |
-void RegistryTestHarness::InstallEmptyPolicy() {} |
- |
-void RegistryTestHarness::InstallStringPolicy( |
- const std::string& policy_name, |
- const std::string& policy_value) { |
- RegKey key(hive_, kTestPolicyKey, KEY_ALL_ACCESS); |
- ASSERT_TRUE(key.Valid()); |
- ASSERT_HRESULT_SUCCEEDED(key.WriteValue(UTF8ToUTF16(policy_name).c_str(), |
- UTF8ToUTF16(policy_value).c_str())); |
-} |
- |
-void RegistryTestHarness::InstallIntegerPolicy( |
- const std::string& policy_name, |
- int policy_value) { |
- RegKey key(hive_, kTestPolicyKey, KEY_ALL_ACCESS); |
- ASSERT_TRUE(key.Valid()); |
- key.WriteValue(UTF8ToUTF16(policy_name).c_str(), |
- static_cast<DWORD>(policy_value)); |
-} |
- |
-void RegistryTestHarness::InstallBooleanPolicy( |
- const std::string& policy_name, |
- bool policy_value) { |
- RegKey key(hive_, kTestPolicyKey, KEY_ALL_ACCESS); |
- ASSERT_TRUE(key.Valid()); |
- key.WriteValue(UTF8ToUTF16(policy_name).c_str(), |
- static_cast<DWORD>(policy_value)); |
-} |
- |
-void RegistryTestHarness::InstallStringListPolicy( |
- const std::string& policy_name, |
- const base::ListValue* policy_value) { |
- RegKey key(hive_, |
- (string16(kTestPolicyKey) + ASCIIToUTF16("\\") + |
- UTF8ToUTF16(policy_name)).c_str(), |
- KEY_ALL_ACCESS); |
- ASSERT_TRUE(key.Valid()); |
- int index = 1; |
- for (base::ListValue::const_iterator element(policy_value->begin()); |
- element != policy_value->end(); |
- ++element) { |
- std::string element_value; |
- if (!(*element)->GetAsString(&element_value)) |
- continue; |
- std::string name(base::IntToString(index++)); |
- key.WriteValue(UTF8ToUTF16(name).c_str(), |
- UTF8ToUTF16(element_value).c_str()); |
- } |
-} |
- |
-void RegistryTestHarness::InstallDictionaryPolicy( |
- const std::string& policy_name, |
- const base::DictionaryValue* policy_value) { |
- std::string json; |
- base::JSONWriter::Write(policy_value, &json); |
- RegKey key(hive_, kTestPolicyKey, KEY_ALL_ACCESS); |
- ASSERT_TRUE(key.Valid()); |
- key.WriteValue(UTF8ToUTF16(policy_name).c_str(), |
- UTF8ToUTF16(json).c_str()); |
-} |
- |
-void RegistryTestHarness::Install3rdPartyPolicy( |
- const base::DictionaryValue* policies) { |
- // The first level entries are domains, and the second level entries map |
- // components to their policy. |
- const string16 kPathPrefix = string16(kTestPolicyKey) + kPathSep + |
- kThirdParty + kPathSep; |
- for (base::DictionaryValue::Iterator domain(*policies); |
- !domain.IsAtEnd(); domain.Advance()) { |
- const base::DictionaryValue* components = NULL; |
- if (!domain.value().GetAsDictionary(&components)) { |
- ADD_FAILURE(); |
- continue; |
- } |
- for (base::DictionaryValue::Iterator component(*components); |
- !component.IsAtEnd(); component.Advance()) { |
- const string16 path = kPathPrefix + |
- UTF8ToUTF16(domain.key()) + kPathSep + |
- UTF8ToUTF16(component.key()); |
- InstallValue(component.value(), hive_, path, kMandatory); |
- EXPECT_TRUE(InstallSchema(component.value(), hive_, path, kSchema)); |
- } |
- } |
-} |
- |
-DWORD RegistryTestHarness::GetAppliedGPOList(DWORD flags, |
- LPCTSTR machine_name, |
- PSID sid_user, |
- GUID* extension_guid, |
- PGROUP_POLICY_OBJECT* gpo_list) { |
- *gpo_list = NULL; |
- return ERROR_ACCESS_DENIED; |
-} |
- |
-BOOL RegistryTestHarness::FreeGPOList(PGROUP_POLICY_OBJECT gpo_list) { |
- return TRUE; |
-} |
- |
-// static |
-PolicyProviderTestHarness* RegistryTestHarness::CreateHKCU() { |
- return new RegistryTestHarness(HKEY_CURRENT_USER, POLICY_SCOPE_USER); |
-} |
- |
-// static |
-PolicyProviderTestHarness* RegistryTestHarness::CreateHKLM() { |
- return new RegistryTestHarness(HKEY_LOCAL_MACHINE, POLICY_SCOPE_MACHINE); |
-} |
- |
-PRegTestHarness::PRegTestHarness() |
- : PolicyProviderTestHarness(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE) {} |
- |
-PRegTestHarness::~PRegTestHarness() {} |
- |
-void PRegTestHarness::SetUp() { |
- ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
- preg_file_path_ = temp_dir_.path().Append(PolicyLoaderWin::kPRegFileName); |
- ASSERT_TRUE(file_util::WriteFile(preg_file_path_, |
- preg_parser::kPRegFileHeader, |
- arraysize(preg_parser::kPRegFileHeader))); |
- |
- memset(&gpo_, 0, sizeof(GROUP_POLICY_OBJECT)); |
- gpo_.lpFileSysPath = const_cast<wchar_t*>(temp_dir_.path().value().c_str()); |
-} |
- |
-ConfigurationPolicyProvider* PRegTestHarness::CreateProvider( |
- SchemaRegistry* registry, |
- scoped_refptr<base::SequencedTaskRunner> task_runner) { |
- scoped_ptr<AsyncPolicyLoader> loader( |
- new PolicyLoaderWin(task_runner, kTestPolicyKey, this)); |
- return new AsyncPolicyProvider(registry, loader.Pass()); |
-} |
- |
-void PRegTestHarness::InstallEmptyPolicy() {} |
- |
-void PRegTestHarness::InstallStringPolicy(const std::string& policy_name, |
- const std::string& policy_value) { |
- AppendStringToPRegFile(kTestPolicyKey, policy_name, policy_value); |
-} |
- |
-void PRegTestHarness::InstallIntegerPolicy(const std::string& policy_name, |
- int policy_value) { |
- AppendDWORDToPRegFile(kTestPolicyKey, policy_name, policy_value); |
-} |
- |
-void PRegTestHarness::InstallBooleanPolicy(const std::string& policy_name, |
- bool policy_value) { |
- AppendDWORDToPRegFile(kTestPolicyKey, policy_name, policy_value); |
-} |
- |
-void PRegTestHarness::InstallStringListPolicy( |
- const std::string& policy_name, |
- const base::ListValue* policy_value) { |
- AppendPolicyToPRegFile(kTestPolicyKey, policy_name, policy_value); |
-} |
- |
-void PRegTestHarness::InstallDictionaryPolicy( |
- const std::string& policy_name, |
- const base::DictionaryValue* policy_value) { |
- std::string json; |
- base::JSONWriter::Write(policy_value, &json); |
- AppendStringToPRegFile(kTestPolicyKey, policy_name, json); |
-} |
- |
-void PRegTestHarness::Install3rdPartyPolicy( |
- const base::DictionaryValue* policies) { |
- // The first level entries are domains, and the second level entries map |
- // components to their policy. |
- const string16 kPathPrefix = string16(kTestPolicyKey) + kPathSep + |
- kThirdParty + kPathSep; |
- for (base::DictionaryValue::Iterator domain(*policies); |
- !domain.IsAtEnd(); domain.Advance()) { |
- const base::DictionaryValue* components = NULL; |
- if (!domain.value().GetAsDictionary(&components)) { |
- ADD_FAILURE(); |
- continue; |
- } |
- const string16 domain_path = kPathPrefix + UTF8ToUTF16(domain.key()); |
- for (base::DictionaryValue::Iterator component(*components); |
- !component.IsAtEnd(); component.Advance()) { |
- const string16 component_path = |
- domain_path + kPathSep + UTF8ToUTF16(component.key()); |
- AppendPolicyToPRegFile(component_path, UTF16ToUTF8(kMandatory), |
- &component.value()); |
- |
- scoped_ptr<base::DictionaryValue> schema_dict( |
- BuildSchema(component.value())); |
- std::string schema_json; |
- base::JSONWriter::Write(schema_dict.get(), &schema_json); |
- if (!schema_json.empty()) { |
- AppendStringToPRegFile(component_path, UTF16ToUTF8(kSchema), |
- schema_json); |
- } |
- } |
- } |
-} |
- |
-DWORD PRegTestHarness::GetAppliedGPOList(DWORD flags, |
- LPCTSTR machine_name, |
- PSID sid_user, |
- GUID* extension_guid, |
- PGROUP_POLICY_OBJECT* gpo_list) { |
- *gpo_list = flags & GPO_LIST_FLAG_MACHINE ? &gpo_ : NULL; |
- return ERROR_SUCCESS; |
-} |
- |
-BOOL PRegTestHarness::FreeGPOList(PGROUP_POLICY_OBJECT gpo_list) { |
- return TRUE; |
-} |
- |
-// static |
-PolicyProviderTestHarness* PRegTestHarness::Create() { |
- return new PRegTestHarness(); |
-} |
- |
-// static |
-void PRegTestHarness::AppendChars(std::vector<uint8>* buffer, |
- const string16& chars) { |
- for (string16::const_iterator c(chars.begin()); c != chars.end(); ++c) { |
- buffer->push_back(*c & 0xff); |
- buffer->push_back((*c >> 8) & 0xff); |
- } |
-} |
- |
-void PRegTestHarness::AppendRecordToPRegFile(const string16& path, |
- const std::string& key, |
- DWORD type, |
- DWORD size, |
- uint8* data) { |
- std::vector<uint8> buffer; |
- AppendChars(&buffer, L"["); |
- AppendChars(&buffer, path); |
- AppendChars(&buffer, string16(L"\0;", 2)); |
- AppendChars(&buffer, UTF8ToUTF16(key)); |
- AppendChars(&buffer, string16(L"\0;", 2)); |
- type = base::ByteSwapToLE32(type); |
- uint8* type_data = reinterpret_cast<uint8*>(&type); |
- buffer.insert(buffer.end(), type_data, type_data + sizeof(DWORD)); |
- AppendChars(&buffer, L";"); |
- size = base::ByteSwapToLE32(size); |
- uint8* size_data = reinterpret_cast<uint8*>(&size); |
- buffer.insert(buffer.end(), size_data, size_data + sizeof(DWORD)); |
- AppendChars(&buffer, L";"); |
- buffer.insert(buffer.end(), data, data + size); |
- AppendChars(&buffer, L"]"); |
- |
- ASSERT_EQ(buffer.size(), |
- file_util::AppendToFile( |
- preg_file_path_, |
- reinterpret_cast<const char*>(vector_as_array(&buffer)), |
- buffer.size())); |
-} |
- |
-void PRegTestHarness::AppendDWORDToPRegFile(const string16& path, |
- const std::string& key, |
- DWORD value) { |
- value = base::ByteSwapToLE32(value); |
- AppendRecordToPRegFile(path, key, REG_DWORD, sizeof(DWORD), |
- reinterpret_cast<uint8*>(&value)); |
-} |
- |
-void PRegTestHarness::AppendStringToPRegFile(const string16& path, |
- const std::string& key, |
- const std::string& value) { |
- string16 string16_value(UTF8ToUTF16(value)); |
- std::vector<char16> data; |
- std::transform(string16_value.begin(), string16_value.end(), |
- std::back_inserter(data), std::ptr_fun(base::ByteSwapToLE16)); |
- data.push_back(base::ByteSwapToLE16(L'\0')); |
- |
- AppendRecordToPRegFile(path, key, REG_SZ, data.size() * sizeof(char16), |
- reinterpret_cast<uint8*>(vector_as_array(&data))); |
-} |
- |
-void PRegTestHarness::AppendPolicyToPRegFile(const string16& path, |
- const std::string& key, |
- const base::Value* value) { |
- switch (value->GetType()) { |
- case base::Value::TYPE_BOOLEAN: { |
- bool boolean_value = false; |
- ASSERT_TRUE(value->GetAsBoolean(&boolean_value)); |
- AppendDWORDToPRegFile(path, key, boolean_value); |
- break; |
- } |
- case base::Value::TYPE_INTEGER: { |
- int int_value = 0; |
- ASSERT_TRUE(value->GetAsInteger(&int_value)); |
- AppendDWORDToPRegFile(path, key, int_value); |
- break; |
- } |
- case base::Value::TYPE_DOUBLE: { |
- double double_value = 0; |
- ASSERT_TRUE(value->GetAsDouble(&double_value)); |
- AppendStringToPRegFile(path, key, base::DoubleToString(double_value)); |
- break; |
- } |
- case base::Value::TYPE_STRING: { |
- std::string string_value; |
- ASSERT_TRUE(value->GetAsString(&string_value)); |
- AppendStringToPRegFile(path, key, string_value); |
- break; |
- } |
- case base::Value::TYPE_DICTIONARY: { |
- string16 subpath = path + kPathSep + UTF8ToUTF16(key); |
- const base::DictionaryValue* dict = NULL; |
- ASSERT_TRUE(value->GetAsDictionary(&dict)); |
- for (base::DictionaryValue::Iterator entry(*dict); !entry.IsAtEnd(); |
- entry.Advance()) { |
- AppendPolicyToPRegFile(subpath, entry.key(), &entry.value()); |
- } |
- break; |
- } |
- case base::Value::TYPE_LIST: { |
- string16 subpath = path + kPathSep + UTF8ToUTF16(key); |
- const base::ListValue* list = NULL; |
- ASSERT_TRUE(value->GetAsList(&list)); |
- for (size_t i = 0; i < list->GetSize(); ++i) { |
- const base::Value* entry = NULL; |
- ASSERT_TRUE(list->Get(i, &entry)); |
- AppendPolicyToPRegFile(subpath, base::IntToString(i + 1), entry); |
- } |
- break; |
- } |
- case base::Value::TYPE_BINARY: |
- case base::Value::TYPE_NULL: { |
- ADD_FAILURE(); |
- break; |
- } |
- } |
-} |
- |
-} // namespace |
- |
-// Instantiate abstract test case for basic policy reading tests. |
-INSTANTIATE_TEST_CASE_P( |
- PolicyProviderWinTest, |
- ConfigurationPolicyProviderTest, |
- testing::Values(RegistryTestHarness::CreateHKCU, |
- RegistryTestHarness::CreateHKLM, |
- PRegTestHarness::Create)); |
- |
-// Instantiate abstract test case for 3rd party policy reading tests. |
-INSTANTIATE_TEST_CASE_P( |
- ThirdPartyPolicyProviderWinTest, |
- Configuration3rdPartyPolicyProviderTest, |
- testing::Values(RegistryTestHarness::CreateHKCU, |
- RegistryTestHarness::CreateHKLM, |
- PRegTestHarness::Create)); |
- |
-// Test cases for windows policy provider specific functionality. |
-class PolicyLoaderWinTest : public PolicyTestBase, |
- public AppliedGPOListProvider { |
- protected: |
- // The policy key this tests places data under. This must match the data |
- // files in chrome/test/data/policy/gpo. |
- static const char16 kTestPolicyKey[]; |
- |
- PolicyLoaderWinTest() |
- : gpo_list_(NULL), |
- gpo_list_status_(ERROR_ACCESS_DENIED) {} |
- virtual ~PolicyLoaderWinTest() {} |
- |
- virtual void SetUp() OVERRIDE { |
- PolicyTestBase::SetUp(); |
- |
- ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir_)); |
- test_data_dir_ = test_data_dir_.AppendASCII("chrome") |
- .AppendASCII("test") |
- .AppendASCII("data") |
- .AppendASCII("policy") |
- .AppendASCII("gpo"); |
- |
- // Unknown components will be filtered out. Register their names with an |
- // invalid schema to avoid that. |
- ComponentMap components; |
- components["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] = Schema(); |
- components["bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"] = Schema(); |
- components["int"] = Schema(); |
- components["merge"] = Schema(); |
- components["string"] = Schema(); |
- components["test"] = Schema(); |
- schema_registry_.RegisterComponents(POLICY_DOMAIN_EXTENSIONS, components); |
- } |
- |
- // AppliedGPOListProvider: |
- virtual DWORD GetAppliedGPOList(DWORD flags, |
- LPCTSTR machine_name, |
- PSID sid_user, |
- GUID* extension_guid, |
- PGROUP_POLICY_OBJECT* gpo_list) OVERRIDE { |
- *gpo_list = gpo_list_; |
- return gpo_list_status_; |
- } |
- virtual BOOL FreeGPOList(PGROUP_POLICY_OBJECT gpo_list) OVERRIDE { |
- return TRUE; |
- } |
- |
- void InitGPO(GROUP_POLICY_OBJECT* gpo, |
- DWORD options, |
- const base::FilePath& path, |
- GROUP_POLICY_OBJECT* next, |
- GROUP_POLICY_OBJECT* prev) { |
- memset(gpo, 0, sizeof(GROUP_POLICY_OBJECT)); |
- gpo->dwOptions = options; |
- gpo->lpFileSysPath = const_cast<wchar_t*>(path.value().c_str()); |
- gpo->pNext = next; |
- gpo->pPrev = prev; |
- } |
- |
- bool Matches(const PolicyBundle& expected) { |
- PolicyLoaderWin loader(loop_.message_loop_proxy(), kTestPolicyKey, this); |
- scoped_ptr<PolicyBundle> loaded( |
- loader.InitialLoad(schema_registry_.schema_map())); |
- return loaded->Equals(expected); |
- } |
- |
- void InstallRegistrySentinel() { |
- RegKey hklm_key(HKEY_CURRENT_USER, kTestPolicyKey, KEY_ALL_ACCESS); |
- ASSERT_TRUE(hklm_key.Valid()); |
- hklm_key.WriteValue( |
- UTF8ToUTF16(test_keys::kKeyString).c_str(), |
- UTF8ToUTF16("registry").c_str()); |
- } |
- |
- bool MatchesRegistrySentinel() { |
- base::DictionaryValue expected_policy; |
- expected_policy.SetString(test_keys::kKeyString, "registry"); |
- PolicyBundle expected; |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) |
- .LoadFrom(&expected_policy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER); |
- return Matches(expected); |
- } |
- |
- bool MatchesTestBundle() { |
- base::DictionaryValue expected_policy; |
- expected_policy.SetBoolean(test_keys::kKeyBoolean, true); |
- expected_policy.SetString(test_keys::kKeyString, "GPO"); |
- expected_policy.SetInteger(test_keys::kKeyInteger, 42); |
- scoped_ptr<base::ListValue> list(new base::ListValue()); |
- list->AppendString("GPO 1"); |
- list->AppendString("GPO 2"); |
- expected_policy.Set(test_keys::kKeyStringList, list.release()); |
- PolicyBundle expected; |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) |
- .LoadFrom(&expected_policy, POLICY_LEVEL_MANDATORY, |
- POLICY_SCOPE_MACHINE); |
- return Matches(expected); |
- } |
- |
- ScopedGroupPolicyRegistrySandbox registry_sandbox_; |
- PGROUP_POLICY_OBJECT gpo_list_; |
- DWORD gpo_list_status_; |
- base::FilePath test_data_dir_; |
-}; |
- |
-const char16 PolicyLoaderWinTest::kTestPolicyKey[] = |
- L"SOFTWARE\\Policies\\Chromium"; |
- |
-TEST_F(PolicyLoaderWinTest, HKLMOverHKCU) { |
- RegKey hklm_key(HKEY_LOCAL_MACHINE, kTestPolicyKey, KEY_ALL_ACCESS); |
- ASSERT_TRUE(hklm_key.Valid()); |
- hklm_key.WriteValue(UTF8ToUTF16(test_keys::kKeyString).c_str(), |
- UTF8ToUTF16("hklm").c_str()); |
- RegKey hkcu_key(HKEY_CURRENT_USER, kTestPolicyKey, KEY_ALL_ACCESS); |
- ASSERT_TRUE(hkcu_key.Valid()); |
- hkcu_key.WriteValue(UTF8ToUTF16(test_keys::kKeyString).c_str(), |
- UTF8ToUTF16("hkcu").c_str()); |
- |
- PolicyBundle expected; |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) |
- .Set(test_keys::kKeyString, |
- POLICY_LEVEL_MANDATORY, |
- POLICY_SCOPE_MACHINE, |
- base::Value::CreateStringValue("hklm"), NULL); |
- EXPECT_TRUE(Matches(expected)); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, Load3rdPartyWithoutSchema) { |
- base::DictionaryValue dict; |
- dict.SetString("str", "string value"); |
- dict.SetInteger("int", 123); |
- dict.Set("subdict", dict.DeepCopy()); |
- dict.Set("subsubdict", dict.DeepCopy()); |
- dict.Set("subsubsubdict", dict.DeepCopy()); |
- |
- base::DictionaryValue policy_dict; |
- policy_dict.Set("extensions.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.policy", |
- dict.DeepCopy()); |
- policy_dict.Set("extensions.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.policy", |
- dict.DeepCopy()); |
- EXPECT_TRUE(InstallValue(policy_dict, HKEY_LOCAL_MACHINE, |
- kTestPolicyKey, kThirdParty)); |
- |
- PolicyBundle expected; |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, |
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")) |
- .LoadFrom(&dict, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE); |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, |
- "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")) |
- .LoadFrom(&dict, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE); |
- EXPECT_TRUE(Matches(expected)); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, Merge3rdPartyPolicies) { |
- // Policy for the same extension will be provided at the 4 level/scope |
- // combinations, to verify that they overlap as expected. |
- |
- const string16 kPathSuffix = |
- kTestPolicyKey + ASCIIToUTF16("\\3rdparty\\extensions\\merge"); |
- |
- const char kUserMandatory[] = "user-mandatory"; |
- const char kUserRecommended[] = "user-recommended"; |
- const char kMachineMandatory[] = "machine-mandatory"; |
- const char kMachineRecommended[] = "machine-recommended"; |
- |
- base::DictionaryValue policy; |
- policy.SetString("a", kMachineMandatory); |
- EXPECT_TRUE(InstallValue(policy, HKEY_LOCAL_MACHINE, |
- kPathSuffix, kMandatory)); |
- policy.SetString("a", kUserMandatory); |
- policy.SetString("b", kUserMandatory); |
- EXPECT_TRUE(InstallValue(policy, HKEY_CURRENT_USER, |
- kPathSuffix, kMandatory)); |
- policy.SetString("a", kMachineRecommended); |
- policy.SetString("b", kMachineRecommended); |
- policy.SetString("c", kMachineRecommended); |
- EXPECT_TRUE(InstallValue(policy, HKEY_LOCAL_MACHINE, |
- kPathSuffix, kRecommended)); |
- policy.SetString("a", kUserRecommended); |
- policy.SetString("b", kUserRecommended); |
- policy.SetString("c", kUserRecommended); |
- policy.SetString("d", kUserRecommended); |
- EXPECT_TRUE(InstallValue(policy, HKEY_CURRENT_USER, |
- kPathSuffix, kRecommended)); |
- |
- PolicyBundle expected; |
- PolicyMap& expected_policy = |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "merge")); |
- expected_policy.Set("a", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, |
- base::Value::CreateStringValue(kMachineMandatory), NULL); |
- expected_policy.Set("b", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
- base::Value::CreateStringValue(kUserMandatory), NULL); |
- expected_policy.Set("c", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, |
- base::Value::CreateStringValue(kMachineRecommended), |
- NULL); |
- expected_policy.Set("d", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, |
- base::Value::CreateStringValue(kUserRecommended), NULL); |
- EXPECT_TRUE(Matches(expected)); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, LoadStringEncodedValues) { |
- // Create a dictionary with all the types that can be stored encoded in a |
- // string, to pass to InstallSchema(). Also build an equivalent dictionary |
- // with the encoded values, to pass to InstallValue(). |
- base::DictionaryValue policy; |
- policy.Set("null", base::Value::CreateNullValue()); |
- policy.SetBoolean("bool", true); |
- policy.SetInteger("int", -123); |
- policy.SetDouble("double", 456.78e9); |
- base::ListValue list; |
- list.Append(policy.DeepCopy()); |
- list.Append(policy.DeepCopy()); |
- policy.Set("list", list.DeepCopy()); |
- // Encode |policy| before adding the "dict" entry. |
- std::string encoded_dict; |
- base::JSONWriter::Write(&policy, &encoded_dict); |
- ASSERT_FALSE(encoded_dict.empty()); |
- policy.Set("dict", policy.DeepCopy()); |
- |
- std::string encoded_list; |
- base::JSONWriter::Write(&list, &encoded_list); |
- ASSERT_FALSE(encoded_list.empty()); |
- base::DictionaryValue encoded_policy; |
- encoded_policy.SetString("null", ""); |
- encoded_policy.SetString("bool", "1"); |
- encoded_policy.SetString("int", "-123"); |
- encoded_policy.SetString("double", "456.78e9"); |
- encoded_policy.SetString("list", encoded_list); |
- encoded_policy.SetString("dict", encoded_dict); |
- |
- const string16 kPathSuffix = |
- kTestPolicyKey + ASCIIToUTF16("\\3rdparty\\extensions\\string"); |
- EXPECT_TRUE(InstallSchema(policy, HKEY_CURRENT_USER, kPathSuffix, kSchema)); |
- EXPECT_TRUE( |
- InstallValue(encoded_policy, HKEY_CURRENT_USER, kPathSuffix, kMandatory)); |
- |
- PolicyBundle expected; |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "string")) |
- .LoadFrom(&policy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER); |
- EXPECT_TRUE(Matches(expected)); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, LoadIntegerEncodedValues) { |
- base::DictionaryValue policy; |
- policy.SetBoolean("bool", true); |
- policy.SetInteger("int", 123); |
- policy.SetDouble("double", 456.0); |
- |
- base::DictionaryValue encoded_policy; |
- encoded_policy.SetInteger("bool", 1); |
- encoded_policy.SetInteger("int", 123); |
- encoded_policy.SetInteger("double", 456); |
- |
- const string16 kPathSuffix = |
- kTestPolicyKey + ASCIIToUTF16("\\3rdparty\\extensions\\int"); |
- EXPECT_TRUE(InstallSchema(policy, HKEY_CURRENT_USER, kPathSuffix, kSchema)); |
- EXPECT_TRUE( |
- InstallValue(encoded_policy, HKEY_CURRENT_USER, kPathSuffix, kMandatory)); |
- |
- PolicyBundle expected; |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "int")) |
- .LoadFrom(&policy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER); |
- EXPECT_TRUE(Matches(expected)); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, DefaultPropertySchemaType) { |
- // Build a schema for an "object" with a default schema for its properties. |
- base::DictionaryValue default_schema; |
- default_schema.SetString(schema::kType, "number"); |
- base::DictionaryValue integer_schema; |
- integer_schema.SetString(schema::kType, "integer"); |
- base::DictionaryValue properties; |
- properties.Set("special-int1", integer_schema.DeepCopy()); |
- properties.Set("special-int2", integer_schema.DeepCopy()); |
- base::DictionaryValue schema; |
- schema.SetString(schema::kType, "object"); |
- schema.Set(schema::kProperties, properties.DeepCopy()); |
- schema.Set(schema::kAdditionalProperties, default_schema.DeepCopy()); |
- |
- const string16 kPathSuffix = |
- kTestPolicyKey + ASCIIToUTF16("\\3rdparty\\extensions\\test"); |
- EXPECT_TRUE(WriteSchema(schema, HKEY_CURRENT_USER, kPathSuffix, kSchema)); |
- |
- // Write some test values. |
- base::DictionaryValue policy; |
- // These special values have a specific schema for them. |
- policy.SetInteger("special-int1", 123); |
- policy.SetString("special-int2", "-456"); |
- // Other values default to be loaded as doubles. |
- policy.SetInteger("double1", 789.0); |
- policy.SetString("double2", "123.456e7"); |
- policy.SetString("invalid", "omg"); |
- EXPECT_TRUE(InstallValue(policy, HKEY_CURRENT_USER, kPathSuffix, kMandatory)); |
- |
- base::DictionaryValue expected_policy; |
- expected_policy.SetInteger("special-int1", 123); |
- expected_policy.SetInteger("special-int2", -456); |
- expected_policy.SetDouble("double1", 789.0); |
- expected_policy.SetDouble("double2", 123.456e7); |
- expected_policy.Set("invalid", base::Value::CreateNullValue()); |
- PolicyBundle expected; |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "test")) |
- .LoadFrom(&expected_policy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER); |
- EXPECT_TRUE(Matches(expected)); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyNotPresent) { |
- InstallRegistrySentinel(); |
- gpo_list_ = NULL; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- PolicyBundle empty; |
- EXPECT_TRUE(Matches(empty)); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyEmpty) { |
- InstallRegistrySentinel(); |
- base::FilePath gpo_dir(test_data_dir_.AppendASCII("empty")); |
- GROUP_POLICY_OBJECT gpo; |
- InitGPO(&gpo, 0, gpo_dir, NULL, NULL); |
- gpo_list_ = &gpo; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- PolicyBundle empty; |
- EXPECT_TRUE(Matches(empty)); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyNonExistingFile) { |
- InstallRegistrySentinel(); |
- GROUP_POLICY_OBJECT gpo; |
- InitGPO(&gpo, 0, test_data_dir_, NULL, NULL); |
- gpo_list_ = &gpo; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- EXPECT_TRUE(MatchesRegistrySentinel()); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyBadPath) { |
- InstallRegistrySentinel(); |
- base::FilePath gpo_dir(test_data_dir_.AppendASCII("bad")); |
- GROUP_POLICY_OBJECT gpo; |
- InitGPO(&gpo, 0, gpo_dir, NULL, NULL); |
- gpo_list_ = &gpo; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- EXPECT_TRUE(MatchesRegistrySentinel()); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyPresent) { |
- InstallRegistrySentinel(); |
- base::FilePath gpo_dir(test_data_dir_.AppendASCII("test1")); |
- GROUP_POLICY_OBJECT gpo; |
- InitGPO(&gpo, 0, gpo_dir, NULL, NULL); |
- gpo_list_ = &gpo; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- EXPECT_TRUE(MatchesTestBundle()); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyMerged) { |
- InstallRegistrySentinel(); |
- base::FilePath gpo1_dir(test_data_dir_.AppendASCII("test2")); |
- base::FilePath gpo2_dir(test_data_dir_.AppendASCII("test1")); |
- GROUP_POLICY_OBJECT gpo1; |
- GROUP_POLICY_OBJECT gpo2; |
- InitGPO(&gpo1, 0, gpo1_dir, &gpo2, NULL); |
- InitGPO(&gpo2, 0, gpo2_dir, NULL, &gpo1); |
- gpo_list_ = &gpo1; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- EXPECT_TRUE(MatchesTestBundle()); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyDisabled) { |
- InstallRegistrySentinel(); |
- base::FilePath gpo1_dir(test_data_dir_.AppendASCII("test1")); |
- base::FilePath gpo2_dir(test_data_dir_.AppendASCII("test2")); |
- GROUP_POLICY_OBJECT gpo1; |
- GROUP_POLICY_OBJECT gpo2; |
- InitGPO(&gpo1, 0, gpo1_dir, &gpo2, NULL); |
- InitGPO(&gpo2, GPO_FLAG_DISABLE, gpo2_dir, NULL, &gpo1); |
- gpo_list_ = &gpo1; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- EXPECT_TRUE(MatchesTestBundle()); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyForcedPolicy) { |
- InstallRegistrySentinel(); |
- base::FilePath gpo1_dir(test_data_dir_.AppendASCII("test1")); |
- base::FilePath gpo2_dir(test_data_dir_.AppendASCII("test2")); |
- GROUP_POLICY_OBJECT gpo1; |
- GROUP_POLICY_OBJECT gpo2; |
- InitGPO(&gpo1, GPO_FLAG_FORCE, gpo1_dir, &gpo2, NULL); |
- InitGPO(&gpo2, 0, gpo2_dir, NULL, &gpo1); |
- gpo_list_ = &gpo1; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- EXPECT_TRUE(MatchesTestBundle()); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, AppliedPolicyUNCPath) { |
- InstallRegistrySentinel(); |
- base::FilePath gpo_dir(test_data_dir_.AppendASCII("test1")); |
- base::FilePath unc_path(L"\\\\some_share\\GPO"); |
- GROUP_POLICY_OBJECT gpo1; |
- GROUP_POLICY_OBJECT gpo2; |
- InitGPO(&gpo1, 0, gpo_dir, &gpo2, NULL); |
- InitGPO(&gpo2, 0, unc_path, NULL, &gpo1); |
- gpo_list_ = &gpo1; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- EXPECT_TRUE(MatchesRegistrySentinel()); |
-} |
- |
-TEST_F(PolicyLoaderWinTest, LoadExtensionPolicyAlternativeSpelling) { |
- base::FilePath gpo_dir( |
- test_data_dir_.AppendASCII("extension_alternative_spelling")); |
- GROUP_POLICY_OBJECT gpo; |
- InitGPO(&gpo, 0, gpo_dir, NULL, NULL); |
- gpo_list_ = &gpo; |
- gpo_list_status_ = ERROR_SUCCESS; |
- |
- PolicyBundle expected; |
- base::DictionaryValue expected_a; |
- expected_a.SetInteger("policy 1", 3); |
- expected_a.SetInteger("policy 2", 3); |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, |
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")) |
- .LoadFrom(&expected_a, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE); |
- base::DictionaryValue expected_b; |
- expected_b.SetInteger("policy 1", 2); |
- expected.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, |
- "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")) |
- .LoadFrom(&expected_b, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE); |
- EXPECT_TRUE(Matches(expected)); |
-} |
- |
-} // namespace policy |