1// Copyright 2014 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 <string>
6
7#include "base/callback.h"
8#include "base/files/file_path.h"
9#include "base/prefs/pref_store_observer_mock.h"
10#include "base/run_loop.h"
11#include "components/policy/core/browser/configuration_policy_handler.h"
12#include "components/policy/core/browser/configuration_policy_pref_store.h"
13#include "components/policy/core/browser/configuration_policy_pref_store_test.h"
14#include "components/policy/core/common/external_data_fetcher.h"
15#include "components/policy/core/common/policy_details.h"
16#include "components/policy/core/common/policy_map.h"
17#include "components/policy/core/common/policy_pref_names.h"
18#include "components/policy/core/common/policy_service_impl.h"
19#include "testing/gmock/include/gmock/gmock.h"
20
21// Note: this file should move to components/policy/core/browser, but the
22// components_unittests runner does not load the ResourceBundle as
23// ChromeTestSuite::Initialize does, which leads to failures using
24// PolicyErrorMap.
25
26using testing::Mock;
27using testing::Return;
28using testing::_;
29
30namespace {
31
32const char kTestPolicy[] = "test.policy";
33const char kTestPref[] = "test.pref";
34
35}  // namespace
36
37namespace policy {
38
39// Test cases for list-valued policy settings.
40class ConfigurationPolicyPrefStoreListTest
41    : public ConfigurationPolicyPrefStoreTest {
42  virtual void SetUp() OVERRIDE {
43    handler_list_.AddHandler(
44        make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
45            kTestPolicy, kTestPref, base::Value::TYPE_LIST)));
46  }
47};
48
49TEST_F(ConfigurationPolicyPrefStoreListTest, GetDefault) {
50  EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
51}
52
53TEST_F(ConfigurationPolicyPrefStoreListTest, SetValue) {
54  base::ListValue* in_value = new base::ListValue();
55  in_value->Append(new base::StringValue("test1"));
56  in_value->Append(new base::StringValue("test2,"));
57  PolicyMap policy;
58  policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY,
59             POLICY_SCOPE_USER, in_value, NULL);
60  UpdateProviderPolicy(policy);
61  const base::Value* value = NULL;
62  EXPECT_TRUE(store_->GetValue(kTestPref, &value));
63  ASSERT_TRUE(value);
64  EXPECT_TRUE(in_value->Equals(value));
65}
66
67// Test cases for string-valued policy settings.
68class ConfigurationPolicyPrefStoreStringTest
69    : public ConfigurationPolicyPrefStoreTest {
70  virtual void SetUp() OVERRIDE {
71    handler_list_.AddHandler(
72        make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
73            kTestPolicy, kTestPref, base::Value::TYPE_STRING)));
74  }
75};
76
77TEST_F(ConfigurationPolicyPrefStoreStringTest, GetDefault) {
78  EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
79}
80
81TEST_F(ConfigurationPolicyPrefStoreStringTest, SetValue) {
82  PolicyMap policy;
83  policy.Set(kTestPolicy,
84             POLICY_LEVEL_MANDATORY,
85             POLICY_SCOPE_USER,
86             new base::StringValue("http://chromium.org"),
87             NULL);
88  UpdateProviderPolicy(policy);
89  const base::Value* value = NULL;
90  EXPECT_TRUE(store_->GetValue(kTestPref, &value));
91  ASSERT_TRUE(value);
92  EXPECT_TRUE(base::StringValue("http://chromium.org").Equals(value));
93}
94
95// Test cases for boolean-valued policy settings.
96class ConfigurationPolicyPrefStoreBooleanTest
97    : public ConfigurationPolicyPrefStoreTest {
98  virtual void SetUp() OVERRIDE {
99    handler_list_.AddHandler(
100        make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
101            kTestPolicy, kTestPref, base::Value::TYPE_BOOLEAN)));
102  }
103};
104
105TEST_F(ConfigurationPolicyPrefStoreBooleanTest, GetDefault) {
106  EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
107}
108
109TEST_F(ConfigurationPolicyPrefStoreBooleanTest, SetValue) {
110  PolicyMap policy;
111  policy.Set(kTestPolicy,
112             POLICY_LEVEL_MANDATORY,
113             POLICY_SCOPE_USER,
114             new base::FundamentalValue(false),
115             NULL);
116  UpdateProviderPolicy(policy);
117  const base::Value* value = NULL;
118  EXPECT_TRUE(store_->GetValue(kTestPref, &value));
119  ASSERT_TRUE(value);
120  bool boolean_value = true;
121  bool result = value->GetAsBoolean(&boolean_value);
122  ASSERT_TRUE(result);
123  EXPECT_FALSE(boolean_value);
124
125  policy.Set(kTestPolicy,
126             POLICY_LEVEL_MANDATORY,
127             POLICY_SCOPE_USER,
128             new base::FundamentalValue(true),
129             NULL);
130  UpdateProviderPolicy(policy);
131  value = NULL;
132  EXPECT_TRUE(store_->GetValue(kTestPref, &value));
133  boolean_value = false;
134  result = value->GetAsBoolean(&boolean_value);
135  ASSERT_TRUE(result);
136  EXPECT_TRUE(boolean_value);
137}
138
139// Test cases for integer-valued policy settings.
140class ConfigurationPolicyPrefStoreIntegerTest
141    : public ConfigurationPolicyPrefStoreTest {
142  virtual void SetUp() OVERRIDE {
143    handler_list_.AddHandler(
144        make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
145            kTestPolicy, kTestPref, base::Value::TYPE_INTEGER)));
146  }
147};
148
149TEST_F(ConfigurationPolicyPrefStoreIntegerTest, GetDefault) {
150  EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
151}
152
153TEST_F(ConfigurationPolicyPrefStoreIntegerTest, SetValue) {
154  PolicyMap policy;
155  policy.Set(kTestPolicy,
156             POLICY_LEVEL_MANDATORY,
157             POLICY_SCOPE_USER,
158             new base::FundamentalValue(2),
159             NULL);
160  UpdateProviderPolicy(policy);
161  const base::Value* value = NULL;
162  EXPECT_TRUE(store_->GetValue(kTestPref, &value));
163  EXPECT_TRUE(base::FundamentalValue(2).Equals(value));
164}
165
166// Exercises the policy refresh mechanism.
167class ConfigurationPolicyPrefStoreRefreshTest
168    : public ConfigurationPolicyPrefStoreTest {
169 protected:
170  virtual void SetUp() OVERRIDE {
171    ConfigurationPolicyPrefStoreTest::SetUp();
172    store_->AddObserver(&observer_);
173    handler_list_.AddHandler(
174        make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
175            kTestPolicy, kTestPref, base::Value::TYPE_STRING)));
176  }
177
178  virtual void TearDown() OVERRIDE {
179    store_->RemoveObserver(&observer_);
180    ConfigurationPolicyPrefStoreTest::TearDown();
181  }
182
183  PrefStoreObserverMock observer_;
184};
185
186TEST_F(ConfigurationPolicyPrefStoreRefreshTest, Refresh) {
187  const base::Value* value = NULL;
188  EXPECT_FALSE(store_->GetValue(kTestPolicy, NULL));
189
190  PolicyMap policy;
191  policy.Set(kTestPolicy,
192             POLICY_LEVEL_MANDATORY,
193             POLICY_SCOPE_USER,
194             new base::StringValue("http://www.chromium.org"),
195             NULL);
196  UpdateProviderPolicy(policy);
197  observer_.VerifyAndResetChangedKey(kTestPref);
198  EXPECT_TRUE(store_->GetValue(kTestPref, &value));
199  EXPECT_TRUE(base::StringValue("http://www.chromium.org").Equals(value));
200
201  UpdateProviderPolicy(policy);
202  EXPECT_TRUE(observer_.changed_keys.empty());
203
204  policy.Erase(kTestPolicy);
205  UpdateProviderPolicy(policy);
206  observer_.VerifyAndResetChangedKey(kTestPref);
207  EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
208}
209
210TEST_F(ConfigurationPolicyPrefStoreRefreshTest, Initialization) {
211  EXPECT_FALSE(store_->IsInitializationComplete());
212  EXPECT_CALL(provider_, IsInitializationComplete(POLICY_DOMAIN_CHROME))
213      .WillRepeatedly(Return(true));
214  PolicyMap policy;
215  UpdateProviderPolicy(policy);
216  EXPECT_TRUE(observer_.initialized);
217  EXPECT_TRUE(observer_.initialization_success);
218  Mock::VerifyAndClearExpectations(&observer_);
219  EXPECT_TRUE(store_->IsInitializationComplete());
220}
221
222}  // namespace policy
223