configuration_policy_pref_store_unittest.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2011 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.
4
5#include "base/file_path.h"
6#include "base/ref_counted.h"
7#include "chrome/browser/policy/configuration_policy_pref_store.h"
8#include "chrome/browser/policy/mock_configuration_policy_provider.h"
9#include "chrome/browser/prefs/proxy_config_dictionary.h"
10#include "chrome/common/notification_service.h"
11#include "chrome/common/pref_names.h"
12#include "chrome/common/pref_store_observer_mock.h"
13#include "testing/gmock/include/gmock/gmock.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16using testing::_;
17using testing::Mock;
18
19namespace policy {
20
21// Holds a set of test parameters, consisting of pref name and policy type.
22class TypeAndName {
23 public:
24  TypeAndName(ConfigurationPolicyType type, const char* pref_name)
25      : type_(type),
26        pref_name_(pref_name) {}
27
28  ConfigurationPolicyType type() const { return type_; }
29  const char* pref_name() const { return pref_name_; }
30
31 private:
32  ConfigurationPolicyType type_;
33  const char* pref_name_;
34};
35
36template<typename TESTBASE>
37class ConfigurationPolicyPrefStoreTestBase : public TESTBASE {
38 protected:
39  ConfigurationPolicyPrefStoreTestBase()
40      : provider_(),
41        store_(new ConfigurationPolicyPrefStore(&provider_)) {}
42
43  MockConfigurationPolicyProvider provider_;
44  scoped_refptr<ConfigurationPolicyPrefStore> store_;
45};
46
47// Test cases for list-valued policy settings.
48class ConfigurationPolicyPrefStoreListTest
49    : public ConfigurationPolicyPrefStoreTestBase<
50                 testing::TestWithParam<TypeAndName> > {
51};
52
53TEST_P(ConfigurationPolicyPrefStoreListTest, GetDefault) {
54  EXPECT_EQ(PrefStore::READ_NO_VALUE,
55            store_->GetValue(GetParam().pref_name(), NULL));
56}
57
58TEST_P(ConfigurationPolicyPrefStoreListTest, SetValue) {
59  ListValue* in_value = new ListValue();
60  in_value->Append(Value::CreateStringValue("test1"));
61  in_value->Append(Value::CreateStringValue("test2,"));
62  provider_.AddPolicy(GetParam().type(), in_value);
63  store_->OnUpdatePolicy();
64  Value* value;
65  EXPECT_EQ(PrefStore::READ_OK,
66            store_->GetValue(GetParam().pref_name(), &value));
67  EXPECT_TRUE(in_value->Equals(value));
68}
69
70INSTANTIATE_TEST_CASE_P(
71    ConfigurationPolicyPrefStoreListTestInstance,
72    ConfigurationPolicyPrefStoreListTest,
73    testing::Values(
74        TypeAndName(kPolicyRestoreOnStartupURLs,
75                    prefs::kURLsToRestoreOnStartup),
76        TypeAndName(kPolicyExtensionInstallWhitelist,
77                    prefs::kExtensionInstallAllowList),
78        TypeAndName(kPolicyExtensionInstallBlacklist,
79                    prefs::kExtensionInstallDenyList),
80        TypeAndName(kPolicyDisabledPlugins,
81                    prefs::kPluginsDisabledPlugins),
82        TypeAndName(kPolicyDisabledPluginsExceptions,
83                    prefs::kPluginsDisabledPluginsExceptions),
84        TypeAndName(kPolicyEnabledPlugins,
85                    prefs::kPluginsEnabledPlugins)));
86
87// Test cases for string-valued policy settings.
88class ConfigurationPolicyPrefStoreStringTest
89    : public ConfigurationPolicyPrefStoreTestBase<
90                 testing::TestWithParam<TypeAndName> > {
91};
92
93TEST_P(ConfigurationPolicyPrefStoreStringTest, GetDefault) {
94  EXPECT_EQ(PrefStore::READ_NO_VALUE,
95            store_->GetValue(GetParam().pref_name(), NULL));
96}
97
98TEST_P(ConfigurationPolicyPrefStoreStringTest, SetValue) {
99  provider_.AddPolicy(GetParam().type(),
100                      Value::CreateStringValue("http://chromium.org"));
101  store_->OnUpdatePolicy();
102  Value* value;
103  EXPECT_EQ(PrefStore::READ_OK,
104            store_->GetValue(GetParam().pref_name(), &value));
105  EXPECT_TRUE(StringValue("http://chromium.org").Equals(value));
106}
107
108INSTANTIATE_TEST_CASE_P(
109    ConfigurationPolicyPrefStoreStringTestInstance,
110    ConfigurationPolicyPrefStoreStringTest,
111    testing::Values(
112        TypeAndName(kPolicyHomepageLocation,
113                    prefs::kHomePage),
114        TypeAndName(kPolicyApplicationLocaleValue,
115                    prefs::kApplicationLocale),
116        TypeAndName(kPolicyApplicationLocaleValue,
117                    prefs::kApplicationLocale),
118        TypeAndName(kPolicyAuthSchemes,
119                    prefs::kAuthSchemes),
120        TypeAndName(kPolicyAuthServerWhitelist,
121                    prefs::kAuthServerWhitelist),
122        TypeAndName(kPolicyAuthNegotiateDelegateWhitelist,
123                    prefs::kAuthNegotiateDelegateWhitelist),
124        TypeAndName(kPolicyGSSAPILibraryName,
125                    prefs::kGSSAPILibraryName)));
126
127// Test cases for boolean-valued policy settings.
128class ConfigurationPolicyPrefStoreBooleanTest
129    : public ConfigurationPolicyPrefStoreTestBase<
130                 testing::TestWithParam<TypeAndName> > {
131};
132
133TEST_P(ConfigurationPolicyPrefStoreBooleanTest, GetDefault) {
134  EXPECT_EQ(PrefStore::READ_NO_VALUE,
135            store_->GetValue(GetParam().pref_name(), NULL));
136}
137
138TEST_P(ConfigurationPolicyPrefStoreBooleanTest, SetValue) {
139  provider_.AddPolicy(GetParam().type(), Value::CreateBooleanValue(false));
140  store_->OnUpdatePolicy();
141  Value* value;
142  bool result = true;
143  EXPECT_EQ(PrefStore::READ_OK,
144            store_->GetValue(GetParam().pref_name(), &value));
145  EXPECT_TRUE(FundamentalValue(false).Equals(value));
146
147  provider_.AddPolicy(GetParam().type(), Value::CreateBooleanValue(true));
148  store_->OnUpdatePolicy();
149  result = false;
150  EXPECT_EQ(PrefStore::READ_OK,
151            store_->GetValue(GetParam().pref_name(), &value));
152  EXPECT_TRUE(FundamentalValue(true).Equals(value));
153}
154
155INSTANTIATE_TEST_CASE_P(
156    ConfigurationPolicyPrefStoreBooleanTestInstance,
157    ConfigurationPolicyPrefStoreBooleanTest,
158    testing::Values(
159        TypeAndName(kPolicyHomepageIsNewTabPage,
160                    prefs::kHomePageIsNewTabPage),
161        TypeAndName(kPolicyAlternateErrorPagesEnabled,
162                    prefs::kAlternateErrorPagesEnabled),
163        TypeAndName(kPolicySearchSuggestEnabled,
164                    prefs::kSearchSuggestEnabled),
165        TypeAndName(kPolicyDnsPrefetchingEnabled,
166                    prefs::kDnsPrefetchingEnabled),
167        TypeAndName(kPolicyDisableSpdy,
168                    prefs::kDisableSpdy),
169        TypeAndName(kPolicySafeBrowsingEnabled,
170                    prefs::kSafeBrowsingEnabled),
171        TypeAndName(kPolicyMetricsReportingEnabled,
172                    prefs::kMetricsReportingEnabled),
173        TypeAndName(kPolicyPasswordManagerEnabled,
174                    prefs::kPasswordManagerEnabled),
175        TypeAndName(kPolicyPasswordManagerAllowShowPasswords,
176                    prefs::kPasswordManagerAllowShowPasswords),
177        TypeAndName(kPolicyShowHomeButton,
178                    prefs::kShowHomeButton),
179        TypeAndName(kPolicyPrintingEnabled,
180                    prefs::kPrintingEnabled),
181        TypeAndName(kPolicyJavascriptEnabled,
182                    prefs::kWebKitJavascriptEnabled),
183        TypeAndName(kPolicyIncognitoEnabled,
184                    prefs::kIncognitoEnabled),
185        TypeAndName(kPolicyCloudPrintProxyEnabled,
186                    prefs::kCloudPrintProxyEnabled),
187        TypeAndName(kPolicySavingBrowserHistoryDisabled,
188                    prefs::kSavingBrowserHistoryDisabled),
189        TypeAndName(kPolicySavingBrowserHistoryDisabled,
190                    prefs::kSavingBrowserHistoryDisabled),
191        TypeAndName(kPolicyDisableAuthNegotiateCnameLookup,
192                    prefs::kDisableAuthNegotiateCnameLookup),
193        TypeAndName(kPolicyEnableAuthNegotiatePort,
194                    prefs::kEnableAuthNegotiatePort),
195        TypeAndName(kPolicyInstantEnabled,
196                    prefs::kInstantEnabled),
197        TypeAndName(kPolicyDisable3DAPIs,
198                    prefs::kDisable3DAPIs)));
199
200#if defined(OS_CHROMEOS)
201INSTANTIATE_TEST_CASE_P(
202    CrosConfigurationPolicyPrefStoreBooleanTestInstance,
203    ConfigurationPolicyPrefStoreBooleanTest,
204    testing::Values(
205        TypeAndName(kPolicyChromeOsLockOnIdleSuspend,
206                    prefs::kEnableScreenLock)));
207#endif  // defined(OS_CHROMEOS)
208
209// Test cases for integer-valued policy settings.
210class ConfigurationPolicyPrefStoreIntegerTest
211    : public ConfigurationPolicyPrefStoreTestBase<
212                 testing::TestWithParam<TypeAndName> > {
213};
214
215TEST_P(ConfigurationPolicyPrefStoreIntegerTest, GetDefault) {
216  EXPECT_EQ(PrefStore::READ_NO_VALUE,
217            store_->GetValue(GetParam().pref_name(), NULL));
218}
219
220TEST_P(ConfigurationPolicyPrefStoreIntegerTest, SetValue) {
221  provider_.AddPolicy(GetParam().type(), Value::CreateIntegerValue(2));
222  store_->OnUpdatePolicy();
223  Value* value = NULL;
224  EXPECT_EQ(PrefStore::READ_OK,
225            store_->GetValue(GetParam().pref_name(), &value));
226  EXPECT_TRUE(FundamentalValue(2).Equals(value));
227}
228
229INSTANTIATE_TEST_CASE_P(
230    ConfigurationPolicyPrefStoreIntegerTestInstance,
231    ConfigurationPolicyPrefStoreIntegerTest,
232    testing::Values(
233        TypeAndName(kPolicyRestoreOnStartup,
234                    prefs::kRestoreOnStartup),
235        TypeAndName(kPolicyPolicyRefreshRate,
236                    prefs::kPolicyUserPolicyRefreshRate)));
237
238// Test cases for the proxy policy settings.
239class ConfigurationPolicyPrefStoreProxyTest : public testing::Test {
240 protected:
241  // Verify that all the proxy prefs are set to the specified expected values.
242  static void VerifyProxyPrefs(
243      const ConfigurationPolicyPrefStore& store,
244      const std::string& expected_proxy_server,
245      const std::string& expected_proxy_pac_url,
246      const std::string& expected_proxy_bypass_list,
247      const ProxyPrefs::ProxyMode& expected_proxy_mode) {
248    Value* value = NULL;
249    ASSERT_EQ(PrefStore::READ_OK,
250              store.GetValue(prefs::kProxy, &value));
251    ASSERT_EQ(Value::TYPE_DICTIONARY, value->GetType());
252    ProxyConfigDictionary dict(static_cast<DictionaryValue*>(value));
253    std::string s;
254    if (expected_proxy_server.empty()) {
255      EXPECT_FALSE(dict.GetProxyServer(&s));
256    } else {
257      ASSERT_TRUE(dict.GetProxyServer(&s));
258      EXPECT_EQ(expected_proxy_server, s);
259    }
260    if (expected_proxy_pac_url.empty()) {
261      EXPECT_FALSE(dict.GetPacUrl(&s));
262    } else {
263      ASSERT_TRUE(dict.GetPacUrl(&s));
264      EXPECT_EQ(expected_proxy_pac_url, s);
265    }
266    if (expected_proxy_bypass_list.empty()) {
267      EXPECT_FALSE(dict.GetBypassList(&s));
268    } else {
269      ASSERT_TRUE(dict.GetBypassList(&s));
270      EXPECT_EQ(expected_proxy_bypass_list, s);
271    }
272    ProxyPrefs::ProxyMode mode;
273    ASSERT_TRUE(dict.GetMode(&mode));
274    EXPECT_EQ(expected_proxy_mode, mode);
275  }
276};
277
278TEST_F(ConfigurationPolicyPrefStoreProxyTest, ManualOptions) {
279  MockConfigurationPolicyProvider provider;
280  provider.AddPolicy(kPolicyProxyBypassList,
281                     Value::CreateStringValue("http://chromium.org/override"));
282  provider.AddPolicy(kPolicyProxyServer,
283                     Value::CreateStringValue("chromium.org"));
284  provider.AddPolicy(kPolicyProxyServerMode,
285                     Value::CreateIntegerValue(
286                         kPolicyManuallyConfiguredProxyServerMode));
287
288  scoped_refptr<ConfigurationPolicyPrefStore> store(
289      new ConfigurationPolicyPrefStore(&provider));
290  VerifyProxyPrefs(
291      *store, "chromium.org", "", "http://chromium.org/override",
292      ProxyPrefs::MODE_FIXED_SERVERS);
293}
294
295TEST_F(ConfigurationPolicyPrefStoreProxyTest, ManualOptionsReversedApplyOrder) {
296  MockConfigurationPolicyProvider provider;
297  provider.AddPolicy(kPolicyProxyServerMode,
298                     Value::CreateIntegerValue(
299                         kPolicyManuallyConfiguredProxyServerMode));
300  provider.AddPolicy(kPolicyProxyBypassList,
301                     Value::CreateStringValue("http://chromium.org/override"));
302  provider.AddPolicy(kPolicyProxyServer,
303                     Value::CreateStringValue("chromium.org"));
304  scoped_refptr<ConfigurationPolicyPrefStore> store(
305      new ConfigurationPolicyPrefStore(&provider));
306  VerifyProxyPrefs(
307      *store, "chromium.org", "", "http://chromium.org/override",
308      ProxyPrefs::MODE_FIXED_SERVERS);
309}
310
311TEST_F(ConfigurationPolicyPrefStoreProxyTest, NoProxyServerMode) {
312  MockConfigurationPolicyProvider provider;
313  provider.AddPolicy(kPolicyProxyServerMode,
314                     Value::CreateIntegerValue(kPolicyNoProxyServerMode));
315
316  scoped_refptr<ConfigurationPolicyPrefStore> store(
317      new ConfigurationPolicyPrefStore(&provider));
318  VerifyProxyPrefs(*store, "", "", "", ProxyPrefs::MODE_DIRECT);
319}
320
321TEST_F(ConfigurationPolicyPrefStoreProxyTest, NoProxyModeName) {
322  MockConfigurationPolicyProvider provider;
323  provider.AddPolicy(
324      kPolicyProxyMode,
325      Value::CreateStringValue(ProxyPrefs::kDirectProxyModeName));
326
327  scoped_refptr<ConfigurationPolicyPrefStore> store(
328      new ConfigurationPolicyPrefStore(&provider));
329  VerifyProxyPrefs(*store, "", "", "", ProxyPrefs::MODE_DIRECT);
330}
331
332TEST_F(ConfigurationPolicyPrefStoreProxyTest, AutoDetectProxyServerMode) {
333  MockConfigurationPolicyProvider provider;
334  provider.AddPolicy(
335      kPolicyProxyServerMode,
336      Value::CreateIntegerValue(kPolicyAutoDetectProxyServerMode));
337
338  scoped_refptr<ConfigurationPolicyPrefStore> store(
339      new ConfigurationPolicyPrefStore(&provider));
340  VerifyProxyPrefs(*store, "", "", "", ProxyPrefs::MODE_AUTO_DETECT);
341}
342
343TEST_F(ConfigurationPolicyPrefStoreProxyTest, AutoDetectProxyModeName) {
344  MockConfigurationPolicyProvider provider;
345  provider.AddPolicy(
346      kPolicyProxyMode,
347      Value::CreateStringValue(ProxyPrefs::kAutoDetectProxyModeName));
348
349  scoped_refptr<ConfigurationPolicyPrefStore> store(
350      new ConfigurationPolicyPrefStore(&provider));
351  VerifyProxyPrefs(*store, "", "", "", ProxyPrefs::MODE_AUTO_DETECT);
352}
353
354TEST_F(ConfigurationPolicyPrefStoreProxyTest, PacScriptProxyMode) {
355  MockConfigurationPolicyProvider provider;
356  provider.AddPolicy(kPolicyProxyPacUrl,
357                     Value::CreateStringValue("http://short.org/proxy.pac"));
358  provider.AddPolicy(
359      kPolicyProxyMode,
360      Value::CreateStringValue(ProxyPrefs::kPacScriptProxyModeName));
361
362  scoped_refptr<ConfigurationPolicyPrefStore> store(
363      new ConfigurationPolicyPrefStore(&provider));
364  VerifyProxyPrefs(*store, "", "http://short.org/proxy.pac", "",
365                   ProxyPrefs::MODE_PAC_SCRIPT);
366}
367
368TEST_F(ConfigurationPolicyPrefStoreProxyTest, UseSystemProxyServerMode) {
369  MockConfigurationPolicyProvider provider;
370  provider.AddPolicy(
371      kPolicyProxyServerMode,
372      Value::CreateIntegerValue(kPolicyUseSystemProxyServerMode));
373
374  scoped_refptr<ConfigurationPolicyPrefStore> store(
375      new ConfigurationPolicyPrefStore(&provider));
376  VerifyProxyPrefs(*store, "", "", "", ProxyPrefs::MODE_SYSTEM);
377}
378
379TEST_F(ConfigurationPolicyPrefStoreProxyTest, UseSystemProxyMode) {
380  MockConfigurationPolicyProvider provider;
381  provider.AddPolicy(
382      kPolicyProxyMode,
383      Value::CreateStringValue(ProxyPrefs::kSystemProxyModeName));
384
385  scoped_refptr<ConfigurationPolicyPrefStore> store(
386      new ConfigurationPolicyPrefStore(&provider));
387  VerifyProxyPrefs(*store, "", "", "", ProxyPrefs::MODE_SYSTEM);
388}
389
390TEST_F(ConfigurationPolicyPrefStoreProxyTest,
391       ProxyModeOverridesProxyServerMode) {
392  MockConfigurationPolicyProvider provider;
393  provider.AddPolicy(kPolicyProxyServerMode,
394                     Value::CreateIntegerValue(kPolicyNoProxyServerMode));
395  provider.AddPolicy(
396      kPolicyProxyMode,
397      Value::CreateStringValue(ProxyPrefs::kAutoDetectProxyModeName));
398
399  scoped_refptr<ConfigurationPolicyPrefStore> store(
400      new ConfigurationPolicyPrefStore(&provider));
401  VerifyProxyPrefs(*store, "", "", "", ProxyPrefs::MODE_AUTO_DETECT);
402}
403
404TEST_F(ConfigurationPolicyPrefStoreProxyTest, ProxyInvalid) {
405  for (int i = 0; i < MODE_COUNT; ++i) {
406    MockConfigurationPolicyProvider provider;
407    provider.AddPolicy(kPolicyProxyServerMode, Value::CreateIntegerValue(i));
408    // No mode expects all three parameters being set.
409    provider.AddPolicy(kPolicyProxyPacUrl,
410                       Value::CreateStringValue("http://short.org/proxy.pac"));
411    provider.AddPolicy(kPolicyProxyBypassList,
412                       Value::CreateStringValue(
413                           "http://chromium.org/override"));
414    provider.AddPolicy(kPolicyProxyServer,
415                       Value::CreateStringValue("chromium.org"));
416
417    scoped_refptr<ConfigurationPolicyPrefStore> store(
418        new ConfigurationPolicyPrefStore(&provider));
419    Value* value = NULL;
420    EXPECT_EQ(PrefStore::READ_NO_VALUE,
421              store->GetValue(prefs::kProxy, &value));
422  }
423}
424
425class ConfigurationPolicyPrefStoreDefaultSearchTest : public testing::Test {
426};
427
428// Checks that if the policy for default search is valid, i.e. there's a
429// search URL, that all the elements have been given proper defaults.
430TEST_F(ConfigurationPolicyPrefStoreDefaultSearchTest, MinimallyDefined) {
431  const char* const search_url = "http://test.com/search?t={searchTerms}";
432  MockConfigurationPolicyProvider provider;
433  provider.AddPolicy(kPolicyDefaultSearchProviderEnabled,
434                     Value::CreateBooleanValue(true));
435  provider.AddPolicy(kPolicyDefaultSearchProviderSearchURL,
436                     Value::CreateStringValue(search_url));
437
438  scoped_refptr<ConfigurationPolicyPrefStore> store(
439      new ConfigurationPolicyPrefStore(&provider));
440
441  Value* value = NULL;
442  EXPECT_EQ(PrefStore::READ_OK,
443            store->GetValue(prefs::kDefaultSearchProviderSearchURL, &value));
444  EXPECT_TRUE(StringValue(search_url).Equals(value));
445
446  EXPECT_EQ(PrefStore::READ_OK,
447            store->GetValue(prefs::kDefaultSearchProviderName, &value));
448  EXPECT_TRUE(StringValue("test.com").Equals(value));
449
450  EXPECT_EQ(PrefStore::READ_OK,
451            store->GetValue(prefs::kDefaultSearchProviderKeyword, &value));
452  EXPECT_TRUE(StringValue(std::string()).Equals(value));
453
454  EXPECT_EQ(PrefStore::READ_OK,
455            store->GetValue(prefs::kDefaultSearchProviderSuggestURL, &value));
456  EXPECT_TRUE(StringValue(std::string()).Equals(value));
457
458  EXPECT_EQ(PrefStore::READ_OK,
459            store->GetValue(prefs::kDefaultSearchProviderIconURL, &value));
460  EXPECT_TRUE(StringValue(std::string()).Equals(value));
461
462  EXPECT_EQ(PrefStore::READ_OK,
463            store->GetValue(prefs::kDefaultSearchProviderEncodings, &value));
464  EXPECT_TRUE(StringValue(std::string()).Equals(value));
465
466  EXPECT_EQ(PrefStore::READ_OK,
467            store->GetValue(prefs::kDefaultSearchProviderInstantURL, &value));
468  EXPECT_TRUE(StringValue(std::string()).Equals(value));
469}
470
471// Checks that for a fully defined search policy, all elements have been
472// read properly.
473TEST_F(ConfigurationPolicyPrefStoreDefaultSearchTest, FullyDefined) {
474  const char* const search_url = "http://test.com/search?t={searchTerms}";
475  const char* const suggest_url = "http://test.com/sugg?={searchTerms}";
476  const char* const icon_url = "http://test.com/icon.jpg";
477  const char* const name = "MyName";
478  const char* const keyword = "MyKeyword";
479  const char* const encodings = "UTF-16;UTF-8";
480  MockConfigurationPolicyProvider provider;
481  provider.AddPolicy(kPolicyDefaultSearchProviderEnabled,
482                     Value::CreateBooleanValue(true));
483  provider.AddPolicy(kPolicyDefaultSearchProviderSearchURL,
484                     Value::CreateStringValue(search_url));
485  provider.AddPolicy(kPolicyDefaultSearchProviderName,
486                     Value::CreateStringValue(name));
487  provider.AddPolicy(kPolicyDefaultSearchProviderKeyword,
488                     Value::CreateStringValue(keyword));
489  provider.AddPolicy(kPolicyDefaultSearchProviderSuggestURL,
490                     Value::CreateStringValue(suggest_url));
491  provider.AddPolicy(kPolicyDefaultSearchProviderIconURL,
492                     Value::CreateStringValue(icon_url));
493  provider.AddPolicy(kPolicyDefaultSearchProviderEncodings,
494                     Value::CreateStringValue(encodings));
495
496  scoped_refptr<ConfigurationPolicyPrefStore> store(
497      new ConfigurationPolicyPrefStore(&provider));
498
499  Value* value = NULL;
500  EXPECT_EQ(PrefStore::READ_OK,
501            store->GetValue(prefs::kDefaultSearchProviderSearchURL, &value));
502  EXPECT_TRUE(StringValue(search_url).Equals(value));
503
504  EXPECT_EQ(PrefStore::READ_OK,
505            store->GetValue(prefs::kDefaultSearchProviderName, &value));
506  EXPECT_TRUE(StringValue(name).Equals(value));
507
508  EXPECT_EQ(PrefStore::READ_OK,
509            store->GetValue(prefs::kDefaultSearchProviderKeyword, &value));
510  EXPECT_TRUE(StringValue(keyword).Equals(value));
511
512  EXPECT_EQ(PrefStore::READ_OK,
513            store->GetValue(prefs::kDefaultSearchProviderSuggestURL, &value));
514  EXPECT_TRUE(StringValue(suggest_url).Equals(value));
515
516  EXPECT_EQ(PrefStore::READ_OK,
517            store->GetValue(prefs::kDefaultSearchProviderIconURL, &value));
518  EXPECT_TRUE(StringValue(icon_url).Equals(value));
519
520  EXPECT_EQ(PrefStore::READ_OK,
521            store->GetValue(prefs::kDefaultSearchProviderEncodings, &value));
522  EXPECT_TRUE(StringValue(encodings).Equals(value));
523}
524
525// Checks that if the default search policy is missing, that no elements of the
526// default search policy will be present.
527TEST_F(ConfigurationPolicyPrefStoreDefaultSearchTest, MissingUrl) {
528  const char* const suggest_url = "http://test.com/sugg?t={searchTerms}";
529  const char* const icon_url = "http://test.com/icon.jpg";
530  const char* const name = "MyName";
531  const char* const keyword = "MyKeyword";
532  const char* const encodings = "UTF-16;UTF-8";
533  MockConfigurationPolicyProvider provider;
534  provider.AddPolicy(kPolicyDefaultSearchProviderEnabled,
535                     Value::CreateBooleanValue(true));
536  provider.AddPolicy(kPolicyDefaultSearchProviderName,
537                     Value::CreateStringValue(name));
538  provider.AddPolicy(kPolicyDefaultSearchProviderKeyword,
539                     Value::CreateStringValue(keyword));
540  provider.AddPolicy(kPolicyDefaultSearchProviderSuggestURL,
541                     Value::CreateStringValue(suggest_url));
542  provider.AddPolicy(kPolicyDefaultSearchProviderIconURL,
543                     Value::CreateStringValue(icon_url));
544  provider.AddPolicy(kPolicyDefaultSearchProviderEncodings,
545                     Value::CreateStringValue(encodings));
546
547  scoped_refptr<ConfigurationPolicyPrefStore> store(
548      new ConfigurationPolicyPrefStore(&provider));
549
550  EXPECT_EQ(PrefStore::READ_NO_VALUE,
551            store->GetValue(prefs::kDefaultSearchProviderSearchURL, NULL));
552  EXPECT_EQ(PrefStore::READ_NO_VALUE,
553            store->GetValue(prefs::kDefaultSearchProviderName, NULL));
554  EXPECT_EQ(PrefStore::READ_NO_VALUE,
555            store->GetValue(prefs::kDefaultSearchProviderKeyword, NULL));
556  EXPECT_EQ(PrefStore::READ_NO_VALUE,
557            store->GetValue(prefs::kDefaultSearchProviderSuggestURL, NULL));
558  EXPECT_EQ(PrefStore::READ_NO_VALUE,
559            store->GetValue(prefs::kDefaultSearchProviderIconURL, NULL));
560  EXPECT_EQ(PrefStore::READ_NO_VALUE,
561            store->GetValue(prefs::kDefaultSearchProviderEncodings, NULL));
562}
563
564// Checks that if the default search policy is invalid, that no elements of the
565// default search policy will be present.
566TEST_F(ConfigurationPolicyPrefStoreDefaultSearchTest, Invalid) {
567  const char* const bad_search_url = "http://test.com/noSearchTerms";
568  const char* const suggest_url = "http://test.com/sugg?t={searchTerms}";
569  const char* const icon_url = "http://test.com/icon.jpg";
570  const char* const name = "MyName";
571  const char* const keyword = "MyKeyword";
572  const char* const encodings = "UTF-16;UTF-8";
573  MockConfigurationPolicyProvider provider;
574  provider.AddPolicy(kPolicyDefaultSearchProviderEnabled,
575                     Value::CreateBooleanValue(true));
576  provider.AddPolicy(kPolicyDefaultSearchProviderSearchURL,
577                     Value::CreateStringValue(bad_search_url));
578  provider.AddPolicy(kPolicyDefaultSearchProviderName,
579                     Value::CreateStringValue(name));
580  provider.AddPolicy(kPolicyDefaultSearchProviderKeyword,
581                     Value::CreateStringValue(keyword));
582  provider.AddPolicy(kPolicyDefaultSearchProviderSuggestURL,
583                     Value::CreateStringValue(suggest_url));
584  provider.AddPolicy(kPolicyDefaultSearchProviderIconURL,
585                     Value::CreateStringValue(icon_url));
586  provider.AddPolicy(kPolicyDefaultSearchProviderEncodings,
587                     Value::CreateStringValue(encodings));
588
589  scoped_refptr<ConfigurationPolicyPrefStore> store(
590      new ConfigurationPolicyPrefStore(&provider));
591
592  EXPECT_EQ(PrefStore::READ_NO_VALUE,
593            store->GetValue(prefs::kDefaultSearchProviderSearchURL, NULL));
594  EXPECT_EQ(PrefStore::READ_NO_VALUE,
595            store->GetValue(prefs::kDefaultSearchProviderName, NULL));
596  EXPECT_EQ(PrefStore::READ_NO_VALUE,
597            store->GetValue(prefs::kDefaultSearchProviderKeyword, NULL));
598  EXPECT_EQ(PrefStore::READ_NO_VALUE,
599            store->GetValue(prefs::kDefaultSearchProviderSuggestURL, NULL));
600  EXPECT_EQ(PrefStore::READ_NO_VALUE,
601            store->GetValue(prefs::kDefaultSearchProviderIconURL, NULL));
602  EXPECT_EQ(PrefStore::READ_NO_VALUE,
603            store->GetValue(prefs::kDefaultSearchProviderEncodings, NULL));
604}
605
606// Test cases for the Sync policy setting.
607class ConfigurationPolicyPrefStoreSyncTest
608    : public ConfigurationPolicyPrefStoreTestBase<testing::Test> {
609};
610
611TEST_F(ConfigurationPolicyPrefStoreSyncTest, Default) {
612  EXPECT_EQ(PrefStore::READ_NO_VALUE,
613            store_->GetValue(prefs::kSyncManaged, NULL));
614}
615
616TEST_F(ConfigurationPolicyPrefStoreSyncTest, Enabled) {
617  provider_.AddPolicy(kPolicySyncDisabled, Value::CreateBooleanValue(false));
618  store_->OnUpdatePolicy();
619  // Enabling Sync should not set the pref.
620  EXPECT_EQ(PrefStore::READ_NO_VALUE,
621            store_->GetValue(prefs::kSyncManaged, NULL));
622}
623
624TEST_F(ConfigurationPolicyPrefStoreSyncTest, Disabled) {
625  provider_.AddPolicy(kPolicySyncDisabled, Value::CreateBooleanValue(true));
626  store_->OnUpdatePolicy();
627  // Sync should be flagged as managed.
628  Value* value = NULL;
629  EXPECT_EQ(PrefStore::READ_OK, store_->GetValue(prefs::kSyncManaged, &value));
630  ASSERT_TRUE(value != NULL);
631  EXPECT_TRUE(FundamentalValue(true).Equals(value));
632}
633
634// Test cases for the AutoFill policy setting.
635class ConfigurationPolicyPrefStoreAutoFillTest
636    : public ConfigurationPolicyPrefStoreTestBase<testing::Test> {
637};
638
639TEST_F(ConfigurationPolicyPrefStoreAutoFillTest, Default) {
640  EXPECT_EQ(PrefStore::READ_NO_VALUE,
641            store_->GetValue(prefs::kSyncManaged, NULL));
642}
643
644TEST_F(ConfigurationPolicyPrefStoreAutoFillTest, Enabled) {
645  provider_.AddPolicy(kPolicyAutoFillEnabled, Value::CreateBooleanValue(true));
646  store_->OnUpdatePolicy();
647  // Enabling AutoFill should not set the pref.
648  EXPECT_EQ(PrefStore::READ_NO_VALUE,
649            store_->GetValue(prefs::kSyncManaged, NULL));
650}
651
652TEST_F(ConfigurationPolicyPrefStoreAutoFillTest, Disabled) {
653  provider_.AddPolicy(kPolicyAutoFillEnabled, Value::CreateBooleanValue(false));
654  store_->OnUpdatePolicy();
655  // Disabling AutoFill should switch the pref to managed.
656  Value* value = NULL;
657  EXPECT_EQ(PrefStore::READ_OK,
658            store_->GetValue(prefs::kAutoFillEnabled, &value));
659  EXPECT_TRUE(FundamentalValue(false).Equals(value));
660}
661
662// Exercises the policy refresh mechanism.
663class ConfigurationPolicyPrefStoreRefreshTest
664    : public ConfigurationPolicyPrefStoreTestBase<testing::Test> {
665 protected:
666  virtual void SetUp() {
667    store_->AddObserver(&observer_);
668  }
669
670  virtual void TearDown() {
671    store_->RemoveObserver(&observer_);
672  }
673
674  PrefStoreObserverMock observer_;
675};
676
677TEST_F(ConfigurationPolicyPrefStoreRefreshTest, Refresh) {
678  Value* value = NULL;
679  EXPECT_EQ(PrefStore::READ_NO_VALUE,
680            store_->GetValue(prefs::kHomePage, NULL));
681
682  EXPECT_CALL(observer_, OnPrefValueChanged(prefs::kHomePage)).Times(1);
683  provider_.AddPolicy(kPolicyHomepageLocation,
684                      Value::CreateStringValue("http://www.chromium.org"));
685  store_->OnUpdatePolicy();
686  Mock::VerifyAndClearExpectations(&observer_);
687  EXPECT_EQ(PrefStore::READ_OK,
688            store_->GetValue(prefs::kHomePage, &value));
689  EXPECT_TRUE(StringValue("http://www.chromium.org").Equals(value));
690
691  EXPECT_CALL(observer_, OnPrefValueChanged(_)).Times(0);
692  store_->OnUpdatePolicy();
693  Mock::VerifyAndClearExpectations(&observer_);
694
695  EXPECT_CALL(observer_, OnPrefValueChanged(prefs::kHomePage)).Times(1);
696  provider_.RemovePolicy(kPolicyHomepageLocation);
697  store_->OnUpdatePolicy();
698  Mock::VerifyAndClearExpectations(&observer_);
699  EXPECT_EQ(PrefStore::READ_NO_VALUE,
700            store_->GetValue(prefs::kHomePage, NULL));
701}
702
703TEST_F(ConfigurationPolicyPrefStoreRefreshTest, Initialization) {
704  EXPECT_FALSE(store_->IsInitializationComplete());
705
706  EXPECT_CALL(observer_, OnInitializationCompleted()).Times(1);
707
708  provider_.SetInitializationComplete(true);
709  EXPECT_FALSE(store_->IsInitializationComplete());
710
711  store_->OnUpdatePolicy();
712  Mock::VerifyAndClearExpectations(&observer_);
713  EXPECT_TRUE(store_->IsInitializationComplete());
714}
715
716}  // namespace policy
717