OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "components/policy/core/common/cloud/component_cloud_policy_service.h" | 5 #include "components/policy/core/common/cloud/component_cloud_policy_service.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 core_.Connect(scoped_ptr<CloudPolicyClient>(client_)); | 158 core_.Connect(scoped_ptr<CloudPolicyClient>(client_)); |
159 | 159 |
160 // |expected_namespaces_in_client| is the expected number of components | 160 // |expected_namespaces_in_client| is the expected number of components |
161 // that the ComponentCloudPolicyService will set at the |client_| at | 161 // that the ComponentCloudPolicyService will set at the |client_| at |
162 // OnCoreConnected. | 162 // OnCoreConnected. |
163 EXPECT_EQ(expected_namespaces_in_client, | 163 EXPECT_EQ(expected_namespaces_in_client, |
164 client_->namespaces_to_fetch_.size()); | 164 client_->namespaces_to_fetch_.size()); |
165 | 165 |
166 // Also initialize the refresh scheduler, so that calls to | 166 // Also initialize the refresh scheduler, so that calls to |
167 // core()->RefreshSoon() trigger a FetchPolicy() call on the mock |client_|. | 167 // core()->RefreshSoon() trigger a FetchPolicy() call on the mock |client_|. |
| 168 // The |service_| should never trigger new fetches. |
168 EXPECT_CALL(*client_, FetchPolicy()); | 169 EXPECT_CALL(*client_, FetchPolicy()); |
169 core_.StartRefreshScheduler(); | 170 core_.StartRefreshScheduler(); |
170 RunUntilIdle(); | 171 RunUntilIdle(); |
171 Mock::VerifyAndClearExpectations(client_); | 172 Mock::VerifyAndClearExpectations(client_); |
172 } | 173 } |
173 | 174 |
174 void LoadStore() { | 175 void LoadStore() { |
175 EXPECT_FALSE(store_.is_initialized()); | 176 EXPECT_FALSE(store_.is_initialized()); |
176 | 177 |
177 em::PolicyData* data = new em::PolicyData(); | 178 em::PolicyData* data = new em::PolicyData(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 service_.reset(new ComponentCloudPolicyService(&delegate_, | 250 service_.reset(new ComponentCloudPolicyService(&delegate_, |
250 ®istry_, | 251 ®istry_, |
251 &core_, | 252 &core_, |
252 make_scoped_ptr(cache_), | 253 make_scoped_ptr(cache_), |
253 request_context_, | 254 request_context_, |
254 loop_.message_loop_proxy(), | 255 loop_.message_loop_proxy(), |
255 loop_.message_loop_proxy())); | 256 loop_.message_loop_proxy())); |
256 EXPECT_FALSE(service_->is_initialized()); | 257 EXPECT_FALSE(service_->is_initialized()); |
257 | 258 |
258 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 259 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
259 EXPECT_CALL(*client_, FetchPolicy()); | 260 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
260 RunUntilIdle(); | 261 RunUntilIdle(); |
261 Mock::VerifyAndClearExpectations(&client_); | 262 Mock::VerifyAndClearExpectations(&client_); |
262 Mock::VerifyAndClearExpectations(&delegate_); | 263 Mock::VerifyAndClearExpectations(&delegate_); |
263 | 264 |
264 EXPECT_TRUE(service_->is_initialized()); | 265 EXPECT_TRUE(service_->is_initialized()); |
265 EXPECT_EQ(2u, client_->namespaces_to_fetch_.size()); | 266 EXPECT_EQ(2u, client_->namespaces_to_fetch_.size()); |
266 const PolicyBundle empty_bundle; | 267 const PolicyBundle empty_bundle; |
267 EXPECT_TRUE(service_->policy().Equals(empty_bundle)); | 268 EXPECT_TRUE(service_->policy().Equals(empty_bundle)); |
268 } | 269 } |
269 | 270 |
270 TEST_F(ComponentCloudPolicyServiceTest, InitializeStoreThenRegistry) { | 271 TEST_F(ComponentCloudPolicyServiceTest, InitializeStoreThenRegistry) { |
271 Connect(1u); | 272 Connect(2u); |
272 | 273 |
273 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0); | 274 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0); |
274 EXPECT_CALL(*client_, FetchPolicy()).Times(0); | 275 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
275 LoadStore(); | 276 LoadStore(); |
276 Mock::VerifyAndClearExpectations(client_); | 277 Mock::VerifyAndClearExpectations(client_); |
277 Mock::VerifyAndClearExpectations(&delegate_); | 278 Mock::VerifyAndClearExpectations(&delegate_); |
278 EXPECT_FALSE(service_->is_initialized()); | 279 EXPECT_FALSE(service_->is_initialized()); |
279 | 280 |
280 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 281 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
281 EXPECT_CALL(*client_, FetchPolicy()); | 282 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
282 InitializeRegistry(); | 283 InitializeRegistry(); |
283 RunUntilIdle(); | 284 RunUntilIdle(); |
284 Mock::VerifyAndClearExpectations(client_); | 285 Mock::VerifyAndClearExpectations(client_); |
285 Mock::VerifyAndClearExpectations(&delegate_); | 286 Mock::VerifyAndClearExpectations(&delegate_); |
286 EXPECT_TRUE(service_->is_initialized()); | 287 EXPECT_TRUE(service_->is_initialized()); |
287 | 288 |
288 const PolicyBundle empty_bundle; | 289 const PolicyBundle empty_bundle; |
289 EXPECT_TRUE(service_->policy().Equals(empty_bundle)); | 290 EXPECT_TRUE(service_->policy().Equals(empty_bundle)); |
290 } | 291 } |
291 | 292 |
292 TEST_F(ComponentCloudPolicyServiceTest, InitializeRegistryThenStore) { | 293 TEST_F(ComponentCloudPolicyServiceTest, InitializeRegistryThenStore) { |
293 Connect(1u); | 294 Connect(2u); |
294 | 295 |
295 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0); | 296 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(0); |
296 EXPECT_CALL(*client_, FetchPolicy()).Times(0); | 297 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
297 InitializeRegistry(); | 298 InitializeRegistry(); |
298 RunUntilIdle(); | 299 RunUntilIdle(); |
299 Mock::VerifyAndClearExpectations(client_); | 300 Mock::VerifyAndClearExpectations(client_); |
300 Mock::VerifyAndClearExpectations(&delegate_); | 301 Mock::VerifyAndClearExpectations(&delegate_); |
301 EXPECT_FALSE(service_->is_initialized()); | 302 EXPECT_FALSE(service_->is_initialized()); |
302 | 303 |
303 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 304 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
304 EXPECT_CALL(*client_, FetchPolicy()); | 305 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
305 LoadStore(); | 306 LoadStore(); |
306 Mock::VerifyAndClearExpectations(client_); | 307 Mock::VerifyAndClearExpectations(client_); |
307 Mock::VerifyAndClearExpectations(&delegate_); | 308 Mock::VerifyAndClearExpectations(&delegate_); |
308 EXPECT_TRUE(service_->is_initialized()); | 309 EXPECT_TRUE(service_->is_initialized()); |
309 EXPECT_EQ(2u, client_->namespaces_to_fetch_.size()); | 310 EXPECT_EQ(2u, client_->namespaces_to_fetch_.size()); |
310 const PolicyBundle empty_bundle; | 311 const PolicyBundle empty_bundle; |
311 EXPECT_TRUE(service_->policy().Equals(empty_bundle)); | 312 EXPECT_TRUE(service_->policy().Equals(empty_bundle)); |
312 } | 313 } |
313 | 314 |
314 TEST_F(ComponentCloudPolicyServiceTest, InitializeWithCachedPolicy) { | 315 TEST_F(ComponentCloudPolicyServiceTest, InitializeWithCachedPolicy) { |
315 PopulateCache(); | 316 PopulateCache(); |
316 Connect(1u); | 317 Connect(2u); |
317 | 318 |
318 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 319 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
319 EXPECT_CALL(*client_, FetchPolicy()); | 320 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
320 InitializeRegistry(); | 321 InitializeRegistry(); |
321 LoadStore(); | 322 LoadStore(); |
322 Mock::VerifyAndClearExpectations(client_); | 323 Mock::VerifyAndClearExpectations(client_); |
323 Mock::VerifyAndClearExpectations(&delegate_); | 324 Mock::VerifyAndClearExpectations(&delegate_); |
324 | 325 |
325 EXPECT_TRUE(service_->is_initialized()); | 326 EXPECT_TRUE(service_->is_initialized()); |
326 EXPECT_EQ(2u, client_->namespaces_to_fetch_.size()); | 327 EXPECT_EQ(2u, client_->namespaces_to_fetch_.size()); |
327 | 328 |
328 // kTestExtension2 is not in the registry so it was dropped. | 329 // kTestExtension2 is not in the registry so it was dropped. |
329 std::map<std::string, std::string> contents; | 330 std::map<std::string, std::string> contents; |
330 cache_->LoadAllSubkeys("extension-policy", &contents); | 331 cache_->LoadAllSubkeys("extension-policy", &contents); |
331 ASSERT_EQ(1u, contents.size()); | 332 ASSERT_EQ(1u, contents.size()); |
332 EXPECT_EQ(kTestExtension, contents.begin()->first); | 333 EXPECT_EQ(kTestExtension, contents.begin()->first); |
333 | 334 |
334 PolicyBundle expected_bundle; | 335 PolicyBundle expected_bundle; |
335 const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); | 336 const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); |
336 expected_bundle.Get(ns).CopyFrom(expected_policy_); | 337 expected_bundle.Get(ns).CopyFrom(expected_policy_); |
337 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); | 338 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); |
338 } | 339 } |
339 | 340 |
340 TEST_F(ComponentCloudPolicyServiceTest, FetchPolicy) { | 341 TEST_F(ComponentCloudPolicyServiceTest, FetchPolicy) { |
341 Connect(1u); | 342 Connect(2u); |
342 // Initialize the store and create the backend. | 343 // Initialize the store and create the backend. |
343 // A refresh is not needed, because no components are registered yet. | 344 // A refresh is not needed, because no components are registered yet. |
344 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 345 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
345 EXPECT_CALL(*client_, FetchPolicy()).Times(0); | 346 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
346 registry_.SetReady(POLICY_DOMAIN_CHROME); | 347 registry_.SetReady(POLICY_DOMAIN_CHROME); |
347 registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); | 348 registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); |
348 LoadStore(); | 349 LoadStore(); |
349 Mock::VerifyAndClearExpectations(client_); | 350 Mock::VerifyAndClearExpectations(client_); |
350 Mock::VerifyAndClearExpectations(&delegate_); | 351 Mock::VerifyAndClearExpectations(&delegate_); |
351 EXPECT_TRUE(service_->is_initialized()); | 352 EXPECT_TRUE(service_->is_initialized()); |
352 | 353 |
353 // Register the components to fetch. | 354 // Register the components to fetch. The |service_| issues a new update |
354 EXPECT_CALL(*client_, FetchPolicy()); | 355 // because the new schema may filter different policies from the store. |
| 356 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
| 357 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
355 registry_.RegisterComponent( | 358 registry_.RegisterComponent( |
356 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension), | 359 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension), |
357 CreateTestSchema()); | 360 CreateTestSchema()); |
358 RunUntilIdle(); | 361 RunUntilIdle(); |
359 Mock::VerifyAndClearExpectations(client_); | 362 Mock::VerifyAndClearExpectations(client_); |
| 363 Mock::VerifyAndClearExpectations(&delegate_); |
360 | 364 |
361 // Send back a fake policy fetch response. | 365 // Send back a fake policy fetch response. |
362 client_->SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType, | 366 client_->SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType, |
363 kTestExtension), | 367 kTestExtension), |
364 *CreateResponse()); | 368 *CreateResponse()); |
365 service_->OnPolicyFetched(client_); | 369 service_->OnPolicyFetched(client_); |
366 RunUntilIdle(); | 370 RunUntilIdle(); |
367 | 371 |
368 // That should have triggered the download fetch. | 372 // That should have triggered the download fetch. |
369 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | 373 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
370 ASSERT_TRUE(fetcher); | 374 ASSERT_TRUE(fetcher); |
371 EXPECT_EQ(GURL(kTestDownload), fetcher->GetOriginalURL()); | 375 EXPECT_EQ(GURL(kTestDownload), fetcher->GetOriginalURL()); |
372 fetcher->set_response_code(200); | 376 fetcher->set_response_code(200); |
373 fetcher->SetResponseString(kTestPolicy); | 377 fetcher->SetResponseString(kTestPolicy); |
374 fetcher->delegate()->OnURLFetchComplete(fetcher); | 378 fetcher->delegate()->OnURLFetchComplete(fetcher); |
375 | 379 |
376 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 380 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
377 RunUntilIdle(); | 381 RunUntilIdle(); |
378 Mock::VerifyAndClearExpectations(&delegate_); | 382 Mock::VerifyAndClearExpectations(&delegate_); |
379 | 383 |
380 // The policy is now being served. | 384 // The policy is now being served. |
381 const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); | 385 const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); |
382 PolicyBundle expected_bundle; | 386 PolicyBundle expected_bundle; |
383 expected_bundle.Get(ns).CopyFrom(expected_policy_); | 387 expected_bundle.Get(ns).CopyFrom(expected_policy_); |
384 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); | 388 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); |
385 } | 389 } |
386 | 390 |
387 TEST_F(ComponentCloudPolicyServiceTest, LoadAndPurgeCache) { | 391 TEST_F(ComponentCloudPolicyServiceTest, LoadAndPurgeCache) { |
388 Connect(1u); | 392 Connect(2u); |
389 // Insert data in the cache. | 393 // Insert data in the cache. |
390 PopulateCache(); | 394 PopulateCache(); |
391 registry_.RegisterComponent( | 395 registry_.RegisterComponent( |
392 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension2), | 396 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension2), |
393 CreateTestSchema()); | 397 CreateTestSchema()); |
394 InitializeRegistry(); | 398 InitializeRegistry(); |
395 | 399 |
396 // Load the initial cache. | 400 // Load the initial cache. |
397 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 401 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
398 EXPECT_CALL(*client_, FetchPolicy()); | 402 EXPECT_CALL(*client_, FetchPolicy()).Times(0); |
399 LoadStore(); | 403 LoadStore(); |
400 Mock::VerifyAndClearExpectations(client_); | 404 Mock::VerifyAndClearExpectations(client_); |
401 Mock::VerifyAndClearExpectations(&delegate_); | 405 Mock::VerifyAndClearExpectations(&delegate_); |
402 | 406 |
403 PolicyBundle expected_bundle; | 407 PolicyBundle expected_bundle; |
404 PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); | 408 PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); |
405 expected_bundle.Get(ns).CopyFrom(expected_policy_); | 409 expected_bundle.Get(ns).CopyFrom(expected_policy_); |
406 ns.component_id = kTestExtension2; | 410 ns.component_id = kTestExtension2; |
407 expected_bundle.Get(ns).CopyFrom(expected_policy_); | 411 expected_bundle.Get(ns).CopyFrom(expected_policy_); |
408 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); | 412 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); |
409 | 413 |
410 // Now purge one of the extensions. | 414 // Now purge one of the extensions. This generates 2 notifications: one for |
411 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 415 // the new, immediate filtering, and another once the backend comes back |
| 416 // after purging the cache. |
| 417 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()).Times(2); |
412 registry_.UnregisterComponent( | 418 registry_.UnregisterComponent( |
413 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension)); | 419 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension)); |
414 RunUntilIdle(); | 420 RunUntilIdle(); |
415 Mock::VerifyAndClearExpectations(&delegate_); | 421 Mock::VerifyAndClearExpectations(&delegate_); |
416 | 422 |
417 ns.component_id = kTestExtension; | 423 ns.component_id = kTestExtension; |
418 expected_bundle.Get(ns).Clear(); | 424 expected_bundle.Get(ns).Clear(); |
419 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); | 425 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); |
420 | 426 |
421 std::map<std::string, std::string> contents; | 427 std::map<std::string, std::string> contents; |
422 cache_->LoadAllSubkeys("extension-policy", &contents); | 428 cache_->LoadAllSubkeys("extension-policy", &contents); |
423 EXPECT_EQ(1u, contents.size()); | 429 EXPECT_EQ(1u, contents.size()); |
424 EXPECT_TRUE(ContainsKey(contents, kTestExtension2)); | 430 EXPECT_TRUE(ContainsKey(contents, kTestExtension2)); |
425 } | 431 } |
426 | 432 |
427 TEST_F(ComponentCloudPolicyServiceTest, SignInAfterStartup) { | 433 TEST_F(ComponentCloudPolicyServiceTest, SignInAfterStartup) { |
428 registry_.SetReady(POLICY_DOMAIN_CHROME); | 434 registry_.SetReady(POLICY_DOMAIN_CHROME); |
429 registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); | 435 registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); |
430 | 436 |
431 // Initialize the store without credentials. | 437 // Initialize the store without credentials. |
432 EXPECT_FALSE(store_.is_initialized()); | 438 EXPECT_FALSE(store_.is_initialized()); |
433 EXPECT_FALSE(service_->is_initialized()); | 439 EXPECT_FALSE(service_->is_initialized()); |
434 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); | 440 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
435 store_.NotifyStoreLoaded(); | 441 store_.NotifyStoreLoaded(); |
436 RunUntilIdle(); | 442 RunUntilIdle(); |
437 Mock::VerifyAndClearExpectations(&delegate_); | 443 Mock::VerifyAndClearExpectations(&delegate_); |
438 EXPECT_TRUE(service_->is_initialized()); | 444 EXPECT_TRUE(service_->is_initialized()); |
439 | 445 |
440 // Register an extension. | 446 // Register an extension. |
| 447 EXPECT_CALL(delegate_, OnComponentCloudPolicyUpdated()); |
441 registry_.RegisterComponent( | 448 registry_.RegisterComponent( |
442 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension), | 449 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kTestExtension), |
443 CreateTestSchema()); | 450 CreateTestSchema()); |
444 RunUntilIdle(); | 451 RunUntilIdle(); |
| 452 Mock::VerifyAndClearExpectations(&delegate_); |
445 | 453 |
446 // Now signin. A fetch will be requested for the new extension. | 454 // Now signin. A fetch will be requested for the new extension. |
447 Connect(2u); | 455 Connect(2u); |
448 | 456 |
449 // Send the response to the service. The response data will be ignored, | 457 // Send the response to the service. The response data will be ignored, |
450 // because the store doesn't have the updated credentials yet. | 458 // because the store doesn't have the updated credentials yet. |
451 client_->SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType, | 459 client_->SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeExtensionPolicyType, |
452 kTestExtension), | 460 kTestExtension), |
453 *CreateResponse()); | 461 *CreateResponse()); |
454 service_->OnPolicyFetched(client_); | 462 service_->OnPolicyFetched(client_); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 | 550 |
543 PolicyBundle expected_bundle; | 551 PolicyBundle expected_bundle; |
544 const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); | 552 const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, kTestExtension); |
545 expected_bundle.Get(ns).Set("Name", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 553 expected_bundle.Get(ns).Set("Name", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
546 base::Value::CreateStringValue("published"), | 554 base::Value::CreateStringValue("published"), |
547 NULL); | 555 NULL); |
548 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); | 556 EXPECT_TRUE(service_->policy().Equals(expected_bundle)); |
549 } | 557 } |
550 | 558 |
551 } // namespace policy | 559 } // namespace policy |
OLD | NEW |