1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/policy/policy_bundle.h"
7 #include "base/callback.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/values.h"
10 #include "chrome/browser/policy/external_data_fetcher.h"
11 #include "chrome/browser/policy/policy_map.h"
12 #include "policy/policy_constants.h"
13 #include "testing/gtest/include/gtest/gtest.h"
19 const char kPolicyClashing0[] = "policy-clashing-0";
20 const char kPolicyClashing1[] = "policy-clashing-1";
21 const char kPolicy0[] = "policy-0";
22 const char kPolicy1[] = "policy-1";
23 const char kPolicy2[] = "policy-2";
24 const char kExtension0[] = "extension-0";
25 const char kExtension1[] = "extension-1";
26 const char kExtension2[] = "extension-2";
27 const char kExtension3[] = "extension-3";
29 // Adds test policies to |policy|.
30 void AddTestPolicies(PolicyMap* policy) {
31 policy->Set("mandatory-user", POLICY_LEVEL_MANDATORY,
32 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(123), NULL);
33 policy->Set("mandatory-machine", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
34 base::Value::CreateStringValue("omg"), NULL);
35 policy->Set("recommended-user", POLICY_LEVEL_RECOMMENDED,
36 POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
37 base::DictionaryValue* dict = new base::DictionaryValue();
38 dict->SetBoolean("false", false);
39 dict->SetInteger("int", 456);
40 dict->SetString("str", "bbq");
41 policy->Set("recommended-machine", POLICY_LEVEL_RECOMMENDED,
42 POLICY_SCOPE_MACHINE, dict, NULL);
45 // Adds test policies to |policy| based on the parameters:
46 // - kPolicyClashing0 mapped to |value|, user mandatory
47 // - kPolicyClashing1 mapped to |value|, with |level| and |scope|
48 // - |name| mapped to |value|, user mandatory
49 void AddTestPoliciesWithParams(PolicyMap *policy,
54 policy->Set(kPolicyClashing0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
55 base::Value::CreateIntegerValue(value), NULL);
56 policy->Set(kPolicyClashing1, level, scope,
57 base::Value::CreateIntegerValue(value), NULL);
58 policy->Set(name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
59 base::Value::CreateIntegerValue(value), NULL);
62 // Returns true if |bundle| is empty.
63 bool IsEmpty(const PolicyBundle& bundle) {
64 return bundle.begin() == bundle.end();
69 TEST(PolicyBundleTest, Get) {
71 EXPECT_TRUE(IsEmpty(bundle));
73 AddTestPolicies(&bundle.Get(
74 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())));
75 EXPECT_FALSE(IsEmpty(bundle));
78 AddTestPolicies(&policy);
79 EXPECT_TRUE(bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME,
80 std::string())).Equals(policy));
82 PolicyBundle::const_iterator it = bundle.begin();
83 ASSERT_TRUE(it != bundle.end());
84 EXPECT_EQ(POLICY_DOMAIN_CHROME, it->first.domain);
85 EXPECT_EQ("", it->first.component_id);
86 ASSERT_TRUE(it->second);
87 EXPECT_TRUE(it->second->Equals(policy));
89 EXPECT_TRUE(it == bundle.end());
90 EXPECT_TRUE(bundle.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS,
91 kExtension0)).empty());
93 EXPECT_FALSE(IsEmpty(bundle));
95 EXPECT_TRUE(IsEmpty(bundle));
98 TEST(PolicyBundleTest, SwapAndCopy) {
100 PolicyBundle bundle1;
102 AddTestPolicies(&bundle0.Get(
103 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())));
104 AddTestPolicies(&bundle0.Get(
105 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension0)));
106 EXPECT_FALSE(IsEmpty(bundle0));
107 EXPECT_TRUE(IsEmpty(bundle1));
110 AddTestPolicies(&policy);
111 EXPECT_TRUE(bundle0.Get(PolicyNamespace(POLICY_DOMAIN_CHROME,
112 std::string())).Equals(policy));
113 EXPECT_TRUE(bundle0.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS,
114 kExtension0)).Equals(policy));
116 bundle0.Swap(&bundle1);
117 EXPECT_TRUE(IsEmpty(bundle0));
118 EXPECT_FALSE(IsEmpty(bundle1));
120 EXPECT_TRUE(bundle1.Get(PolicyNamespace(POLICY_DOMAIN_CHROME,
121 std::string())).Equals(policy));
122 EXPECT_TRUE(bundle1.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS,
123 kExtension0)).Equals(policy));
125 bundle0.CopyFrom(bundle1);
126 EXPECT_FALSE(IsEmpty(bundle0));
127 EXPECT_FALSE(IsEmpty(bundle1));
128 EXPECT_TRUE(bundle0.Get(PolicyNamespace(POLICY_DOMAIN_CHROME,
129 std::string())).Equals(policy));
130 EXPECT_TRUE(bundle0.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS,
131 kExtension0)).Equals(policy));
134 TEST(PolicyBundleTest, MergeFrom) {
135 // Each bundleN has kExtensionN. Each bundle also has policy for
136 // chrome and kExtension3.
137 // |bundle0| has the highest priority, |bundle2| the lowest.
138 PolicyBundle bundle0;
139 PolicyBundle bundle1;
140 PolicyBundle bundle2;
143 AddTestPoliciesWithParams(
144 &policy0, kPolicy0, 0u, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER);
145 bundle0.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
147 bundle0.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension0))
149 bundle0.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension3))
153 AddTestPoliciesWithParams(
154 &policy1, kPolicy1, 1u, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE);
155 bundle1.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
157 bundle1.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension1))
159 bundle1.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension3))
163 AddTestPoliciesWithParams(
164 &policy2, kPolicy2, 2u, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER);
165 bundle2.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
167 bundle2.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension2))
169 bundle2.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension3))
172 // Merge in order of decreasing priority.
174 merged.MergeFrom(bundle0);
175 merged.MergeFrom(bundle1);
176 merged.MergeFrom(bundle2);
177 PolicyBundle empty_bundle;
178 merged.MergeFrom(empty_bundle);
180 // chrome and kExtension3 policies are merged:
181 // - kPolicyClashing0 comes from bundle0, which has the highest priority;
182 // - kPolicyClashing1 comes from bundle1, which has the highest level/scope
184 // - kPolicyN are merged from each bundle.
186 expected.Set(kPolicyClashing0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
187 base::Value::CreateIntegerValue(0), NULL);
188 expected.Set(kPolicyClashing1, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
189 base::Value::CreateIntegerValue(1), NULL);
190 expected.Set(kPolicy0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
191 base::Value::CreateIntegerValue(0), NULL);
192 expected.Set(kPolicy1, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
193 base::Value::CreateIntegerValue(1), NULL);
194 expected.Set(kPolicy2, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
195 base::Value::CreateIntegerValue(2), NULL);
196 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_CHROME,
197 std::string())).Equals(expected));
198 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS,
199 kExtension3)).Equals(expected));
200 // extension0 comes only from bundle0.
201 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS,
202 kExtension0)).Equals(policy0));
203 // extension1 comes only from bundle1.
204 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS,
205 kExtension1)).Equals(policy1));
206 // extension2 comes only from bundle2.
207 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS,
208 kExtension2)).Equals(policy2));
211 TEST(PolicyBundleTest, Equals) {
213 AddTestPolicies(&bundle.Get(
214 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())));
215 AddTestPolicies(&bundle.Get(
216 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension0)));
219 EXPECT_FALSE(bundle.Equals(other));
220 other.CopyFrom(bundle);
221 EXPECT_TRUE(bundle.Equals(other));
223 AddTestPolicies(&bundle.Get(
224 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension1)));
225 EXPECT_FALSE(bundle.Equals(other));
226 other.CopyFrom(bundle);
227 EXPECT_TRUE(bundle.Equals(other));
228 AddTestPolicies(&other.Get(
229 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension2)));
230 EXPECT_FALSE(bundle.Equals(other));
232 other.CopyFrom(bundle);
233 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
235 POLICY_LEVEL_MANDATORY,
237 base::Value::CreateIntegerValue(123),
239 EXPECT_FALSE(bundle.Equals(other));
240 other.CopyFrom(bundle);
241 EXPECT_TRUE(bundle.Equals(other));
242 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
244 POLICY_LEVEL_MANDATORY,
245 POLICY_SCOPE_MACHINE,
246 base::Value::CreateIntegerValue(123),
248 EXPECT_FALSE(bundle.Equals(other));
250 // Test non-const Get().
253 PolicyMap& policy_map =
254 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()));
255 EXPECT_TRUE(bundle.Equals(other));
256 policy_map.Set(kPolicy0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
257 base::Value::CreateIntegerValue(123), NULL);
258 EXPECT_FALSE(bundle.Equals(other));
261 } // namespace policy