user_cloud_policy_manager_chromeos_unittest.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind_helpers.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/run_loop.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/sequenced_task_runner.h" 155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/test/test_simple_task_runner.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/prefs/pref_service_syncable.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_constants.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/testing_profile.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h" 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_external_data_manager.h" 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/mock_cloud_external_data_manager.h" 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/mock_cloud_policy_store.h" 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/mock_device_management_service.h" 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h" 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/mock_configuration_policy_provider.h" 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema_registry.h" 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h" 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/url_request_status.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "policy/policy_constants.h" 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/device_management_backend.pb.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace em = enterprise_management; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtLeast; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Mock; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy { 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kOAuthTokenCookie[] = "oauth_token=1234"; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kOAuth2TokenPairData[] = 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{" 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"refresh_token\": \"1234\"," 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"access_token\": \"5678\"," 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"expires_in\": 3600" 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "}"; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kOAuth2AccessTokenData[] = 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{" 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"access_token\": \"5678\"," 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"expires_in\": 3600" 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "}"; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UserCloudPolicyManagerChromeOSTest : public testing::Test { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserCloudPolicyManagerChromeOSTest() 83a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch : store_(NULL), 84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) external_data_manager_(NULL), 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) task_runner_(new base::TestSimpleTaskRunner()), 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_(NULL), 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_profile_(NULL) {} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The initialization path that blocks on the initial policy fetch requires 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a signin Profile to use its URLRequestContext. 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_manager_.reset( 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestingProfileManager(TestingBrowserProcess::GetGlobal())); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(profile_manager_->SetUp()); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile::TestingFactories factories; 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factories.push_back( 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::make_pair(ProfileOAuth2TokenServiceFactory::GetInstance(), 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch BuildFakeProfileOAuth2TokenService)); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_ = profile_manager_->CreateTestingProfile( 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::kInitialProfile, scoped_ptr<PrefServiceSyncable>(), 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16("testing_profile"), 0, std::string(), factories); 102a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch signin_profile_ = profile_manager_->CreateTestingProfile(kSigninProfile); 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) signin_profile_->ForceIncognito(true); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Usually the signin Profile and the main Profile are separate, but since 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the signin Profile is an OTR Profile then for this test it suffices to 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // attach it to the main Profile. 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) profile_->SetOffTheRecordProfile(scoped_ptr<Profile>(signin_profile_)); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_profile_->SetOriginalProfile(profile_); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(signin_profile_, chromeos::ProfileHelper::GetSigninProfile()); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::RegisterLocalState(prefs_.registry()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a policy map for testing. 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch policy_map_.Set(key::kHomepageLocation, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new base::StringValue("http://chromium.org"), 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NULL); 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch policy_map_.Set(key::kChromeOsMultiProfileUserBehavior, 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new base::StringValue("primary-only"), 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NULL); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_bundle_.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .CopyFrom(policy_map_); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create fake policy blobs to deliver to the client. 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) em::DeviceRegisterResponse* register_response = 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) register_blob_.mutable_register_response(); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) register_response->set_device_management_token("dmtoken123"); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) em::CloudPolicySettings policy_proto; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy_proto.mutable_homepagelocation()->set_value("http://chromium.org"); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE( 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy_proto.SerializeToString(policy_data_.mutable_policy_value())); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy_data_.set_policy_type(dm_protocol::kChromeUserPolicyType); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy_data_.set_request_token("dmtoken123"); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy_data_.set_device_id("id987"); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::PolicyFetchResponse* policy_response = 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_blob_.mutable_policy_response()->add_response(); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(policy_data_.SerializeToString( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_response->mutable_policy_data())); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(device_management_service_, StartJob(_, _, _, _, _, _, _)) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (token_forwarder_) 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) token_forwarder_->Shutdown(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (manager_) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->RemoveObserver(&observer_); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->Shutdown(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 153a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch signin_profile_ = NULL; 154a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile_ = NULL; 155a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile_manager_->DeleteTestingProfile(kSigninProfile); 156a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile_manager_->DeleteTestingProfile(chrome::kInitialProfile); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void CreateManager(bool wait_for_fetch, int fetch_timeout) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store_ = new MockCloudPolicyStore(); 161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) external_data_manager_ = new MockCloudExternalDataManager; 162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) external_data_manager_->SetPolicyStore(store_); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*store_, Load()); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_.reset(new UserCloudPolicyManagerChromeOS( 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CloudPolicyStore>(store_), 166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<CloudExternalDataManager>(external_data_manager_), 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath(), 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wait_for_fetch, 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::TimeDelta::FromSeconds(fetch_timeout), 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) task_runner_, 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) task_runner_, 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) task_runner_)); 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manager_->Init(&schema_registry_); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->AddObserver(&observer_); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->Connect(&prefs_, &device_management_service_, NULL, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) USER_AFFILIATION_NONE); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(store_); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!wait_for_fetch) { 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create the UserCloudPolicyTokenForwarder, which fetches the access 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // token using the OAuth2PolicyFetcher and forwards it to the 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // UserCloudPolicyManagerChromeOS. This service is automatically created 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // for regular Profiles but not for testing Profiles. 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ProfileOAuth2TokenService* token_service = 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile_); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(token_service); 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninManagerBase* signin_manager = 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninManagerFactory::GetForProfile(profile_); 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(signin_manager); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) token_forwarder_.reset( 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new UserCloudPolicyTokenForwarder(manager_.get(), token_service, 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signin_manager)); 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Expects a pending URLFetcher for the |expected_url|, and returns it with 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // prepared to deliver a response to its delegate. 200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::TestURLFetcher* PrepareOAuthFetcher(const GURL& expected_url) { 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID(0); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(fetcher); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!fetcher) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(fetcher->delegate()); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(fetcher->GetOriginalURL().spec(), 207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) expected_url.spec(), 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true)); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->set_url(fetcher->GetOriginalURL()); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->set_response_code(200); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->set_status(net::URLRequestStatus()); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return fetcher; 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Issues the OAuth2 tokens and returns the device management register job 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // if the flow succeeded. 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockDeviceManagementJob* IssueOAuthToken(bool has_request_token) { 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Issuing this token triggers the callback of the OAuth2PolicyFetcher, 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // which triggers the registration request. 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockDeviceManagementJob* register_request = NULL; 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(device_management_service_, 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION, _)) 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .WillOnce(device_management_service_.CreateAsyncJob(®ister_request)); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!has_request_token) { 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GaiaUrls* gaia_urls = GaiaUrls::GetInstance(); 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::TestURLFetcher* fetcher = NULL; 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Issue the oauth_token cookie first. 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->client_login_to_oauth2_url()); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!fetcher) 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::ResponseCookies cookies; 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookies.push_back(kOAuthTokenCookie); 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->set_cookies(cookies); 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Issue the refresh token. 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->oauth2_token_url()); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!fetcher) 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->SetResponseString(kOAuth2TokenPairData); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Issue the access token. 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->oauth2_token_url()); 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!fetcher) 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return NULL; 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fetcher->SetResponseString(kOAuth2AccessTokenData); 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Since the refresh token is available, OAuth2TokenService was used 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to request the access token and not UserCloudPolicyTokenForwarder. 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Issue the access token with the former. 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FakeProfileOAuth2TokenService* token_service = 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<FakeProfileOAuth2TokenService*>( 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)); 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(token_service); 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OAuth2TokenService::ScopeSet scopes; 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scopes.insert(GaiaConstants::kDeviceManagementServiceOAuth); 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scopes.insert(GaiaConstants::kOAuthWrapBridgeUserInfoScope); 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) token_service->IssueTokenForScope( 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scopes, "5678", 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromSeconds(3600)); 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(register_request); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&device_management_service_); 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(device_management_service_, StartJob(_, _, _, _, _, _, _)) 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AnyNumber()); 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return register_request; 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Expects a policy fetch request to be issued after invoking |trigger_fetch|. 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This method replies to that fetch request and verifies that the manager 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // handled the response. 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void FetchPolicy(const base::Closure& trigger_fetch) { 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockDeviceManagementJob* policy_request = NULL; 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(device_management_service_, 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH, _)) 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(device_management_service_.CreateAsyncJob(&policy_request)); 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) trigger_fetch.Run(); 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(policy_request); 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->client()->is_registered()); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&device_management_service_); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(device_management_service_, StartJob(_, _, _, _, _, _, _)) 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AnyNumber()); 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Send the initial policy back. This completes the initialization flow. 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*store_, Store(_)); 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy_request->SendResponse(DM_STATUS_SUCCESS, policy_blob_); 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(store_); 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Notifying that the store is has cached the fetched policy completes the 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // process, and initializes the manager. 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())); 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->policy_map_.CopyFrom(policy_map_); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store_->NotifyStoreLoaded(); 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->policies().Equals(expected_bundle_)); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 311a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Required by the refresh scheduler that's created by the manager and 312a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // for the cleanup of URLRequestContextGetter in the |signin_profile_|. 313a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience policy objects. 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) em::PolicyData policy_data_; 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) em::DeviceManagementResponse register_blob_; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceManagementResponse policy_blob_; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyMap policy_map_; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyBundle expected_bundle_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Policy infrastructure. 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcherFactory test_url_fetcher_factory_; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingPrefServiceSimple prefs_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConfigurationPolicyObserver observer_; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDeviceManagementService device_management_service_; 327d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MockCloudPolicyStore* store_; // Not owned. 328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MockCloudExternalDataManager* external_data_manager_; // Not owned. 329d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry schema_registry_; 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<UserCloudPolicyManagerChromeOS> manager_; 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<UserCloudPolicyTokenForwarder> token_forwarder_; 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Required by ProfileHelper to get the signin Profile context. 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestingProfileManager> profile_manager_; 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingProfile* profile_; 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingProfile* signin_profile_; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 339a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch static const char kSigninProfile[]; 340a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserCloudPolicyManagerChromeOSTest); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345a3f7b4e666c476898878fa745f637129375cd889Ben Murdochconst char UserCloudPolicyManagerChromeOSTest::kSigninProfile[] = 346a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch "signin_profile"; 347a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFirstFetch) { 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests the initialization of a manager whose Profile is waiting for the 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initial fetch, when the policy cache is empty. 35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initialize the CloudPolicyService without any stored data. 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->NotifyStoreLoaded(); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This starts the OAuth2 policy token fetcher using the signin Profile. 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The manager will then issue the registration request. 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockDeviceManagementJob* register_request = IssueOAuthToken(false); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(register_request); 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reply with a valid registration response. This triggers the initial policy 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fetch. 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FetchPolicy(base::Bind(&MockDeviceManagementJob::SendResponse, 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(register_request), 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DM_STATUS_SUCCESS, register_blob_)); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingRefreshFetch) { 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests the initialization of a manager whose Profile is waiting for the 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initial fetch, when a previously cached policy and DMToken already exist. 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000)); 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set the initially cached data and initialize the CloudPolicyService. 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The initial policy fetch is issued using the cached DMToken. 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->policy_.reset(new em::PolicyData(policy_data_)); 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FetchPolicy(base::Bind(&MockCloudPolicyStore::NotifyStoreLoaded, 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(store_))); 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchStoreError) { 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests the initialization of a manager whose Profile is waiting for the 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initial fetch, when the initial store load fails. 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000)); 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initialize the CloudPolicyService without any stored data. 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->NotifyStoreError(); 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This starts the OAuth2 policy token fetcher using the signin Profile. 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The manager will then issue the registration request. 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockDeviceManagementJob* register_request = IssueOAuthToken(false); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(register_request); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reply with a valid registration response. This triggers the initial policy 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fetch. 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FetchPolicy(base::Bind(&MockDeviceManagementJob::SendResponse, 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(register_request), 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DM_STATUS_SUCCESS, register_blob_)); 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchOAuthError) { 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests the initialization of a manager whose Profile is waiting for the 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initial fetch, when the OAuth2 token fetch fails. 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000)); 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initialize the CloudPolicyService without any stored data. 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->NotifyStoreLoaded(); 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This starts the OAuth2 policy token fetcher using the signin Profile. 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The manager will initialize with no policy after the token fetcher fails. 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())); 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The PolicyOAuth2TokenFetcher posts delayed retries on some errors. This 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // data will make it fail immediately. 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLFetcher* fetcher = PrepareOAuthFetcher( 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GaiaUrls::GetInstance()->client_login_to_oauth2_url()); 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(fetcher); 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->set_response_code(400); 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->SetResponseString("Error=BadAuthentication"); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(PolicyBundle().Equals(manager_->policies())); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchRegisterError) { 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests the initialization of a manager whose Profile is waiting for the 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initial fetch, when the device management registration fails. 43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000)); 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initialize the CloudPolicyService without any stored data. 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->NotifyStoreError(); 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This starts the OAuth2 policy token fetcher using the signin Profile. 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The manager will then issue the registration request. 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockDeviceManagementJob* register_request = IssueOAuthToken(false); 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(register_request); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Now make it fail. 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())); 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) register_request->SendResponse(DM_STATUS_TEMPORARY_UNAVAILABLE, 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) em::DeviceManagementResponse()); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(PolicyBundle().Equals(manager_->policies())); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchPolicyFetchError) { 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests the initialization of a manager whose Profile is waiting for the 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initial fetch, when the policy fetch request fails. 46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000)); 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initialize the CloudPolicyService without any stored data. 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->NotifyStoreLoaded(); 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This starts the OAuth2 policy token fetcher using the signin Profile. 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The manager will then issue the registration request. 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockDeviceManagementJob* register_request = IssueOAuthToken(false); 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(register_request); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reply with a valid registration response. This triggers the initial policy 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fetch. 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockDeviceManagementJob* policy_request = NULL; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(device_management_service_, 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH, _)) 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(device_management_service_.CreateAsyncJob(&policy_request)); 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) register_request->SendResponse(DM_STATUS_SUCCESS, register_blob_); 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&device_management_service_); 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(policy_request); 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->client()->is_registered()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make the policy fetch fail. The observer gets 2 notifications: one from the 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // RefreshPolicies callback, and another from the OnClientError callback. 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A single notification suffices for this edge case, but this behavior is 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // also correct and makes the implementation simpler. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())).Times(AtLeast(1)); 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy_request->SendResponse(DM_STATUS_TEMPORARY_UNAVAILABLE, 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) em::DeviceManagementResponse()); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(PolicyBundle().Equals(manager_->policies())); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchTimeout) { 50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The blocking fetch should be abandoned after the timeout. 50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(true, 0)); 50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Initialize the CloudPolicyService without any stored data. 50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) store_->NotifyStoreLoaded(); 50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Running the message loop should trigger the timeout. 51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())).Times(AtLeast(1)); 51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(PolicyBundle().Equals(manager_->policies())); 51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 52058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, NonBlockingFirstFetch) { 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests the first policy fetch request by a Profile that isn't managed. 52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(false, 1000)); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initialize the CloudPolicyService without any stored data. Since the 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // manager is not waiting for the initial fetch, it will become initialized 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // once the store is ready. 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())); 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->NotifyStoreLoaded(); 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->client()->is_registered()); 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The manager is waiting for the refresh token, and hasn't started any 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fetchers. 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(test_url_fetcher_factory_.GetFetcherByID(0)); 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Set a fake refresh token at the OAuth2TokenService. 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FakeProfileOAuth2TokenService* token_service = 544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<FakeProfileOAuth2TokenService*>( 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)); 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(token_service); 547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninManagerBase* signin_manager = 548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninManagerFactory::GetForProfile(profile_); 549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(signin_manager); 550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& account_id = signin_manager->GetAuthenticatedAccountId(); 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(token_service->RefreshTokenIsAvailable(account_id)); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_service->UpdateCredentials(account_id, "refresh_token"); 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(token_service->RefreshTokenIsAvailable(account_id)); 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // That should have notified the manager, which now issues the request for the 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // policy oauth token. 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockDeviceManagementJob* register_request = IssueOAuthToken(true); 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(register_request); 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) register_request->SendResponse(DM_STATUS_SUCCESS, register_blob_); 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The refresh scheduler takes care of the initial fetch for unmanaged users. 562d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Running the task runner issues the initial fetch. 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FetchPolicy( 564d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&base::TestSimpleTaskRunner::RunUntilIdle, task_runner_)); 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(UserCloudPolicyManagerChromeOSTest, NonBlockingRefreshFetch) { 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tests a non-blocking initial policy fetch for a Profile that already has 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a cached DMToken. 57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateManager(false, 1000)); 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set the initially cached data and initialize the CloudPolicyService. 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The initial policy fetch is issued using the cached DMToken. 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete()); 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())); 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->policy_.reset(new em::PolicyData(policy_data_)); 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) store_->NotifyStoreLoaded(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete()); 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME)); 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->core()->client()->is_registered()); 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The refresh scheduler takes care of the initial fetch for unmanaged users. 585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Running the task runner issues the initial fetch. 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FetchPolicy( 587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&base::TestSimpleTaskRunner::RunUntilIdle, task_runner_)); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace policy 591