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(&register_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