Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(298)

Side by Side Diff: chrome/browser/policy/policy_service_impl_unittest.cc

Issue 10386097: Refactored ConfigurationPolicyProvider to provide PolicyBundles instead of PolicyMaps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/policy/policy_service_impl.h" 5 #include "chrome/browser/policy/policy_service_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "base/values.h" 11 #include "base/values.h"
12 #include "chrome/browser/policy/mock_configuration_policy_provider.h" 12 #include "chrome/browser/policy/mock_configuration_policy_provider.h"
13 #include "content/public/browser/browser_thread.h" 13 #include "content/public/browser/browser_thread.h"
14 #include "content/test/test_browser_thread.h" 14 #include "content/test/test_browser_thread.h"
15 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 17
18 using ::testing::AnyNumber; 18 using ::testing::AnyNumber;
19 using ::testing::Mock; 19 using ::testing::Mock;
20 using ::testing::Return; 20 using ::testing::Return;
21 using ::testing::_; 21 using ::testing::_;
22 22
23 namespace policy { 23 namespace policy {
24 24
25 namespace { 25 namespace {
26 26
27 const char kExtension[] = "extension-id";
28 const char kSameLevelPolicy[] = "policy-same-level-and-scope";
29 const char kDiffLevelPolicy[] = "chrome-diff-level-and-scope";
30
27 class MockPolicyServiceObserver : public PolicyService::Observer { 31 class MockPolicyServiceObserver : public PolicyService::Observer {
28 public: 32 public:
29 virtual ~MockPolicyServiceObserver() {} 33 virtual ~MockPolicyServiceObserver() {}
30 MOCK_METHOD4(OnPolicyUpdated, void(PolicyDomain, 34 MOCK_METHOD4(OnPolicyUpdated, void(PolicyDomain,
31 const std::string&, 35 const std::string&,
32 const PolicyMap& previous, 36 const PolicyMap& previous,
33 const PolicyMap& current)); 37 const PolicyMap& current));
34 }; 38 };
35 39
36 // Helper to compare the arguments to an EXPECT_CALL of OnPolicyUpdated() with 40 // Helper to compare the arguments to an EXPECT_CALL of OnPolicyUpdated() with
37 // their expected values. 41 // their expected values.
38 MATCHER_P(PolicyEquals, expected, "") { 42 MATCHER_P(PolicyEquals, expected, "") {
39 return arg.Equals(*expected); 43 return arg.Equals(*expected);
40 } 44 }
41 45
42 // Helper to compare the arguments to an EXPECT_CALL of OnPolicyValueUpdated() 46 // Helper to compare the arguments to an EXPECT_CALL of OnPolicyValueUpdated()
43 // with their expected values. 47 // with their expected values.
44 MATCHER_P(ValueEquals, expected, "") { 48 MATCHER_P(ValueEquals, expected, "") {
45 return base::Value::Equals(arg, expected); 49 return base::Value::Equals(arg, expected);
46 } 50 }
47 51
52 // Helper that fills |bundle| with test policies.
53 void AddTestPolicies(PolicyBundle* bundle,
54 const char* value,
55 PolicyLevel level,
56 PolicyScope scope) {
57 PolicyMap* policy_map = &bundle->Get(POLICY_DOMAIN_CHROME, "");
58 policy_map->Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
59 base::Value::CreateStringValue(value));
60 policy_map->Set(kDiffLevelPolicy, level, scope,
61 base::Value::CreateStringValue(value));
62 policy_map = &bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension);
63 policy_map->Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY,
64 POLICY_SCOPE_USER, base::Value::CreateStringValue(value));
65 policy_map->Set(kDiffLevelPolicy, level, scope,
66 base::Value::CreateStringValue(value));
67 }
68
48 } // namespace 69 } // namespace
49 70
50 class PolicyServiceTest : public testing::Test { 71 class PolicyServiceTest : public testing::Test {
51 public: 72 public:
52 PolicyServiceTest() {} 73 PolicyServiceTest() {}
53 74
54 void SetUp() OVERRIDE { 75 void SetUp() OVERRIDE {
55 EXPECT_CALL(provider0_, ProvideInternal(_))
56 .WillRepeatedly(CopyPolicyMap(&policy0_));
57 EXPECT_CALL(provider1_, ProvideInternal(_))
58 .WillRepeatedly(CopyPolicyMap(&policy1_));
59 EXPECT_CALL(provider2_, ProvideInternal(_))
60 .WillRepeatedly(CopyPolicyMap(&policy2_));
61
62 EXPECT_CALL(provider0_, IsInitializationComplete()) 76 EXPECT_CALL(provider0_, IsInitializationComplete())
63 .WillRepeatedly(Return(true)); 77 .WillRepeatedly(Return(true));
64 EXPECT_CALL(provider1_, IsInitializationComplete()) 78 EXPECT_CALL(provider1_, IsInitializationComplete())
65 .WillRepeatedly(Return(true)); 79 .WillRepeatedly(Return(true));
66 EXPECT_CALL(provider2_, IsInitializationComplete()) 80 EXPECT_CALL(provider2_, IsInitializationComplete())
67 .WillRepeatedly(Return(true)); 81 .WillRepeatedly(Return(true));
68 82
69 policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 83 policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
70 base::Value::CreateIntegerValue(13)); 84 base::Value::CreateIntegerValue(13));
85 provider0_.UpdateChromePolicy(policy0_);
71 86
72 PolicyServiceImpl::Providers providers; 87 PolicyServiceImpl::Providers providers;
73 providers.push_back(&provider0_); 88 providers.push_back(&provider0_);
74 providers.push_back(&provider1_); 89 providers.push_back(&provider1_);
75 providers.push_back(&provider2_); 90 providers.push_back(&provider2_);
76 policy_service_.reset(new PolicyServiceImpl(providers)); 91 policy_service_.reset(new PolicyServiceImpl(providers));
77 } 92 }
78 93
79 MOCK_METHOD2(OnPolicyValueUpdated, void(const base::Value*, 94 MOCK_METHOD2(OnPolicyValueUpdated, void(const base::Value*,
80 const base::Value*)); 95 const base::Value*));
81 96
82 MOCK_METHOD0(OnPolicyRefresh, void()); 97 MOCK_METHOD0(OnPolicyRefresh, void());
83 98
84 // Returns true if the policies for |domain|, |component_id| match |expected|. 99 // Returns true if the policies for |domain|, |component_id| match |expected|.
85 bool VerifyPolicies(PolicyDomain domain, 100 bool VerifyPolicies(PolicyDomain domain,
86 const std::string& component_id, 101 const std::string& component_id,
87 const PolicyMap& expected) { 102 const PolicyMap& expected) {
88 const PolicyMap* policies = 103 return policy_service_->GetPolicies(domain, component_id).Equals(expected);
89 policy_service_->GetPolicies(domain, component_id);
90 return policies && policies->Equals(expected);
91 } 104 }
92 105
93 protected: 106 protected:
94 MockConfigurationPolicyProvider provider0_; 107 MockConfigurationPolicyProvider provider0_;
95 MockConfigurationPolicyProvider provider1_; 108 MockConfigurationPolicyProvider provider1_;
96 MockConfigurationPolicyProvider provider2_; 109 MockConfigurationPolicyProvider provider2_;
97 PolicyMap policy0_; 110 PolicyMap policy0_;
98 PolicyMap policy1_; 111 PolicyMap policy1_;
99 PolicyMap policy2_; 112 PolicyMap policy2_;
100 scoped_ptr<PolicyServiceImpl> policy_service_; 113 scoped_ptr<PolicyServiceImpl> policy_service_;
(...skipping 19 matching lines...) Expand all
120 133
121 PolicyMap expectedCurrent; 134 PolicyMap expectedCurrent;
122 expectedCurrent.CopyFrom(expectedPrevious); 135 expectedCurrent.CopyFrom(expectedPrevious);
123 expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 136 expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
124 base::Value::CreateIntegerValue(123)); 137 base::Value::CreateIntegerValue(123));
125 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 138 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
126 base::Value::CreateIntegerValue(123)); 139 base::Value::CreateIntegerValue(123));
127 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", 140 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
128 PolicyEquals(&expectedPrevious), 141 PolicyEquals(&expectedPrevious),
129 PolicyEquals(&expectedCurrent))); 142 PolicyEquals(&expectedCurrent)));
130 provider0_.NotifyPolicyUpdated(); 143 provider0_.UpdateChromePolicy(policy0_);
131 Mock::VerifyAndClearExpectations(&observer); 144 Mock::VerifyAndClearExpectations(&observer);
132 145
133 // No changes. 146 // No changes.
134 EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); 147 EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0);
135 provider0_.NotifyPolicyUpdated(); 148 provider0_.UpdateChromePolicy(policy0_);
136 Mock::VerifyAndClearExpectations(&observer); 149 Mock::VerifyAndClearExpectations(&observer);
137 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); 150 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent));
138 151
139 // New policy. 152 // New policy.
140 expectedPrevious.CopyFrom(expectedCurrent); 153 expectedPrevious.CopyFrom(expectedCurrent);
141 expectedCurrent.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 154 expectedCurrent.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
142 base::Value::CreateIntegerValue(456)); 155 base::Value::CreateIntegerValue(456));
143 policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 156 policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
144 base::Value::CreateIntegerValue(456)); 157 base::Value::CreateIntegerValue(456));
145 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", 158 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
146 PolicyEquals(&expectedPrevious), 159 PolicyEquals(&expectedPrevious),
147 PolicyEquals(&expectedCurrent))); 160 PolicyEquals(&expectedCurrent)));
148 provider0_.NotifyPolicyUpdated(); 161 provider0_.UpdateChromePolicy(policy0_);
149 Mock::VerifyAndClearExpectations(&observer); 162 Mock::VerifyAndClearExpectations(&observer);
150 163
151 // Removed policy. 164 // Removed policy.
152 expectedPrevious.CopyFrom(expectedCurrent); 165 expectedPrevious.CopyFrom(expectedCurrent);
153 expectedCurrent.Erase("bbb"); 166 expectedCurrent.Erase("bbb");
154 policy0_.Erase("bbb"); 167 policy0_.Erase("bbb");
155 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", 168 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
156 PolicyEquals(&expectedPrevious), 169 PolicyEquals(&expectedPrevious),
157 PolicyEquals(&expectedCurrent))); 170 PolicyEquals(&expectedCurrent)));
158 provider0_.NotifyPolicyUpdated(); 171 provider0_.UpdateChromePolicy(policy0_);
159 Mock::VerifyAndClearExpectations(&observer); 172 Mock::VerifyAndClearExpectations(&observer);
160 173
161 // Changed policy. 174 // Changed policy.
162 expectedPrevious.CopyFrom(expectedCurrent); 175 expectedPrevious.CopyFrom(expectedCurrent);
163 expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 176 expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
164 base::Value::CreateIntegerValue(789)); 177 base::Value::CreateIntegerValue(789));
165 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 178 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
166 base::Value::CreateIntegerValue(789)); 179 base::Value::CreateIntegerValue(789));
167 180
168 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", 181 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
169 PolicyEquals(&expectedPrevious), 182 PolicyEquals(&expectedPrevious),
170 PolicyEquals(&expectedCurrent))); 183 PolicyEquals(&expectedCurrent)));
171 provider0_.NotifyPolicyUpdated(); 184 provider0_.UpdateChromePolicy(policy0_);
172 Mock::VerifyAndClearExpectations(&observer); 185 Mock::VerifyAndClearExpectations(&observer);
173 186
174 // No changes again. 187 // No changes again.
175 EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); 188 EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0);
176 provider0_.NotifyPolicyUpdated(); 189 provider0_.UpdateChromePolicy(policy0_);
177 Mock::VerifyAndClearExpectations(&observer); 190 Mock::VerifyAndClearExpectations(&observer);
178 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); 191 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent));
179 192
180 policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &observer); 193 policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &observer);
181 } 194 }
182 195
196 TEST_F(PolicyServiceTest, NotifyObserversInMultipleNamespaces) {
197 const std::string kExtension0("extension-0");
198 const std::string kExtension1("extension-1");
199 const std::string kExtension2("extension-2");
200 MockPolicyServiceObserver chrome_observer;
201 MockPolicyServiceObserver extension0_observer;
202 MockPolicyServiceObserver extension1_observer;
203 MockPolicyServiceObserver extension2_observer;
204 policy_service_->AddObserver(POLICY_DOMAIN_CHROME, "", &chrome_observer);
205 policy_service_->AddObserver(POLICY_DOMAIN_EXTENSIONS, kExtension0,
206 &extension0_observer);
207 policy_service_->AddObserver(POLICY_DOMAIN_EXTENSIONS, kExtension1,
208 &extension1_observer);
209 policy_service_->AddObserver(POLICY_DOMAIN_EXTENSIONS, kExtension2,
210 &extension2_observer);
211
212 PolicyMap previous_policy_map;
213 previous_policy_map.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
214 base::Value::CreateIntegerValue(13));
215 PolicyMap policy_map;
216 policy_map.CopyFrom(previous_policy_map);
217 policy_map.Set("policy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
218 base::Value::CreateStringValue("value"));
219
220 scoped_ptr<PolicyBundle> bundle(new PolicyBundle());
221 // The initial setup includes a policy for chrome that is now changing.
222 bundle->Get(POLICY_DOMAIN_CHROME, "").CopyFrom(policy_map);
223 bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension0).CopyFrom(policy_map);
224 bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension1).CopyFrom(policy_map);
225
226 const PolicyMap kEmptyPolicyMap;
227 EXPECT_CALL(chrome_observer,
228 OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
229 PolicyEquals(&previous_policy_map),
230 PolicyEquals(&policy_map)));
231 EXPECT_CALL(extension0_observer,
232 OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension0,
233 PolicyEquals(&kEmptyPolicyMap),
234 PolicyEquals(&policy_map)));
235 EXPECT_CALL(extension1_observer,
236 OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension1,
237 PolicyEquals(&kEmptyPolicyMap),
238 PolicyEquals(&policy_map)));
239 EXPECT_CALL(extension2_observer, OnPolicyUpdated(_, _, _, _)).Times(0);
240 provider0_.UpdatePolicy(bundle.Pass());
241 Mock::VerifyAndClearExpectations(&chrome_observer);
242 Mock::VerifyAndClearExpectations(&extension0_observer);
243 Mock::VerifyAndClearExpectations(&extension1_observer);
244 Mock::VerifyAndClearExpectations(&extension2_observer);
245
246 // Chrome policy stays the same, kExtension0 is gone, kExtension1 changes,
247 // and kExtension2 is new.
248 previous_policy_map.CopyFrom(policy_map);
249 bundle.reset(new PolicyBundle());
250 bundle->Get(POLICY_DOMAIN_CHROME, "").CopyFrom(policy_map);
251 policy_map.Set("policy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
252 base::Value::CreateStringValue("another value"));
253 bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension1).CopyFrom(policy_map);
254 bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension2).CopyFrom(policy_map);
255
256 EXPECT_CALL(chrome_observer, OnPolicyUpdated(_, _, _, _)).Times(0);
257 EXPECT_CALL(extension0_observer,
258 OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension0,
259 PolicyEquals(&previous_policy_map),
260 PolicyEquals(&kEmptyPolicyMap)));
261 EXPECT_CALL(extension1_observer,
262 OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension1,
263 PolicyEquals(&previous_policy_map),
264 PolicyEquals(&policy_map)));
265 EXPECT_CALL(extension2_observer,
266 OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension2,
267 PolicyEquals(&kEmptyPolicyMap),
268 PolicyEquals(&policy_map)));
269 provider0_.UpdatePolicy(bundle.Pass());
270 Mock::VerifyAndClearExpectations(&chrome_observer);
271 Mock::VerifyAndClearExpectations(&extension0_observer);
272 Mock::VerifyAndClearExpectations(&extension1_observer);
273 Mock::VerifyAndClearExpectations(&extension2_observer);
274
275 policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &chrome_observer);
276 policy_service_->RemoveObserver(POLICY_DOMAIN_EXTENSIONS, kExtension0,
277 &extension0_observer);
278 policy_service_->RemoveObserver(POLICY_DOMAIN_EXTENSIONS, kExtension1,
279 &extension1_observer);
280 policy_service_->RemoveObserver(POLICY_DOMAIN_EXTENSIONS, kExtension2,
281 &extension2_observer);
282 }
283
183 TEST_F(PolicyServiceTest, Priorities) { 284 TEST_F(PolicyServiceTest, Priorities) {
184 PolicyMap expected; 285 PolicyMap expected;
185 expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 286 expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
186 base::Value::CreateIntegerValue(13)); 287 base::Value::CreateIntegerValue(13));
187 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 288 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
188 base::Value::CreateIntegerValue(0)); 289 base::Value::CreateIntegerValue(0));
189 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 290 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
190 base::Value::CreateIntegerValue(0)); 291 base::Value::CreateIntegerValue(0));
191 policy1_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 292 policy1_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
192 base::Value::CreateIntegerValue(1)); 293 base::Value::CreateIntegerValue(1));
193 policy2_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 294 policy2_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
194 base::Value::CreateIntegerValue(2)); 295 base::Value::CreateIntegerValue(2));
195 provider0_.NotifyPolicyUpdated(); 296 provider0_.UpdateChromePolicy(policy0_);
196 provider1_.NotifyPolicyUpdated(); 297 provider1_.UpdateChromePolicy(policy1_);
197 provider2_.NotifyPolicyUpdated(); 298 provider2_.UpdateChromePolicy(policy2_);
198 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); 299 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected));
199 300
200 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 301 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
201 base::Value::CreateIntegerValue(1)); 302 base::Value::CreateIntegerValue(1));
202 policy0_.Erase("aaa"); 303 policy0_.Erase("aaa");
203 provider0_.NotifyPolicyUpdated(); 304 provider0_.UpdateChromePolicy(policy0_);
204 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); 305 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected));
205 306
206 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 307 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
207 base::Value::CreateIntegerValue(2)); 308 base::Value::CreateIntegerValue(2));
208 policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, 309 policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
209 base::Value::CreateIntegerValue(1)); 310 base::Value::CreateIntegerValue(1));
210 provider1_.NotifyPolicyUpdated(); 311 provider1_.UpdateChromePolicy(policy1_);
211 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); 312 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected));
212 } 313 }
213 314
214 TEST_F(PolicyServiceTest, PolicyChangeRegistrar) { 315 TEST_F(PolicyServiceTest, PolicyChangeRegistrar) {
215 scoped_ptr<PolicyChangeRegistrar> registrar( 316 scoped_ptr<PolicyChangeRegistrar> registrar(
216 new PolicyChangeRegistrar( 317 new PolicyChangeRegistrar(
217 policy_service_.get(), POLICY_DOMAIN_CHROME, "")); 318 policy_service_.get(), POLICY_DOMAIN_CHROME, ""));
218 319
219 // Starting to observe existing policies doesn't trigger a notification. 320 // Starting to observe existing policies doesn't trigger a notification.
220 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); 321 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0);
221 registrar->Observe("pre", base::Bind( 322 registrar->Observe("pre", base::Bind(
222 &PolicyServiceTest::OnPolicyValueUpdated, 323 &PolicyServiceTest::OnPolicyValueUpdated,
223 base::Unretained(this))); 324 base::Unretained(this)));
224 registrar->Observe("aaa", base::Bind( 325 registrar->Observe("aaa", base::Bind(
225 &PolicyServiceTest::OnPolicyValueUpdated, 326 &PolicyServiceTest::OnPolicyValueUpdated,
226 base::Unretained(this))); 327 base::Unretained(this)));
227 Mock::VerifyAndClearExpectations(this); 328 Mock::VerifyAndClearExpectations(this);
228 329
229 // Changing it now triggers a notification. 330 // Changing it now triggers a notification.
230 base::FundamentalValue kValue0(0); 331 base::FundamentalValue kValue0(0);
231 EXPECT_CALL(*this, OnPolicyValueUpdated(NULL, ValueEquals(&kValue0))); 332 EXPECT_CALL(*this, OnPolicyValueUpdated(NULL, ValueEquals(&kValue0)));
232 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 333 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
233 kValue0.DeepCopy()); 334 kValue0.DeepCopy());
234 provider0_.NotifyPolicyUpdated(); 335 provider0_.UpdateChromePolicy(policy0_);
235 Mock::VerifyAndClearExpectations(this); 336 Mock::VerifyAndClearExpectations(this);
236 337
237 // Changing other values doesn't trigger a notification. 338 // Changing other values doesn't trigger a notification.
238 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); 339 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0);
239 policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 340 policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
240 kValue0.DeepCopy()); 341 kValue0.DeepCopy());
241 provider0_.NotifyPolicyUpdated(); 342 provider0_.UpdateChromePolicy(policy0_);
242 Mock::VerifyAndClearExpectations(this); 343 Mock::VerifyAndClearExpectations(this);
243 344
244 // Modifying the value triggers a notification. 345 // Modifying the value triggers a notification.
245 base::FundamentalValue kValue1(1); 346 base::FundamentalValue kValue1(1);
246 EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue0), 347 EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue0),
247 ValueEquals(&kValue1))); 348 ValueEquals(&kValue1)));
248 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 349 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
249 kValue1.DeepCopy()); 350 kValue1.DeepCopy());
250 provider0_.NotifyPolicyUpdated(); 351 provider0_.UpdateChromePolicy(policy0_);
251 Mock::VerifyAndClearExpectations(this); 352 Mock::VerifyAndClearExpectations(this);
252 353
253 // Removing the value triggers a notification. 354 // Removing the value triggers a notification.
254 EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue1), NULL)); 355 EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue1), NULL));
255 policy0_.Erase("aaa"); 356 policy0_.Erase("aaa");
256 provider0_.NotifyPolicyUpdated(); 357 provider0_.UpdateChromePolicy(policy0_);
257 Mock::VerifyAndClearExpectations(this); 358 Mock::VerifyAndClearExpectations(this);
258 359
259 // No more notifications after destroying the registrar. 360 // No more notifications after destroying the registrar.
260 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); 361 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0);
261 registrar.reset(); 362 registrar.reset();
262 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 363 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
263 kValue1.DeepCopy()); 364 kValue1.DeepCopy());
264 policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 365 policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
265 kValue1.DeepCopy()); 366 kValue1.DeepCopy());
266 provider0_.NotifyPolicyUpdated(); 367 provider0_.UpdateChromePolicy(policy0_);
267 Mock::VerifyAndClearExpectations(this); 368 Mock::VerifyAndClearExpectations(this);
268 } 369 }
269 370
270 TEST_F(PolicyServiceTest, RefreshPolicies) { 371 TEST_F(PolicyServiceTest, RefreshPolicies) {
271 MessageLoop loop; 372 MessageLoop loop;
272 content::TestBrowserThread ui_thread(content::BrowserThread::UI, &loop); 373 content::TestBrowserThread ui_thread(content::BrowserThread::UI, &loop);
273 content::TestBrowserThread file_thread(content::BrowserThread::FILE, &loop); 374 content::TestBrowserThread file_thread(content::BrowserThread::FILE, &loop);
274 content::TestBrowserThread io_thread(content::BrowserThread::IO, &loop); 375 content::TestBrowserThread io_thread(content::BrowserThread::IO, &loop);
275 376
276 EXPECT_CALL(provider0_, RefreshPolicies()).Times(AnyNumber()); 377 EXPECT_CALL(provider0_, RefreshPolicies()).Times(AnyNumber());
277 EXPECT_CALL(provider1_, RefreshPolicies()).Times(AnyNumber()); 378 EXPECT_CALL(provider1_, RefreshPolicies()).Times(AnyNumber());
278 EXPECT_CALL(provider2_, RefreshPolicies()).Times(AnyNumber()); 379 EXPECT_CALL(provider2_, RefreshPolicies()).Times(AnyNumber());
279 380
280 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); 381 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
281 policy_service_->RefreshPolicies(base::Bind( 382 policy_service_->RefreshPolicies(base::Bind(
282 &PolicyServiceTest::OnPolicyRefresh, 383 &PolicyServiceTest::OnPolicyRefresh,
283 base::Unretained(this))); 384 base::Unretained(this)));
284 loop.RunAllPending(); 385 loop.RunAllPending();
285 Mock::VerifyAndClearExpectations(this); 386 Mock::VerifyAndClearExpectations(this);
286 387
287 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); 388 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
288 base::FundamentalValue kValue0(0); 389 base::FundamentalValue kValue0(0);
289 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 390 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
290 kValue0.DeepCopy()); 391 kValue0.DeepCopy());
291 provider0_.NotifyPolicyUpdated(); 392 provider0_.UpdateChromePolicy(policy0_);
292 loop.RunAllPending(); 393 loop.RunAllPending();
293 Mock::VerifyAndClearExpectations(this); 394 Mock::VerifyAndClearExpectations(this);
294 395
295 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); 396 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
296 base::FundamentalValue kValue1(1); 397 base::FundamentalValue kValue1(1);
297 policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, 398 policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
298 kValue1.DeepCopy()); 399 kValue1.DeepCopy());
299 provider1_.NotifyPolicyUpdated(); 400 provider1_.UpdateChromePolicy(policy1_);
300 loop.RunAllPending(); 401 loop.RunAllPending();
301 Mock::VerifyAndClearExpectations(this); 402 Mock::VerifyAndClearExpectations(this);
302 403
303 // A provider can refresh more than once after a RefreshPolicies call, but 404 // A provider can refresh more than once after a RefreshPolicies call, but
304 // OnPolicyRefresh should be triggered only after all providers are 405 // OnPolicyRefresh should be triggered only after all providers are
305 // refreshed. 406 // refreshed.
306 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); 407 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
307 policy1_.Set("bbb", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, 408 policy1_.Set("bbb", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
308 kValue1.DeepCopy()); 409 kValue1.DeepCopy());
309 provider1_.NotifyPolicyUpdated(); 410 provider1_.UpdateChromePolicy(policy1_);
310 loop.RunAllPending(); 411 loop.RunAllPending();
311 Mock::VerifyAndClearExpectations(this); 412 Mock::VerifyAndClearExpectations(this);
312 413
313 // If another RefreshPolicies() call happens while waiting for a previous 414 // If another RefreshPolicies() call happens while waiting for a previous
314 // one to complete, then all providers must refresh again. 415 // one to complete, then all providers must refresh again.
315 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); 416 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
316 policy_service_->RefreshPolicies(base::Bind( 417 policy_service_->RefreshPolicies(base::Bind(
317 &PolicyServiceTest::OnPolicyRefresh, 418 &PolicyServiceTest::OnPolicyRefresh,
318 base::Unretained(this))); 419 base::Unretained(this)));
319 loop.RunAllPending(); 420 loop.RunAllPending();
320 Mock::VerifyAndClearExpectations(this); 421 Mock::VerifyAndClearExpectations(this);
321 422
322 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); 423 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
323 policy2_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 424 policy2_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
324 kValue0.DeepCopy()); 425 kValue0.DeepCopy());
325 provider2_.NotifyPolicyUpdated(); 426 provider2_.UpdateChromePolicy(policy2_);
326 loop.RunAllPending(); 427 loop.RunAllPending();
327 Mock::VerifyAndClearExpectations(this); 428 Mock::VerifyAndClearExpectations(this);
328 429
329 // Providers 0 and 1 must reload again. 430 // Providers 0 and 1 must reload again.
330 EXPECT_CALL(*this, OnPolicyRefresh()).Times(2); 431 EXPECT_CALL(*this, OnPolicyRefresh()).Times(2);
331 base::FundamentalValue kValue2(2); 432 base::FundamentalValue kValue2(2);
332 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 433 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
333 kValue2.DeepCopy()); 434 kValue2.DeepCopy());
334 provider0_.NotifyPolicyUpdated(); 435 provider0_.UpdateChromePolicy(policy0_);
335 provider1_.NotifyPolicyUpdated(); 436 provider1_.UpdateChromePolicy(policy1_);
336 loop.RunAllPending(); 437 loop.RunAllPending();
337 Mock::VerifyAndClearExpectations(this); 438 Mock::VerifyAndClearExpectations(this);
338 439
339 const PolicyMap* policies = policy_service_->GetPolicies( 440 const PolicyMap& policies = policy_service_->GetPolicies(
340 POLICY_DOMAIN_CHROME, ""); 441 POLICY_DOMAIN_CHROME, "");
341 ASSERT_TRUE(policies); 442 EXPECT_TRUE(base::Value::Equals(&kValue2, policies.GetValue("aaa")));
342 EXPECT_TRUE(base::Value::Equals(&kValue2, policies->GetValue("aaa"))); 443 EXPECT_TRUE(base::Value::Equals(&kValue0, policies.GetValue("bbb")));
343 EXPECT_TRUE(base::Value::Equals(&kValue0, policies->GetValue("bbb"))); 444 }
445
446 TEST_F(PolicyServiceTest, NamespaceMerge) {
447 scoped_ptr<PolicyBundle> bundle0(new PolicyBundle());
448 scoped_ptr<PolicyBundle> bundle1(new PolicyBundle());
449 scoped_ptr<PolicyBundle> bundle2(new PolicyBundle());
450
451 AddTestPolicies(bundle0.get(), "bundle0",
452 POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER);
453 AddTestPolicies(bundle1.get(), "bundle1",
454 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER);
455 AddTestPolicies(bundle2.get(), "bundle2",
456 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE);
457
458 provider0_.UpdatePolicy(bundle0.Pass());
459 provider1_.UpdatePolicy(bundle1.Pass());
460 provider2_.UpdatePolicy(bundle2.Pass());
461
462 PolicyMap expected;
463 // For policies of the same level and scope, the first provider takes
464 // precedence, on every namespace.
465 expected.Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
466 base::Value::CreateStringValue("bundle0"));
467 // For policies with different levels and scopes, the highest priority
468 // level/scope combination takes precedence, on every namespace.
469 expected.Set(kDiffLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
470 base::Value::CreateStringValue("bundle2"));
471 EXPECT_TRUE(policy_service_->GetPolicies(POLICY_DOMAIN_CHROME, "")
472 .Equals(expected));
473 EXPECT_TRUE(policy_service_->GetPolicies(POLICY_DOMAIN_EXTENSIONS, kExtension)
474 .Equals(expected));
344 } 475 }
345 476
346 } // namespace policy 477 } // namespace policy
OLDNEW
« no previous file with comments | « chrome/browser/policy/policy_service_impl.cc ('k') | chrome/browser/policy/policy_service_stub.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698