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