device_cloud_policy_invalidator_unittest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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 "chrome/browser/chromeos/policy/device_cloud_policy_invalidator.h" 6 7#include <string> 8 9#include "base/memory/ref_counted.h" 10#include "base/message_loop/message_loop_proxy.h" 11#include "base/run_loop.h" 12#include "chrome/browser/browser_process_platform_part.h" 13#include "chrome/browser/chrome_notification_types.h" 14#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 15#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" 16#include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h" 17#include "chrome/browser/chromeos/policy/device_policy_builder.h" 18#include "chrome/browser/chromeos/policy/stub_enterprise_install_attributes.h" 19#include "chrome/browser/chromeos/settings/cros_settings.h" 20#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h" 21#include "chrome/browser/chromeos/settings/device_settings_service.h" 22#include "chrome/browser/chromeos/settings/device_settings_test_helper.h" 23#include "chrome/browser/chromeos/settings/mock_owner_key_util.h" 24#include "chrome/browser/invalidation/fake_invalidation_service.h" 25#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" 26#include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" 27#include "chrome/browser/profiles/profile.h" 28#include "chrome/test/base/testing_browser_process.h" 29#include "chrome/test/base/testing_profile_manager.h" 30#include "chromeos/cryptohome/system_salt_getter.h" 31#include "chromeos/dbus/dbus_thread_manager.h" 32#include "components/invalidation/invalidation_service.h" 33#include "components/invalidation/invalidator_state.h" 34#include "components/invalidation/profile_invalidation_provider.h" 35#include "components/invalidation/ticl_invalidation_service.h" 36#include "components/keyed_service/core/keyed_service.h" 37#include "components/policy/core/common/cloud/cloud_policy_client.h" 38#include "components/policy/core/common/cloud/cloud_policy_constants.h" 39#include "components/policy/core/common/cloud/cloud_policy_core.h" 40#include "components/policy/core/common/cloud/mock_cloud_policy_client.h" 41#include "content/public/browser/browser_context.h" 42#include "content/public/browser/notification_details.h" 43#include "content/public/browser/notification_service.h" 44#include "content/public/test/test_browser_thread_bundle.h" 45#include "net/url_request/url_request_context_getter.h" 46#include "net/url_request/url_request_test_util.h" 47#include "policy/proto/device_management_backend.pb.h" 48#include "testing/gmock/include/gmock/gmock.h" 49#include "testing/gtest/include/gtest/gtest.h" 50 51namespace policy { 52 53namespace { 54 55KeyedService* BuildProfileInvalidationProvider( 56 content::BrowserContext* context) { 57 scoped_ptr<invalidation::FakeInvalidationService> invalidation_service( 58 new invalidation::FakeInvalidationService); 59 invalidation_service->SetInvalidatorState( 60 syncer::TRANSIENT_INVALIDATION_ERROR); 61 return new invalidation::ProfileInvalidationProvider( 62 invalidation_service.PassAs<invalidation::InvalidationService>()); 63} 64 65} // namespace 66 67class DeviceCloudPolicyInvalidatorTest : public testing::Test { 68 public: 69 DeviceCloudPolicyInvalidatorTest(); 70 virtual ~DeviceCloudPolicyInvalidatorTest(); 71 72 // testing::Test: 73 virtual void SetUp() OVERRIDE; 74 virtual void TearDown() OVERRIDE; 75 76 // Ownership is not passed. The Profile is owned by the global ProfileManager. 77 Profile *CreateProfile(const std::string& profile_name); 78 79 invalidation::TiclInvalidationService* GetDeviceInvalidationService(); 80 bool HasDeviceInvalidationServiceObserver() const; 81 82 invalidation::FakeInvalidationService* GetProfileInvalidationService( 83 Profile* profile); 84 int GetProfileInvalidationServiceObserverCount() const; 85 86 const invalidation::InvalidationService* GetInvalidationService() const; 87 CloudPolicyInvalidator* GetCloudPolicyInvalidator() const; 88 89 void ConnectDeviceInvalidationService(); 90 91 protected: 92 DevicePolicyBuilder device_policy_; 93 94 private: 95 content::TestBrowserThreadBundle thread_bundle_; 96 scoped_refptr<net::URLRequestContextGetter> system_request_context_; 97 TestingProfileManager profile_manager_; 98 ScopedStubEnterpriseInstallAttributes install_attributes_; 99 scoped_ptr<chromeos::ScopedTestDeviceSettingsService> 100 test_device_settings_service_; 101 scoped_ptr<chromeos::ScopedTestCrosSettings> test_cros_settings_; 102 chromeos::DeviceSettingsTestHelper device_settings_test_helper_; 103 104 scoped_ptr<DeviceCloudPolicyInvalidator> invalidator_; 105}; 106 107DeviceCloudPolicyInvalidatorTest::DeviceCloudPolicyInvalidatorTest() 108 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), 109 system_request_context_(new net::TestURLRequestContextGetter( 110 base::MessageLoopProxy::current())), 111 profile_manager_(TestingBrowserProcess::GetGlobal()), 112 install_attributes_("example.com", 113 "user@example.com", 114 "device_id", 115 DEVICE_MODE_ENTERPRISE) { 116} 117 118DeviceCloudPolicyInvalidatorTest::~DeviceCloudPolicyInvalidatorTest() { 119} 120 121void DeviceCloudPolicyInvalidatorTest::SetUp() { 122 chromeos::SystemSaltGetter::Initialize(); 123 chromeos::DBusThreadManager::InitializeWithStub(); 124 chromeos::DeviceOAuth2TokenServiceFactory::Initialize(); 125 TestingBrowserProcess::GetGlobal()->SetSystemRequestContext( 126 system_request_context_.get()); 127 ASSERT_TRUE(profile_manager_.SetUp()); 128 129 test_device_settings_service_.reset(new 130 chromeos::ScopedTestDeviceSettingsService); 131 test_cros_settings_.reset(new chromeos::ScopedTestCrosSettings); 132 scoped_refptr<chromeos::MockOwnerKeyUtil> owner_key_util( 133 new chromeos::MockOwnerKeyUtil); 134 owner_key_util->SetPublicKeyFromPrivateKey( 135 *device_policy_.GetSigningKey()); 136 chromeos::DeviceSettingsService::Get()->SetSessionManager( 137 &device_settings_test_helper_, 138 owner_key_util); 139 140 device_policy_.policy_data().set_invalidation_source(123); 141 device_policy_.policy_data().set_invalidation_name("invalidation"); 142 device_policy_.Build(); 143 device_settings_test_helper_.set_policy_blob(device_policy_.GetBlob()); 144 device_settings_test_helper_.Flush(); 145 146 scoped_ptr<MockCloudPolicyClient> policy_client(new MockCloudPolicyClient); 147 EXPECT_CALL(*policy_client, SetupRegistration("token", "device-id")); 148 CloudPolicyCore* core = TestingBrowserProcess::GetGlobal()->platform_part()-> 149 browser_policy_connector_chromeos()->GetDeviceCloudPolicyManager()-> 150 core(); 151 core->Connect(policy_client.PassAs<CloudPolicyClient>()); 152 core->StartRefreshScheduler(); 153 154 invalidation::ProfileInvalidationProviderFactory::GetInstance()-> 155 RegisterTestingFactory(BuildProfileInvalidationProvider); 156 157 invalidator_.reset(new DeviceCloudPolicyInvalidator); 158} 159 160void DeviceCloudPolicyInvalidatorTest::TearDown() { 161 invalidator_.reset(); 162 base::RunLoop().RunUntilIdle(); 163 164 invalidation::ProfileInvalidationProviderFactory::GetInstance()-> 165 RegisterTestingFactory(NULL); 166 chromeos::DeviceSettingsService::Get()->UnsetSessionManager(); 167 TestingBrowserProcess::GetGlobal()->SetBrowserPolicyConnector(NULL); 168 chromeos::DeviceOAuth2TokenServiceFactory::Shutdown(); 169 chromeos::DBusThreadManager::Shutdown(); 170 chromeos::SystemSaltGetter::Shutdown(); 171} 172 173Profile *DeviceCloudPolicyInvalidatorTest::CreateProfile( 174 const std::string& profile_name) { 175 Profile* profile = profile_manager_.CreateTestingProfile(profile_name); 176 content::NotificationService::current()->Notify( 177 chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, 178 content::NotificationService::AllSources(), 179 content::Details<Profile>(profile)); 180 return profile; 181} 182 183invalidation::TiclInvalidationService* 184DeviceCloudPolicyInvalidatorTest::GetDeviceInvalidationService() { 185 return invalidator_->device_invalidation_service_.get(); 186} 187 188bool DeviceCloudPolicyInvalidatorTest::HasDeviceInvalidationServiceObserver( 189 ) const { 190 return invalidator_->device_invalidation_service_observer_.get(); 191} 192 193invalidation::FakeInvalidationService* 194DeviceCloudPolicyInvalidatorTest::GetProfileInvalidationService( 195 Profile* profile) { 196 invalidation::ProfileInvalidationProvider* invalidation_provider = 197 static_cast<invalidation::ProfileInvalidationProvider*>( 198 invalidation::ProfileInvalidationProviderFactory::GetInstance()-> 199 GetServiceForBrowserContext(profile, false)); 200 if (!invalidation_provider) 201 return NULL; 202 return static_cast<invalidation::FakeInvalidationService*>( 203 invalidation_provider->GetInvalidationService()); 204} 205 206int DeviceCloudPolicyInvalidatorTest:: 207 GetProfileInvalidationServiceObserverCount() const { 208 return invalidator_->profile_invalidation_service_observers_.size(); 209} 210 211const invalidation::InvalidationService* 212DeviceCloudPolicyInvalidatorTest::GetInvalidationService() const { 213 return invalidator_->invalidation_service_; 214} 215 216CloudPolicyInvalidator* 217DeviceCloudPolicyInvalidatorTest::GetCloudPolicyInvalidator() const { 218 return invalidator_->invalidator_.get(); 219} 220 221void DeviceCloudPolicyInvalidatorTest::ConnectDeviceInvalidationService() { 222 // Verify that a device-global invalidation service has been created. 223 ASSERT_TRUE(GetDeviceInvalidationService()); 224 EXPECT_TRUE(HasDeviceInvalidationServiceObserver()); 225 226 // Verify that no per-profile invalidation service observers have been 227 // created. 228 EXPECT_EQ(0, GetProfileInvalidationServiceObserverCount()); 229 230 // Verify that no invalidator exists yet 231 EXPECT_FALSE(GetCloudPolicyInvalidator()); 232 EXPECT_FALSE(GetInvalidationService()); 233 234 // Indicate that the device-global invalidation service has connected. 235 GetDeviceInvalidationService()->OnInvalidatorStateChange( 236 syncer::INVALIDATIONS_ENABLED); 237 base::RunLoop().RunUntilIdle(); 238 239 // Verify that the device-global invalidation service still exists. 240 EXPECT_TRUE(GetDeviceInvalidationService()); 241 EXPECT_TRUE(HasDeviceInvalidationServiceObserver()); 242 243 // Verify that an invalidator backed by the device-global invalidation service 244 // has been created. 245 EXPECT_TRUE(GetCloudPolicyInvalidator()); 246 EXPECT_EQ(GetDeviceInvalidationService(), GetInvalidationService()); 247} 248 249// Verifies that a DeviceCloudPolicyInvalidator backed by a device-global 250// invalidation service is created/destroyed as the service 251// connects/disconnects. 252TEST_F(DeviceCloudPolicyInvalidatorTest, UseDeviceInvalidationService) { 253 // Verify that an invalidator backed by the device-global invalidation service 254 // is created when the service connects. 255 ConnectDeviceInvalidationService(); 256 ASSERT_TRUE(GetDeviceInvalidationService()); 257 258 // Indicate that the device-global invalidation service has disconnected. 259 GetDeviceInvalidationService()->OnInvalidatorStateChange( 260 syncer::INVALIDATION_CREDENTIALS_REJECTED); 261 base::RunLoop().RunUntilIdle(); 262 263 // Verify that the device-global invalidation service still exists. 264 EXPECT_TRUE(GetDeviceInvalidationService()); 265 EXPECT_TRUE(HasDeviceInvalidationServiceObserver()); 266 267 // Verify that the invalidator has been destroyed. 268 EXPECT_FALSE(GetCloudPolicyInvalidator()); 269 EXPECT_FALSE(GetInvalidationService()); 270} 271 272// Verifies that a DeviceCloudPolicyInvalidator backed by a per-profile 273// invalidation service is created/destroyed as the service 274// connects/disconnects. 275TEST_F(DeviceCloudPolicyInvalidatorTest, UseProfileInvalidationService) { 276 // Create a user profile. 277 Profile* profile = CreateProfile("test"); 278 ASSERT_TRUE(profile); 279 280 // Verify that a device-global invalidation service has been created. 281 EXPECT_TRUE(GetDeviceInvalidationService()); 282 EXPECT_TRUE(HasDeviceInvalidationServiceObserver()); 283 284 // Verify that a per-profile invalidation service has been created. 285 invalidation::FakeInvalidationService* profile_invalidation_service = 286 GetProfileInvalidationService(profile); 287 ASSERT_TRUE(profile_invalidation_service); 288 EXPECT_EQ(1, GetProfileInvalidationServiceObserverCount()); 289 290 // Verify that no invalidator exists yet 291 EXPECT_FALSE(GetCloudPolicyInvalidator()); 292 EXPECT_FALSE(GetInvalidationService()); 293 294 // Indicate that the per-profile invalidation service has connected. 295 profile_invalidation_service->SetInvalidatorState( 296 syncer::INVALIDATIONS_ENABLED); 297 298 // Verify that the device-global invalidator has been destroyed. 299 EXPECT_FALSE(GetDeviceInvalidationService()); 300 EXPECT_FALSE(HasDeviceInvalidationServiceObserver()); 301 302 // Verify that a per-profile invalidation service still exists. 303 profile_invalidation_service = GetProfileInvalidationService(profile); 304 ASSERT_TRUE(profile_invalidation_service); 305 EXPECT_EQ(1, GetProfileInvalidationServiceObserverCount()); 306 307 // Verify that an invalidator backed by the per-profile invalidation service 308 // has been created. 309 EXPECT_TRUE(GetCloudPolicyInvalidator()); 310 EXPECT_EQ(profile_invalidation_service, GetInvalidationService()); 311 312 // Indicate that the per-profile invalidation service has disconnected. 313 profile_invalidation_service->SetInvalidatorState( 314 syncer::INVALIDATION_CREDENTIALS_REJECTED); 315 316 // Verify that a device-global invalidation service has been created. 317 EXPECT_TRUE(GetDeviceInvalidationService()); 318 EXPECT_TRUE(HasDeviceInvalidationServiceObserver()); 319 320 // Verify that a per-profile invalidation service still exists. 321 profile_invalidation_service = GetProfileInvalidationService(profile); 322 EXPECT_TRUE(profile_invalidation_service); 323 EXPECT_EQ(1, GetProfileInvalidationServiceObserverCount()); 324 325 // Verify that the invalidator has been destroyed. 326 EXPECT_FALSE(GetCloudPolicyInvalidator()); 327 EXPECT_FALSE(GetInvalidationService()); 328} 329 330// Verifies that a DeviceCloudPolicyInvalidator exists whenever a connected 331// invalidation service is available, automatically switching between 332// device-global and per-profile invalidation services as they 333// connect/disconnect, giving priority to per-profile invalidation services. 334// Also verifies that the highest handled invalidation version is preserved when 335// switching invalidation services. 336TEST_F(DeviceCloudPolicyInvalidatorTest, SwitchInvalidationServices) { 337 CloudPolicyStore* store = static_cast<CloudPolicyStore*>( 338 TestingBrowserProcess::GetGlobal()->platform_part()-> 339 browser_policy_connector_chromeos()->GetDeviceCloudPolicyManager()-> 340 device_store()); 341 ASSERT_TRUE(store); 342 343 // Verify that an invalidator backed by the device-global invalidation service 344 // is created when the service connects. 345 ConnectDeviceInvalidationService(); 346 CloudPolicyInvalidator* invalidator = GetCloudPolicyInvalidator(); 347 ASSERT_TRUE(invalidator); 348 ASSERT_TRUE(GetDeviceInvalidationService()); 349 350 // Verify that the invalidator's highest handled invalidation version starts 351 // out as zero. 352 EXPECT_EQ(0, invalidator->highest_handled_invalidation_version()); 353 354 // Create a first user profile. 355 Profile* profile_1 = CreateProfile("test_1"); 356 ASSERT_TRUE(profile_1); 357 358 // Verify that the device-global invalidation service still exists. 359 EXPECT_TRUE(GetDeviceInvalidationService()); 360 EXPECT_TRUE(HasDeviceInvalidationServiceObserver()); 361 362 // Verify that a per-profile invalidation service has been created for the 363 // first user profile. 364 invalidation::FakeInvalidationService* profile_1_invalidation_service = 365 GetProfileInvalidationService(profile_1); 366 ASSERT_TRUE(profile_1_invalidation_service); 367 EXPECT_EQ(1, GetProfileInvalidationServiceObserverCount()); 368 369 // Verify that an invalidator backed by the device-global invalidation service 370 // still exists. 371 EXPECT_TRUE(GetCloudPolicyInvalidator()); 372 EXPECT_EQ(GetDeviceInvalidationService(), GetInvalidationService()); 373 374 // Indicate that the first user profile's per-profile invalidation service has 375 // connected. 376 profile_1_invalidation_service->SetInvalidatorState( 377 syncer::INVALIDATIONS_ENABLED); 378 379 // Verify that the device-global invalidator has been destroyed. 380 EXPECT_FALSE(GetDeviceInvalidationService()); 381 EXPECT_FALSE(HasDeviceInvalidationServiceObserver()); 382 383 // Verify that a per-profile invalidation service still exists for the first 384 // user profile. 385 profile_1_invalidation_service = GetProfileInvalidationService(profile_1); 386 EXPECT_TRUE(profile_1_invalidation_service); 387 EXPECT_EQ(1, GetProfileInvalidationServiceObserverCount()); 388 389 // Verify that an invalidator backed by the per-profile invalidation service 390 // for the first user profile has been created. 391 invalidator = GetCloudPolicyInvalidator(); 392 ASSERT_TRUE(invalidator); 393 EXPECT_EQ(profile_1_invalidation_service, GetInvalidationService()); 394 395 // Verify that the invalidator's highest handled invalidation version starts 396 // out as zero. 397 EXPECT_EQ(0, invalidator->highest_handled_invalidation_version()); 398 399 // Handle an invalidation with version 1. Verify that the invalidator's 400 // highest handled invalidation version is updated accordingly. 401 store->Store(device_policy_.policy(), 1); 402 invalidator->OnStoreLoaded(store); 403 EXPECT_EQ(1, invalidator->highest_handled_invalidation_version()); 404 405 // Create a second user profile. 406 Profile* profile_2 = CreateProfile("test_2"); 407 ASSERT_TRUE(profile_2); 408 409 // Verify that the device-global invalidator still does not exist. 410 EXPECT_FALSE(GetDeviceInvalidationService()); 411 EXPECT_FALSE(HasDeviceInvalidationServiceObserver()); 412 413 // Verify that a per-profile invalidation service still exists for the first 414 // user profile and one has been created for the second user profile. 415 profile_1_invalidation_service = GetProfileInvalidationService(profile_1); 416 EXPECT_TRUE(profile_1_invalidation_service); 417 invalidation::FakeInvalidationService* profile_2_invalidation_service = 418 GetProfileInvalidationService(profile_2); 419 ASSERT_TRUE(profile_2_invalidation_service); 420 EXPECT_EQ(2, GetProfileInvalidationServiceObserverCount()); 421 422 // Verify that an invalidator backed by the per-profile invalidation service 423 // for the first user profile still exists. 424 EXPECT_TRUE(GetCloudPolicyInvalidator()); 425 EXPECT_EQ(profile_1_invalidation_service, GetInvalidationService()); 426 427 // Indicate that the second user profile's per-profile invalidation service 428 // has connected. 429 profile_2_invalidation_service->SetInvalidatorState( 430 syncer::INVALIDATIONS_ENABLED); 431 432 // Verify that the device-global invalidator still does not exist. 433 EXPECT_FALSE(GetDeviceInvalidationService()); 434 EXPECT_FALSE(HasDeviceInvalidationServiceObserver()); 435 436 // Verify that per-profile invalidation services still exist for both user 437 // profiles. 438 profile_1_invalidation_service = GetProfileInvalidationService(profile_1); 439 ASSERT_TRUE(profile_1_invalidation_service); 440 profile_2_invalidation_service = GetProfileInvalidationService(profile_2); 441 EXPECT_TRUE(profile_2_invalidation_service); 442 EXPECT_EQ(2, GetProfileInvalidationServiceObserverCount()); 443 444 // Verify that an invalidator backed by the per-profile invalidation service 445 // for the first user profile still exists. 446 EXPECT_TRUE(GetCloudPolicyInvalidator()); 447 EXPECT_EQ(profile_1_invalidation_service, GetInvalidationService()); 448 449 // Indicate that the per-profile invalidation service for the first user 450 // profile has disconnected. 451 profile_1_invalidation_service->SetInvalidatorState( 452 syncer::INVALIDATION_CREDENTIALS_REJECTED); 453 454 // Verify that the device-global invalidator still does not exist. 455 EXPECT_FALSE(GetDeviceInvalidationService()); 456 EXPECT_FALSE(HasDeviceInvalidationServiceObserver()); 457 458 // Verify that per-profile invalidation services still exist for both user 459 // profiles. 460 profile_1_invalidation_service = GetProfileInvalidationService(profile_1); 461 EXPECT_TRUE(profile_1_invalidation_service); 462 profile_2_invalidation_service = GetProfileInvalidationService(profile_2); 463 ASSERT_TRUE(profile_2_invalidation_service); 464 EXPECT_EQ(2, GetProfileInvalidationServiceObserverCount()); 465 466 // Verify that an invalidator backed by the per-profile invalidation service 467 // for the second user profile has been created. 468 invalidator = GetCloudPolicyInvalidator(); 469 ASSERT_TRUE(invalidator); 470 EXPECT_EQ(profile_2_invalidation_service, GetInvalidationService()); 471 472 // Verify that the invalidator's highest handled invalidation version starts 473 // out as 1. 474 EXPECT_EQ(1, invalidator->highest_handled_invalidation_version()); 475 476 // Handle an invalidation with version 2. Verify that the invalidator's 477 // highest handled invalidation version is updated accordingly. 478 store->Store(device_policy_.policy(), 2); 479 invalidator->OnStoreLoaded(store); 480 EXPECT_EQ(2, invalidator->highest_handled_invalidation_version()); 481 482 // Indicate that the per-profile invalidation service for the second user 483 // profile has disconnected. 484 profile_2_invalidation_service->SetInvalidatorState( 485 syncer::INVALIDATION_CREDENTIALS_REJECTED); 486 487 // Verify that a device-global invalidation service has been created. 488 ASSERT_TRUE(GetDeviceInvalidationService()); 489 EXPECT_TRUE(HasDeviceInvalidationServiceObserver()); 490 491 // Verify that per-profile invalidation services still exist for both user 492 // profiles. 493 profile_1_invalidation_service = GetProfileInvalidationService(profile_1); 494 EXPECT_TRUE(profile_1_invalidation_service); 495 profile_2_invalidation_service = GetProfileInvalidationService(profile_2); 496 EXPECT_TRUE(profile_2_invalidation_service); 497 EXPECT_EQ(2, GetProfileInvalidationServiceObserverCount()); 498 499 // Verify that the invalidator has been destroyed. 500 EXPECT_FALSE(GetCloudPolicyInvalidator()); 501 EXPECT_FALSE(GetInvalidationService()); 502 503 // Indicate that the device-global invalidation service has connected. 504 GetDeviceInvalidationService()->OnInvalidatorStateChange( 505 syncer::INVALIDATIONS_ENABLED); 506 base::RunLoop().RunUntilIdle(); 507 508 // Verify that the device-global invalidation service still exists. 509 EXPECT_TRUE(GetDeviceInvalidationService()); 510 EXPECT_TRUE(HasDeviceInvalidationServiceObserver()); 511 512 // Verify that per-profile invalidation services still exist for both user 513 // profiles. 514 profile_1_invalidation_service = GetProfileInvalidationService(profile_1); 515 EXPECT_TRUE(profile_1_invalidation_service); 516 profile_2_invalidation_service = GetProfileInvalidationService(profile_2); 517 EXPECT_TRUE(profile_2_invalidation_service); 518 EXPECT_EQ(2, GetProfileInvalidationServiceObserverCount()); 519 520 // Verify that an invalidator backed by the device-global invalidation service 521 // has been created. 522 invalidator = GetCloudPolicyInvalidator(); 523 ASSERT_TRUE(invalidator); 524 EXPECT_EQ(GetDeviceInvalidationService(), GetInvalidationService()); 525 526 // Verify that the invalidator's highest handled invalidation version starts 527 // out as 2. 528 EXPECT_EQ(2, invalidator->highest_handled_invalidation_version()); 529} 530 531} // namespace policy 532