Index: chrome/browser/policy/cloud_policy_provider_unittest.cc |
diff --git a/chrome/browser/policy/cloud_policy_provider_unittest.cc b/chrome/browser/policy/cloud_policy_provider_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..63ee1700af2b32a5bbaf0e9ddf4e4ec9c0b5964c |
--- /dev/null |
+++ b/chrome/browser/policy/cloud_policy_provider_unittest.cc |
@@ -0,0 +1,240 @@ |
+// Copyright (c) 2011 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/cloud_policy_provider.h" |
+ |
+#include "base/basictypes.h" |
+#include "base/values.h" |
+#include "chrome/browser/policy/cloud_policy_cache_base.h" |
+#include "chrome/browser/policy/cloud_policy_provider_impl.h" |
+#include "chrome/browser/policy/configuration_policy_pref_store.h" |
+#include "chrome/browser/policy/mock_configuration_policy_store.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+ |
+using testing::AnyNumber; |
+using testing::_; |
+ |
+namespace policy { |
+ |
+class MockCloudPolicyCache : public CloudPolicyCacheBase { |
+ public: |
+ MockCloudPolicyCache() {} |
+ virtual ~MockCloudPolicyCache() {} |
+ |
+ // CloudPolicyCacheBase implementation. |
+ void Load() {} |
+ void SetPolicy(const em::PolicyFetchResponse& policy) {} |
+ bool DecodePolicyData(const em::PolicyData& policy_data, |
+ PolicyMap* mandatory, |
+ PolicyMap* recommended) { |
+ return true; |
+ } |
+ bool IsReady() { |
+ return true; |
+ } |
+ |
+ // Non-const accessors for underlying PolicyMaps. |
+ PolicyMap* raw_mandatory_policy() { |
+ return &mandatory_policy_; |
+ } |
+ |
+ PolicyMap* raw_recommended_policy() { |
+ return &recommended_policy_; |
+ } |
+ |
+ void SetUnmanaged() { |
+ is_unmanaged_ = true; |
+ } |
+ |
+ void set_initialized(bool initialized) { |
+ initialization_complete_ = initialized; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MockCloudPolicyCache); |
+}; |
+ |
+class CloudPolicyProviderTest : public testing::Test { |
+ protected: |
+ void CreateCloudPolicyProvider(CloudPolicyCacheBase::PolicyLevel level) { |
+ cloud_policy_provider_.reset(new CloudPolicyProviderImpl( |
+ ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), level)); |
+ } |
+ |
+ // Appends the caches to a provider and then provides the policies to |
+ // |store_|. |
+ void RunCachesThroughProvider(MockCloudPolicyCache caches[], int n, |
+ CloudPolicyCacheBase::PolicyLevel level) { |
+ store_.reset(new MockConfigurationPolicyStore); |
+ CloudPolicyProviderImpl provider( |
+ policy::ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), |
+ level); |
+ for (int i = 0; i < n; i++) { |
+ provider.AppendCache(&caches[i]); |
+ } |
+ EXPECT_CALL(*store_.get(), Apply(_, _)).Times(AnyNumber()); |
+ provider.Provide(store_.get()); |
+ } |
+ |
+ // Checks a string policy in |store_|. |
+ void ExpectStringPolicy(const std::string& expected, |
+ ConfigurationPolicyType type) { |
+ const Value* value = store_->Get(type); |
+ std::string string_value; |
+ ASSERT_TRUE(value != NULL); |
+ EXPECT_TRUE(value->GetAsString(&string_value)); |
+ EXPECT_EQ(expected, string_value); |
+ } |
+ |
+ // Checks a boolean policy in |store_|. |
+ void ExpectBoolPolicy(bool expected, ConfigurationPolicyType type) { |
+ const Value* value = store_->Get(type); |
+ bool bool_value; |
+ ASSERT_TRUE(value != NULL); |
+ EXPECT_TRUE(value->GetAsBoolean(&bool_value)); |
+ EXPECT_EQ(expected, bool_value); |
+ } |
+ |
+ void ExpectNoPolicy(ConfigurationPolicyType type) { |
+ EXPECT_TRUE(NULL == store_->Get(type)); |
+ } |
+ |
+ void CombineTwoPolicyMaps(const PolicyMap& base, |
+ const PolicyMap& overlay, |
+ PolicyMap* out_map) { |
+ DCHECK(cloud_policy_provider_.get()); |
+ cloud_policy_provider_->CombineTwoPolicyMaps(base, overlay, out_map); |
+ } |
+ |
+ private: |
+ // Some tests need a list of policies that doesn't contain any proxy |
+ // policies. Note: these policies will be handled as if they had the |
+ // type of Value::TYPE_INTEGER. |
+ static const ConfigurationPolicyType simple_policies[]; |
+ |
+ scoped_ptr<CloudPolicyProviderImpl> cloud_policy_provider_; |
+ scoped_ptr<MockConfigurationPolicyStore> store_; |
+}; |
+ |
+// Proxy setting distributed over multiple caches. |
+TEST_F(CloudPolicyProviderTest, |
+ ProxySettingDistributedOverMultipleCaches) { |
+ // There are proxy_policy_count()+1 = 6 caches and they are mixed together by |
+ // one instance of CloudPolicyProvider. The first cache has some policies but |
+ // no proxy-related ones. The following caches have each one proxy-policy set. |
+ const int n = 6; |
+ MockCloudPolicyCache caches[n]; |
+ |
+ // Prepare |cache[0]| to serve some non-proxy policies. |
+ caches[0].raw_mandatory_policy()->Set(kPolicyShowHomeButton, |
+ Value::CreateBooleanValue(true)); |
+ caches[0].raw_mandatory_policy()->Set(kPolicyIncognitoEnabled, |
+ Value::CreateBooleanValue(true)); |
+ caches[0].raw_mandatory_policy()->Set(kPolicyTranslateEnabled, |
+ Value::CreateBooleanValue(true)); |
+ caches[0].set_initialized(true); |
+ |
+ // Prepare the other caches to serve one proxy-policy each. |
+ caches[1].raw_mandatory_policy()->Set(kPolicyProxyMode, |
+ Value::CreateStringValue("cache 1")); |
+ caches[1].set_initialized(true); |
+ caches[2].raw_mandatory_policy()->Set(kPolicyProxyServerMode, |
+ Value::CreateIntegerValue(2)); |
+ caches[2].set_initialized(true); |
+ caches[3].raw_mandatory_policy()->Set(kPolicyProxyServer, |
+ Value::CreateStringValue("cache 3")); |
+ caches[3].set_initialized(true); |
+ caches[4].raw_mandatory_policy()->Set(kPolicyProxyPacUrl, |
+ Value::CreateStringValue("cache 4")); |
+ caches[4].set_initialized(true); |
+ caches[5].raw_mandatory_policy()->Set(kPolicyProxyMode, |
+ Value::CreateStringValue("cache 5")); |
+ caches[5].set_initialized(true); |
+ |
+ RunCachesThroughProvider( |
+ caches, n, CloudPolicyCacheBase::POLICY_LEVEL_MANDATORY); |
+ |
+ // Verify expectations. |
+ ExpectStringPolicy("cache 1", kPolicyProxyMode); |
+ ExpectNoPolicy(kPolicyProxyServerMode); |
+ ExpectNoPolicy(kPolicyProxyServer); |
+ ExpectNoPolicy(kPolicyProxyPacUrl); |
+ ExpectBoolPolicy(true, kPolicyShowHomeButton); |
+ ExpectBoolPolicy(true, kPolicyIncognitoEnabled); |
+ ExpectBoolPolicy(true, kPolicyTranslateEnabled); |
+} |
+ |
+// Combining two PolicyMaps. |
+TEST_F(CloudPolicyProviderTest, CombineTwoPolicyMapsSame) { |
+ PolicyMap A, B, C; |
+ CreateCloudPolicyProvider(CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED); |
+ A.Set(kPolicyHomepageLocation, |
+ Value::CreateStringValue("http://www.chromium.org")); |
+ B.Set(kPolicyHomepageLocation, |
+ Value::CreateStringValue("http://www.google.com")); |
+ A.Set(kPolicyApplicationLocaleValue, Value::CreateStringValue("hu")); |
+ B.Set(kPolicyApplicationLocaleValue, Value::CreateStringValue("us")); |
+ A.Set(kPolicyDevicePolicyRefreshRate, new FundamentalValue(100)); |
+ B.Set(kPolicyDevicePolicyRefreshRate, new FundamentalValue(200)); |
+ CombineTwoPolicyMaps(A, B, &C); |
+ EXPECT_TRUE(A.Equals(C)); |
+} |
+ |
+TEST_F(CloudPolicyProviderTest, CombineTwoPolicyMapsEmpty) { |
+ PolicyMap A, B, C; |
+ CreateCloudPolicyProvider(CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED); |
+ CombineTwoPolicyMaps(A, B, &C); |
+ EXPECT_TRUE(C.empty()); |
+} |
+ |
+TEST_F(CloudPolicyProviderTest, CombineTwoPolicyMapsPartial) { |
+ PolicyMap A, B, C; |
+ CreateCloudPolicyProvider(CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED); |
+ |
+ A.Set(kPolicyHomepageLocation, |
+ Value::CreateStringValue("http://www.chromium.org")); |
+ B.Set(kPolicyHomepageLocation, |
+ Value::CreateStringValue("http://www.google.com")); |
+ B.Set(kPolicyApplicationLocaleValue, Value::CreateStringValue("us")); |
+ A.Set(kPolicyDevicePolicyRefreshRate, new FundamentalValue(100)); |
+ B.Set(kPolicyDevicePolicyRefreshRate, new FundamentalValue(200)); |
+ CombineTwoPolicyMaps(A, B, &C); |
+ |
+ const Value* value; |
+ std::string string_value; |
+ int int_value; |
+ value = C.Get(kPolicyHomepageLocation); |
+ ASSERT_TRUE(NULL != value); |
+ EXPECT_TRUE(value->GetAsString(&string_value)); |
+ EXPECT_EQ("http://www.chromium.org", string_value); |
+ value = C.Get(kPolicyApplicationLocaleValue); |
+ ASSERT_TRUE(NULL != value); |
+ EXPECT_TRUE(value->GetAsString(&string_value)); |
+ EXPECT_EQ("us", string_value); |
+ value = C.Get(kPolicyDevicePolicyRefreshRate); |
+ ASSERT_TRUE(NULL != value); |
+ EXPECT_TRUE(value->GetAsInteger(&int_value)); |
+ EXPECT_EQ(100, int_value); |
+} |
+ |
+TEST_F(CloudPolicyProviderTest, CombineTwoPolicyMapsProxies) { |
+ const int a_value = 1; |
+ const int b_value = -1; |
+ PolicyMap A, B, C; |
+ CreateCloudPolicyProvider(CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED); |
+ |
+ A.Set(policy::kPolicyProxyMode, Value::CreateIntegerValue(a_value)); |
+ |
+ B.Set(policy::kPolicyProxyServerMode, Value::CreateIntegerValue(b_value)); |
+ B.Set(policy::kPolicyProxyServer, Value::CreateIntegerValue(b_value)); |
+ B.Set(policy::kPolicyProxyPacUrl, Value::CreateIntegerValue(b_value)); |
+ B.Set(policy::kPolicyProxyBypassList, Value::CreateIntegerValue(b_value)); |
+ |
+ CombineTwoPolicyMaps(A, B, &C); |
+ |
+ EXPECT_TRUE(A.Equals(C)); |
+ EXPECT_FALSE(B.Equals(C)); |
+} |
+ |
+} // namespace policy |