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_map.h"
7 #include "base/callback.h"
8 #include "base/memory/weak_ptr.h"
9 #include "chrome/browser/policy/external_data_manager.h"
10 #include "policy/policy_constants.h"
11 #include "testing/gtest/include/gtest/gtest.h"
17 // Utility functions for the tests.
18 void SetPolicy(PolicyMap* map, const char* name, Value* value) {
19 map->Set(name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, value, NULL);
22 void SetPolicy(PolicyMap* map,
24 ExternalDataFetcher* external_data_fetcher) {
25 map->Set(name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
26 NULL, external_data_fetcher);
31 class PolicyMapTest : public testing::Test {
33 scoped_ptr<ExternalDataFetcher> CreateExternalDataFetcher(
34 const std::string& policy) const;
37 scoped_ptr<ExternalDataFetcher> PolicyMapTest::CreateExternalDataFetcher(
38 const std::string& policy) const {
39 return make_scoped_ptr(
40 new ExternalDataFetcher(base::WeakPtr<ExternalDataManager>(), policy));
43 TEST_F(PolicyMapTest, SetAndGet) {
45 SetPolicy(&map, key::kHomepageLocation, Value::CreateStringValue("aaa"));
46 StringValue expected("aaa");
47 EXPECT_TRUE(expected.Equals(map.GetValue(key::kHomepageLocation)));
48 SetPolicy(&map, key::kHomepageLocation, Value::CreateStringValue("bbb"));
49 StringValue expected_b("bbb");
50 EXPECT_TRUE(expected_b.Equals(map.GetValue(key::kHomepageLocation)));
51 SetPolicy(&map, key::kHomepageLocation,
52 CreateExternalDataFetcher("dummy").release());
53 EXPECT_FALSE(map.GetValue(key::kHomepageLocation));
54 const PolicyMap::Entry* entry = map.Get(key::kHomepageLocation);
55 ASSERT_TRUE(entry != NULL);
56 EXPECT_EQ(POLICY_LEVEL_MANDATORY, entry->level);
57 EXPECT_EQ(POLICY_SCOPE_USER, entry->scope);
58 EXPECT_TRUE(ExternalDataFetcher::Equals(
59 entry->external_data_fetcher, CreateExternalDataFetcher("dummy").get()));
60 map.Set(key::kHomepageLocation, POLICY_LEVEL_RECOMMENDED,
61 POLICY_SCOPE_MACHINE, NULL, NULL);
62 EXPECT_FALSE(map.GetValue(key::kHomepageLocation));
63 entry = map.Get(key::kHomepageLocation);
64 ASSERT_TRUE(entry != NULL);
65 EXPECT_EQ(POLICY_LEVEL_RECOMMENDED, entry->level);
66 EXPECT_EQ(POLICY_SCOPE_MACHINE, entry->scope);
67 EXPECT_FALSE(entry->external_data_fetcher);
70 TEST_F(PolicyMapTest, Equals) {
72 SetPolicy(&a, key::kHomepageLocation, Value::CreateStringValue("aaa"));
74 SetPolicy(&a2, key::kHomepageLocation, Value::CreateStringValue("aaa"));
76 SetPolicy(&b, key::kHomepageLocation, Value::CreateStringValue("bbb"));
78 SetPolicy(&c, key::kHomepageLocation, Value::CreateStringValue("aaa"));
79 SetPolicy(&c, key::kHomepageIsNewTabPage, Value::CreateBooleanValue(true));
81 SetPolicy(&d, key::kHomepageLocation,
82 CreateExternalDataFetcher("ddd").release());
84 SetPolicy(&d2, key::kHomepageLocation,
85 CreateExternalDataFetcher("ddd").release());
87 SetPolicy(&e, key::kHomepageLocation,
88 CreateExternalDataFetcher("eee").release());
89 EXPECT_FALSE(a.Equals(b));
90 EXPECT_FALSE(a.Equals(c));
91 EXPECT_FALSE(a.Equals(d));
92 EXPECT_FALSE(a.Equals(e));
93 EXPECT_FALSE(b.Equals(a));
94 EXPECT_FALSE(b.Equals(c));
95 EXPECT_FALSE(b.Equals(d));
96 EXPECT_FALSE(b.Equals(e));
97 EXPECT_FALSE(c.Equals(a));
98 EXPECT_FALSE(c.Equals(b));
99 EXPECT_FALSE(c.Equals(d));
100 EXPECT_FALSE(c.Equals(e));
101 EXPECT_FALSE(d.Equals(a));
102 EXPECT_FALSE(d.Equals(b));
103 EXPECT_FALSE(d.Equals(c));
104 EXPECT_FALSE(d.Equals(e));
105 EXPECT_FALSE(e.Equals(a));
106 EXPECT_FALSE(e.Equals(b));
107 EXPECT_FALSE(e.Equals(c));
108 EXPECT_FALSE(e.Equals(d));
109 EXPECT_TRUE(a.Equals(a2));
110 EXPECT_TRUE(a2.Equals(a));
111 EXPECT_TRUE(d.Equals(d2));
112 EXPECT_TRUE(d2.Equals(d));
115 EXPECT_TRUE(empty1.Equals(empty2));
116 EXPECT_TRUE(empty2.Equals(empty1));
117 EXPECT_FALSE(empty1.Equals(a));
118 EXPECT_FALSE(a.Equals(empty1));
121 TEST_F(PolicyMapTest, Swap) {
123 SetPolicy(&a, key::kHomepageLocation, Value::CreateStringValue("aaa"));
124 SetPolicy(&a, key::kAlternateErrorPagesEnabled,
125 CreateExternalDataFetcher("dummy").release());
127 SetPolicy(&b, key::kHomepageLocation, Value::CreateStringValue("bbb"));
128 SetPolicy(&b, key::kHomepageIsNewTabPage, Value::CreateBooleanValue(true));
131 base::StringValue expected("bbb");
132 EXPECT_TRUE(expected.Equals(a.GetValue(key::kHomepageLocation)));
133 base::FundamentalValue expected_bool(true);
134 EXPECT_TRUE(expected_bool.Equals(a.GetValue(key::kHomepageIsNewTabPage)));
135 EXPECT_FALSE(a.GetValue(key::kAlternateErrorPagesEnabled));
136 EXPECT_FALSE(a.Get(key::kAlternateErrorPagesEnabled));
137 StringValue expected_a("aaa");
138 EXPECT_TRUE(expected_a.Equals(b.GetValue(key::kHomepageLocation)));
139 EXPECT_FALSE(b.GetValue(key::kHomepageIsNewTabPage));
140 EXPECT_FALSE(a.GetValue(key::kAlternateErrorPagesEnabled));
141 const PolicyMap::Entry* entry = b.Get(key::kAlternateErrorPagesEnabled);
143 EXPECT_TRUE(ExternalDataFetcher::Equals(
144 CreateExternalDataFetcher("dummy").get(), entry->external_data_fetcher));
149 EXPECT_TRUE(a.Equals(empty));
150 EXPECT_FALSE(b.Equals(empty));
153 TEST_F(PolicyMapTest, MergeFrom) {
155 a.Set(key::kHomepageLocation, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
156 Value::CreateStringValue("google.com"), NULL);
157 a.Set(key::kShowHomeButton, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
158 Value::CreateBooleanValue(true), NULL);
159 a.Set(key::kAlternateErrorPagesEnabled,
160 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
161 NULL, CreateExternalDataFetcher("a").release());
162 a.Set(key::kBookmarkBarEnabled, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
163 Value::CreateBooleanValue(false), NULL);
164 a.Set(key::kDefaultSearchProviderSearchURL,
165 POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE,
166 Value::CreateStringValue("google.com/q={x}"), NULL);
169 b.Set(key::kHomepageLocation, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
170 Value::CreateStringValue("chromium.org"), NULL);
171 b.Set(key::kShowHomeButton, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
172 Value::CreateBooleanValue(false), NULL);
173 b.Set(key::kAlternateErrorPagesEnabled,
174 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
175 NULL, CreateExternalDataFetcher("b").release());
176 b.Set(key::kBookmarkBarEnabled, POLICY_LEVEL_RECOMMENDED,
177 POLICY_SCOPE_MACHINE, Value::CreateBooleanValue(true), NULL);
178 b.Set(key::kDefaultSearchProviderSearchURL,
179 POLICY_LEVEL_MANDATORY,
180 POLICY_SCOPE_MACHINE,
181 Value::CreateStringValue(std::string()),
183 b.Set(key::kDisableSpdy,
184 POLICY_LEVEL_RECOMMENDED,
186 Value::CreateBooleanValue(true),
192 // POLICY_SCOPE_MACHINE over POLICY_SCOPE_USER.
193 c.Set(key::kHomepageLocation, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
194 Value::CreateStringValue("chromium.org"), NULL);
195 // |a| has precedence over |b|.
196 c.Set(key::kShowHomeButton, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
197 Value::CreateBooleanValue(true), NULL);
198 c.Set(key::kAlternateErrorPagesEnabled,
199 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
200 NULL, CreateExternalDataFetcher("a").release());
201 // POLICY_SCOPE_MACHINE over POLICY_SCOPE_USER for POLICY_LEVEL_RECOMMENDED.
202 c.Set(key::kBookmarkBarEnabled, POLICY_LEVEL_RECOMMENDED,
203 POLICY_SCOPE_MACHINE, Value::CreateBooleanValue(true), NULL);
204 // POLICY_LEVEL_MANDATORY over POLICY_LEVEL_RECOMMENDED.
205 c.Set(key::kDefaultSearchProviderSearchURL,
206 POLICY_LEVEL_MANDATORY,
207 POLICY_SCOPE_MACHINE,
208 Value::CreateStringValue(std::string()),
211 c.Set(key::kDisableSpdy, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
212 Value::CreateBooleanValue(true), NULL);
214 EXPECT_TRUE(a.Equals(c));
217 TEST_F(PolicyMapTest, GetDifferingKeys) {
219 a.Set(key::kHomepageLocation, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
220 Value::CreateStringValue("google.com"), NULL);
221 a.Set(key::kSearchSuggestEnabled,
222 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
223 NULL, CreateExternalDataFetcher("dummy").release());
224 a.Set(key::kShowHomeButton, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
225 Value::CreateBooleanValue(true), NULL);
226 a.Set(key::kAlternateErrorPagesEnabled,
227 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
228 NULL, CreateExternalDataFetcher("a").release());
229 a.Set(key::kBookmarkBarEnabled, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
230 Value::CreateBooleanValue(false), NULL);
231 a.Set(key::kDefaultSearchProviderSearchURL,
232 POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE,
233 Value::CreateStringValue("google.com/q={x}"), NULL);
234 a.Set(key::kDisable3DAPIs, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
235 Value::CreateBooleanValue(true), NULL);
238 b.Set(key::kHomepageLocation, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
239 Value::CreateStringValue("google.com"), NULL);
240 b.Set(key::kSearchSuggestEnabled,
241 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
242 NULL, CreateExternalDataFetcher("dummy").release());
243 b.Set(key::kShowHomeButton, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
244 Value::CreateBooleanValue(false), NULL);
245 b.Set(key::kAlternateErrorPagesEnabled,
246 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
247 NULL, CreateExternalDataFetcher("b").release());
248 b.Set(key::kBookmarkBarEnabled, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
249 Value::CreateBooleanValue(false), NULL);
250 b.Set(key::kDefaultSearchProviderSearchURL, POLICY_LEVEL_RECOMMENDED,
251 POLICY_SCOPE_USER, Value::CreateStringValue("google.com/q={x}"), NULL);
252 b.Set(key::kDisableSpdy, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
253 Value::CreateBooleanValue(true), NULL);
255 std::set<std::string> diff;
256 std::set<std::string> diff2;
257 a.GetDifferingKeys(b, &diff);
258 b.GetDifferingKeys(a, &diff2);
259 // Order shouldn't matter.
260 EXPECT_EQ(diff, diff2);
262 EXPECT_TRUE(diff.find(key::kHomepageLocation) == diff.end());
263 EXPECT_TRUE(diff.find(key::kSearchSuggestEnabled) == diff.end());
265 EXPECT_TRUE(diff.find(key::kShowHomeButton) != diff.end());
266 // Different external data references.
267 EXPECT_TRUE(diff.find(key::kAlternateErrorPagesEnabled) != diff.end());
269 EXPECT_TRUE(diff.find(key::kBookmarkBarEnabled) != diff.end());
271 EXPECT_TRUE(diff.find(key::kDefaultSearchProviderSearchURL) != diff.end());
273 EXPECT_TRUE(diff.find(key::kDisableSpdy) != diff.end());
275 EXPECT_TRUE(diff.find(key::kDisable3DAPIs) != diff.end());
277 EXPECT_EQ(6u, diff.size());
280 } // namespace policy