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 "base/callback.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "base/prefs/pref_value_map.h"
8 #include "chrome/browser/policy/configuration_policy_handler.h"
9 #include "chrome/browser/policy/external_data_fetcher.h"
10 #include "chrome/browser/policy/policy_error_map.h"
11 #include "chrome/browser/policy/policy_map.h"
12 #include "policy/policy_constants.h"
13 #include "testing/gtest/include/gtest/gtest.h"
19 StringToIntEnumListPolicyHandler::MappingEntry kTestTypeMap[] = {
24 const char kTestPref[] = "unit_test.test_pref";
28 TEST(StringToIntEnumListPolicyHandlerTest, CheckPolicySettings) {
31 PolicyErrorMap errors;
32 StringToIntEnumListPolicyHandler handler(
33 key::kExtensionAllowedTypes,
36 kTestTypeMap + arraysize(kTestTypeMap));
38 policy_map.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY,
39 POLICY_SCOPE_USER, list.DeepCopy(), NULL);
41 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
42 EXPECT_TRUE(errors.empty());
44 list.AppendString("one");
45 policy_map.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY,
46 POLICY_SCOPE_USER, list.DeepCopy(), NULL);
48 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
49 EXPECT_TRUE(errors.empty());
51 list.AppendString("invalid");
52 policy_map.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY,
53 POLICY_SCOPE_USER, list.DeepCopy(), NULL);
55 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
56 EXPECT_FALSE(errors.empty());
57 EXPECT_FALSE(errors.GetErrors(key::kExtensionAllowedTypes).empty());
59 policy_map.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY,
61 base::Value::CreateStringValue("no list"), NULL);
63 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
64 EXPECT_FALSE(errors.empty());
65 EXPECT_FALSE(errors.GetErrors(key::kExtensionAllowedTypes).empty());
68 TEST(StringToIntEnumListPolicyHandlerTest, ApplyPolicySettings) {
70 base::ListValue expected;
74 StringToIntEnumListPolicyHandler handler(
75 key::kExtensionAllowedTypes,
78 kTestTypeMap + arraysize(kTestTypeMap));
80 policy_map.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY,
81 POLICY_SCOPE_USER, list.DeepCopy(), NULL);
82 handler.ApplyPolicySettings(policy_map, &prefs);
83 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
84 EXPECT_TRUE(base::Value::Equals(&expected, value));
86 list.AppendString("two");
87 expected.AppendInteger(2);
88 policy_map.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY,
89 POLICY_SCOPE_USER, list.DeepCopy(), NULL);
90 handler.ApplyPolicySettings(policy_map, &prefs);
91 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
92 EXPECT_TRUE(base::Value::Equals(&expected, value));
94 list.AppendString("invalid");
95 policy_map.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY,
96 POLICY_SCOPE_USER, list.DeepCopy(), NULL);
97 handler.ApplyPolicySettings(policy_map, &prefs);
98 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
99 EXPECT_TRUE(base::Value::Equals(&expected, value));
102 TEST(IntRangePolicyHandler, CheckPolicySettingsClamp) {
103 PolicyMap policy_map;
104 PolicyErrorMap errors;
106 // This tests needs to modify an int policy. The exact policy used and its
107 // semantics outside the test are irrelevant.
108 IntRangePolicyHandler handler(key::kDiskCacheSize, kTestPref, 0, 10, true);
110 // Check that values lying in the accepted range are not rejected.
111 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
112 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(0), NULL);
114 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
115 EXPECT_TRUE(errors.empty());
117 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
118 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(5), NULL);
120 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
121 EXPECT_TRUE(errors.empty());
123 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
124 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(10), NULL);
126 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
127 EXPECT_TRUE(errors.empty());
129 // Check that values lying outside the accepted range are not rejected
130 // (because clamping is enabled) but do yield a warning message.
131 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
132 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(-5), NULL);
134 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
135 EXPECT_FALSE(errors.empty());
137 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
138 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(15), NULL);
140 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
141 EXPECT_FALSE(errors.empty());
143 // Check that an entirely invalid value is rejected and yields an error
145 policy_map.Set(key::kDiskCacheSize,
146 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
147 base::Value::CreateStringValue("invalid"), NULL);
149 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
150 EXPECT_FALSE(errors.empty());
153 TEST(IntRangePolicyHandler, CheckPolicySettingsDontClamp) {
154 PolicyMap policy_map;
155 PolicyErrorMap errors;
157 // This tests needs to modify an int policy. The exact policy used and its
158 // semantics outside the test are irrelevant.
159 IntRangePolicyHandler handler(key::kDiskCacheSize, kTestPref, 0, 10, false);
161 // Check that values lying in the accepted range are not rejected.
162 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
163 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(0), NULL);
165 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
166 EXPECT_TRUE(errors.empty());
168 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
169 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(5), NULL);
171 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
172 EXPECT_TRUE(errors.empty());
174 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
175 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(10), NULL);
177 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
178 EXPECT_TRUE(errors.empty());
180 // Check that values lying outside the accepted range are rejected and yield
182 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
183 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(-5), NULL);
185 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
186 EXPECT_FALSE(errors.empty());
188 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
189 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(15), NULL);
191 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
192 EXPECT_FALSE(errors.empty());
194 // Check that an entirely invalid value is rejected and yields an error
196 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
197 base::Value::CreateStringValue("invalid"), NULL);
199 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
200 EXPECT_FALSE(errors.empty());
203 TEST(IntRangePolicyHandler, ApplyPolicySettingsClamp) {
204 PolicyMap policy_map;
206 scoped_ptr<base::Value> expected;
207 const base::Value* value;
209 // This tests needs to modify an int policy. The exact policy used and its
210 // semantics outside the test are irrelevant.
211 IntRangePolicyHandler handler(key::kDiskCacheSize, kTestPref, 0, 10, true);
213 // Check that values lying in the accepted range are written to the pref.
214 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
215 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(0), NULL);
217 handler.ApplyPolicySettings(policy_map, &prefs);
218 expected.reset(base::Value::CreateIntegerValue(0));
219 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
220 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
222 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
223 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(5), NULL);
225 handler.ApplyPolicySettings(policy_map, &prefs);
226 expected.reset(base::Value::CreateIntegerValue(5));
227 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
228 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
230 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
231 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(10), NULL);
233 handler.ApplyPolicySettings(policy_map, &prefs);
234 expected.reset(base::Value::CreateIntegerValue(10));
235 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
236 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
238 // Check that values lying outside the accepted range are clamped and written
240 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
241 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(-5), NULL);
243 handler.ApplyPolicySettings(policy_map, &prefs);
244 expected.reset(base::Value::CreateIntegerValue(0));
245 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
246 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
248 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
249 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(15), NULL);
251 handler.ApplyPolicySettings(policy_map, &prefs);
252 expected.reset(base::Value::CreateIntegerValue(10));
253 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
254 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
257 TEST(IntRangePolicyHandler, ApplyPolicySettingsDontClamp) {
258 PolicyMap policy_map;
260 scoped_ptr<base::Value> expected;
261 const base::Value* value;
263 // This tests needs to modify an int policy. The exact policy used and its
264 // semantics outside the test are irrelevant.
265 IntRangePolicyHandler handler(key::kDiskCacheSize, kTestPref, 0, 10, true);
267 // Check that values lying in the accepted range are written to the pref.
268 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
269 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(0), NULL);
271 handler.ApplyPolicySettings(policy_map, &prefs);
272 expected.reset(base::Value::CreateIntegerValue(0));
273 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
274 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
276 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
277 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(5), NULL);
279 handler.ApplyPolicySettings(policy_map, &prefs);
280 expected.reset(base::Value::CreateIntegerValue(5));
281 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
282 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
284 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
285 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(10), NULL);
287 handler.ApplyPolicySettings(policy_map, &prefs);
288 expected.reset(base::Value::CreateIntegerValue(10));
289 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
290 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
293 TEST(IntPercentageToDoublePolicyHandler, CheckPolicySettingsClamp) {
294 PolicyMap policy_map;
295 PolicyErrorMap errors;
297 // This tests needs to modify an int policy. The exact policy used and its
298 // semantics outside the test are irrelevant.
299 IntPercentageToDoublePolicyHandler handler(
300 key::kDiskCacheSize, kTestPref, 0, 10, true);
302 // Check that values lying in the accepted range are not rejected.
303 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
304 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(0), NULL);
306 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
307 EXPECT_TRUE(errors.empty());
309 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
310 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(5), NULL);
312 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
313 EXPECT_TRUE(errors.empty());
315 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
316 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(10), NULL);
318 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
319 EXPECT_TRUE(errors.empty());
321 // Check that values lying outside the accepted range are not rejected
322 // (because clamping is enabled) but do yield a warning message.
323 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
324 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(-5), NULL);
326 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
327 EXPECT_FALSE(errors.empty());
329 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
330 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(15), NULL);
332 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
333 EXPECT_FALSE(errors.empty());
335 // Check that an entirely invalid value is rejected and yields an error
337 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
338 base::Value::CreateStringValue("invalid"), NULL);
340 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
341 EXPECT_FALSE(errors.empty());
344 TEST(IntPercentageToDoublePolicyHandler, CheckPolicySettingsDontClamp) {
345 PolicyMap policy_map;
346 PolicyErrorMap errors;
348 // This tests needs to modify an int policy. The exact policy used and its
349 // semantics outside the test are irrelevant.
350 IntPercentageToDoublePolicyHandler handler(
351 key::kDiskCacheSize, kTestPref, 0, 10, false);
353 // Check that values lying in the accepted range are not rejected.
354 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
355 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(0), NULL);
357 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
358 EXPECT_TRUE(errors.empty());
360 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
361 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(5), NULL);
363 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
364 EXPECT_TRUE(errors.empty());
366 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
367 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(10), NULL);
369 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
370 EXPECT_TRUE(errors.empty());
372 // Check that values lying outside the accepted range are rejected and yield
374 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
375 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(-5), NULL);
377 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
378 EXPECT_FALSE(errors.empty());
380 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
381 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(15), NULL);
383 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
384 EXPECT_FALSE(errors.empty());
386 // Check that an entirely invalid value is rejected and yields an error
388 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
389 base::Value::CreateStringValue("invalid"), NULL);
391 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
392 EXPECT_FALSE(errors.empty());
395 TEST(IntPercentageToDoublePolicyHandler, ApplyPolicySettingsClamp) {
396 PolicyMap policy_map;
398 scoped_ptr<base::Value> expected;
399 const base::Value* value;
401 // This tests needs to modify an int policy. The exact policy used and its
402 // semantics outside the test are irrelevant.
403 IntPercentageToDoublePolicyHandler handler(
404 key::kDiskCacheSize, kTestPref, 0, 10, true);
406 // Check that values lying in the accepted range are written to the pref.
407 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
408 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(0), NULL);
410 handler.ApplyPolicySettings(policy_map, &prefs);
411 expected.reset(base::Value::CreateDoubleValue(0.0));
412 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
413 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
415 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
416 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(5), NULL);
418 handler.ApplyPolicySettings(policy_map, &prefs);
419 expected.reset(base::Value::CreateDoubleValue(0.05));
420 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
421 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
423 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
424 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(10), NULL);
426 handler.ApplyPolicySettings(policy_map, &prefs);
427 expected.reset(base::Value::CreateDoubleValue(0.1));
428 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
429 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
431 // Check that values lying outside the accepted range are clamped and written
433 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
434 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(-5), NULL);
436 handler.ApplyPolicySettings(policy_map, &prefs);
437 expected.reset(base::Value::CreateDoubleValue(0.0));
438 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
439 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
441 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
442 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(15), NULL);
444 handler.ApplyPolicySettings(policy_map, &prefs);
445 expected.reset(base::Value::CreateDoubleValue(0.1));
446 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
447 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
450 TEST(IntPercentageToDoublePolicyHandler, ApplyPolicySettingsDontClamp) {
451 PolicyMap policy_map;
453 scoped_ptr<base::Value> expected;
454 const base::Value* value;
456 // This tests needs to modify an int policy. The exact policy used and its
457 // semantics outside the test are irrelevant.
458 IntPercentageToDoublePolicyHandler handler(
459 key::kDiskCacheSize, kTestPref, 0, 10, true);
461 // Check that values lying in the accepted range are written to the pref.
462 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
463 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(0), NULL);
465 handler.ApplyPolicySettings(policy_map, &prefs);
466 expected.reset(base::Value::CreateDoubleValue(0.0));
467 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
468 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
470 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
471 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(5), NULL);
473 handler.ApplyPolicySettings(policy_map, &prefs);
474 expected.reset(base::Value::CreateDoubleValue(0.05));
475 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
476 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
478 policy_map.Set(key::kDiskCacheSize, POLICY_LEVEL_MANDATORY,
479 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(10), NULL);
481 handler.ApplyPolicySettings(policy_map, &prefs);
482 expected.reset(base::Value::CreateDoubleValue(0.1));
483 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
484 EXPECT_TRUE(base::Value::Equals(expected.get(), value));
487 } // namespace policy