Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / policy / user_cloud_policy_manager_chromeos_unittest.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/callback.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/prefs/pref_registry_simple.h"
12 #include "base/prefs/testing_pref_service.h"
13 #include "base/run_loop.h"
14 #include "base/sequenced_task_runner.h"
15 #include "base/strings/string_util.h"
16 #include "base/strings/utf_string_conversions.h"
17 #include "base/test/test_simple_task_runner.h"
18 #include "chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder.h"
19 #include "chrome/browser/chromeos/profiles/profile_helper.h"
20 #include "chrome/browser/prefs/browser_prefs.h"
21 #include "chrome/browser/prefs/pref_service_syncable.h"
22 #include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
23 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h"
24 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
25 #include "chrome/browser/signin/signin_manager_factory.h"
26 #include "chrome/common/chrome_constants.h"
27 #include "chrome/test/base/testing_browser_process.h"
28 #include "chrome/test/base/testing_profile.h"
29 #include "chrome/test/base/testing_profile_manager.h"
30 #include "components/policy/core/common/cloud/cloud_external_data_manager.h"
31 #include "components/policy/core/common/cloud/mock_cloud_external_data_manager.h"
32 #include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
33 #include "components/policy/core/common/cloud/mock_device_management_service.h"
34 #include "components/policy/core/common/external_data_fetcher.h"
35 #include "components/policy/core/common/mock_configuration_policy_provider.h"
36 #include "components/policy/core/common/schema_registry.h"
37 #include "components/signin/core/browser/profile_oauth2_token_service.h"
38 #include "components/signin/core/browser/signin_manager.h"
39 #include "content/public/test/test_browser_thread_bundle.h"
40 #include "google_apis/gaia/gaia_auth_consumer.h"
41 #include "google_apis/gaia/gaia_constants.h"
42 #include "google_apis/gaia/gaia_urls.h"
43 #include "net/url_request/test_url_fetcher_factory.h"
44 #include "net/url_request/url_fetcher_delegate.h"
45 #include "net/url_request/url_request_context_getter.h"
46 #include "net/url_request/url_request_status.h"
47 #include "policy/policy_constants.h"
48 #include "policy/proto/device_management_backend.pb.h"
49 #include "testing/gmock/include/gmock/gmock.h"
50 #include "testing/gtest/include/gtest/gtest.h"
51
52 namespace em = enterprise_management;
53
54 using testing::AnyNumber;
55 using testing::AtLeast;
56 using testing::Mock;
57 using testing::_;
58
59 namespace policy {
60
61 const char kOAuthCodeCookie[] = "oauth_code=1234; Secure; HttpOnly";
62
63 const char kOAuth2TokenPairData[] =
64     "{"
65     "  \"refresh_token\": \"1234\","
66     "  \"access_token\": \"5678\","
67     "  \"expires_in\": 3600"
68     "}";
69
70 const char kOAuth2AccessTokenData[] =
71     "{"
72     "  \"access_token\": \"5678\","
73     "  \"expires_in\": 3600"
74     "}";
75
76 class UserCloudPolicyManagerChromeOSTest : public testing::Test {
77  protected:
78   UserCloudPolicyManagerChromeOSTest()
79       : store_(NULL),
80         external_data_manager_(NULL),
81         task_runner_(new base::TestSimpleTaskRunner()),
82         profile_(NULL),
83         signin_profile_(NULL) {}
84
85   virtual void SetUp() override {
86     // The initialization path that blocks on the initial policy fetch requires
87     // a signin Profile to use its URLRequestContext.
88     profile_manager_.reset(
89         new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
90     ASSERT_TRUE(profile_manager_->SetUp());
91     TestingProfile::TestingFactories factories;
92     factories.push_back(
93         std::make_pair(ProfileOAuth2TokenServiceFactory::GetInstance(),
94                        BuildFakeProfileOAuth2TokenService));
95     profile_ = profile_manager_->CreateTestingProfile(
96         chrome::kInitialProfile,
97         scoped_ptr<PrefServiceSyncable>(),
98         base::UTF8ToUTF16(""),
99         0,
100         std::string(),
101         factories);
102     // Usually the signin Profile and the main Profile are separate, but since
103     // the signin Profile is an OTR Profile then for this test it suffices to
104     // attach it to the main Profile.
105     signin_profile_ = TestingProfile::Builder().BuildIncognito(profile_);
106     ASSERT_EQ(signin_profile_, chromeos::ProfileHelper::GetSigninProfile());
107
108     chrome::RegisterLocalState(prefs_.registry());
109
110     // Set up a policy map for testing.
111     policy_map_.Set(key::kHomepageLocation,
112                     POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
113                     new base::StringValue("http://chromium.org"),
114                     NULL);
115     policy_map_.Set(key::kChromeOsMultiProfileUserBehavior,
116                     POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
117                     new base::StringValue("primary-only"),
118                     NULL);
119     policy_map_.Set(key::kEasyUnlockAllowed,
120                     POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
121                     new base::FundamentalValue(false),
122                     NULL);
123     expected_bundle_.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
124         .CopyFrom(policy_map_);
125
126     // Create fake policy blobs to deliver to the client.
127     em::DeviceRegisterResponse* register_response =
128         register_blob_.mutable_register_response();
129     register_response->set_device_management_token("dmtoken123");
130
131     em::CloudPolicySettings policy_proto;
132     policy_proto.mutable_homepagelocation()->set_value("http://chromium.org");
133     ASSERT_TRUE(
134         policy_proto.SerializeToString(policy_data_.mutable_policy_value()));
135     policy_data_.set_policy_type(dm_protocol::kChromeUserPolicyType);
136     policy_data_.set_request_token("dmtoken123");
137     policy_data_.set_device_id("id987");
138     em::PolicyFetchResponse* policy_response =
139         policy_blob_.mutable_policy_response()->add_response();
140     ASSERT_TRUE(policy_data_.SerializeToString(
141         policy_response->mutable_policy_data()));
142
143     EXPECT_CALL(device_management_service_, StartJob(_, _, _, _, _, _, _))
144         .Times(AnyNumber());
145   }
146
147   virtual void TearDown() override {
148     if (token_forwarder_)
149       token_forwarder_->Shutdown();
150     if (manager_) {
151       manager_->RemoveObserver(&observer_);
152       manager_->Shutdown();
153     }
154     signin_profile_ = NULL;
155     profile_ = NULL;
156     profile_manager_->DeleteTestingProfile(chrome::kInitialProfile);
157   }
158
159   void CreateManager(bool wait_for_fetch, int fetch_timeout) {
160     store_ = new MockCloudPolicyStore();
161     external_data_manager_ = new MockCloudExternalDataManager;
162     external_data_manager_->SetPolicyStore(store_);
163     EXPECT_CALL(*store_, Load());
164     manager_.reset(new UserCloudPolicyManagerChromeOS(
165         scoped_ptr<CloudPolicyStore>(store_),
166         scoped_ptr<CloudExternalDataManager>(external_data_manager_),
167         base::FilePath(),
168         wait_for_fetch,
169         base::TimeDelta::FromSeconds(fetch_timeout),
170         task_runner_,
171         task_runner_,
172         task_runner_));
173     manager_->Init(&schema_registry_);
174     manager_->AddObserver(&observer_);
175     manager_->Connect(&prefs_, &device_management_service_, NULL,
176                       USER_AFFILIATION_NONE);
177     Mock::VerifyAndClearExpectations(store_);
178     EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
179     EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
180
181     if (!wait_for_fetch) {
182       // Create the UserCloudPolicyTokenForwarder, which fetches the access
183       // token using the OAuth2PolicyFetcher and forwards it to the
184       // UserCloudPolicyManagerChromeOS. This service is automatically created
185       // for regular Profiles but not for testing Profiles.
186       ProfileOAuth2TokenService* token_service =
187           ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
188       ASSERT_TRUE(token_service);
189       SigninManagerBase* signin_manager =
190           SigninManagerFactory::GetForProfile(profile_);
191       ASSERT_TRUE(signin_manager);
192       token_forwarder_.reset(
193           new UserCloudPolicyTokenForwarder(manager_.get(), token_service,
194                                             signin_manager));
195     }
196   }
197
198   // Expects a pending URLFetcher for the |expected_url|, and returns it with
199   // prepared to deliver a response to its delegate.
200   net::TestURLFetcher* PrepareOAuthFetcher(const GURL& expected_url) {
201     net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID(0);
202     EXPECT_TRUE(fetcher);
203     if (!fetcher)
204       return NULL;
205     EXPECT_TRUE(fetcher->delegate());
206     EXPECT_TRUE(StartsWithASCII(fetcher->GetOriginalURL().spec(),
207                                 expected_url.spec(),
208                                 true));
209     fetcher->set_url(fetcher->GetOriginalURL());
210     fetcher->set_response_code(200);
211     fetcher->set_status(net::URLRequestStatus());
212     return fetcher;
213   }
214
215   // Issues the OAuth2 tokens and returns the device management register job
216   // if the flow succeeded.
217   MockDeviceManagementJob* IssueOAuthToken(bool has_request_token) {
218     EXPECT_FALSE(manager_->core()->client()->is_registered());
219
220     // Issuing this token triggers the callback of the OAuth2PolicyFetcher,
221     // which triggers the registration request.
222     MockDeviceManagementJob* register_request = NULL;
223     EXPECT_CALL(device_management_service_,
224                 CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION, _))
225         .WillOnce(device_management_service_.CreateAsyncJob(&register_request));
226
227     if (!has_request_token) {
228       GaiaUrls* gaia_urls = GaiaUrls::GetInstance();
229       net::TestURLFetcher* fetcher = NULL;
230
231       // Issue the oauth_token cookie first.
232       fetcher = PrepareOAuthFetcher(gaia_urls->client_login_to_oauth2_url());
233       if (!fetcher)
234         return NULL;
235       net::ResponseCookies cookies;
236       cookies.push_back(kOAuthCodeCookie);
237
238       fetcher->set_cookies(cookies);
239       fetcher->delegate()->OnURLFetchComplete(fetcher);
240
241       // Issue the refresh token.
242       fetcher = PrepareOAuthFetcher(gaia_urls->oauth2_token_url());
243       if (!fetcher)
244         return NULL;
245       fetcher->SetResponseString(kOAuth2TokenPairData);
246       fetcher->delegate()->OnURLFetchComplete(fetcher);
247
248       // Issue the access token.
249       fetcher = PrepareOAuthFetcher(gaia_urls->oauth2_token_url());
250       if (!fetcher)
251         return NULL;
252       fetcher->SetResponseString(kOAuth2AccessTokenData);
253       fetcher->delegate()->OnURLFetchComplete(fetcher);
254     } else {
255       // Since the refresh token is available, OAuth2TokenService was used
256       // to request the access token and not UserCloudPolicyTokenForwarder.
257       // Issue the access token with the former.
258       FakeProfileOAuth2TokenService* token_service =
259         static_cast<FakeProfileOAuth2TokenService*>(
260             ProfileOAuth2TokenServiceFactory::GetForProfile(profile_));
261       EXPECT_TRUE(token_service);
262       OAuth2TokenService::ScopeSet scopes;
263       scopes.insert(GaiaConstants::kDeviceManagementServiceOAuth);
264       scopes.insert(GaiaConstants::kOAuthWrapBridgeUserInfoScope);
265       token_service->IssueTokenForScope(
266           scopes, "5678",
267           base::Time::Now() + base::TimeDelta::FromSeconds(3600));
268     }
269
270     EXPECT_TRUE(register_request);
271     EXPECT_FALSE(manager_->core()->client()->is_registered());
272
273     Mock::VerifyAndClearExpectations(&device_management_service_);
274     EXPECT_CALL(device_management_service_, StartJob(_, _, _, _, _, _, _))
275         .Times(AnyNumber());
276
277     return register_request;
278   }
279
280   // Expects a policy fetch request to be issued after invoking |trigger_fetch|.
281   // This method replies to that fetch request and verifies that the manager
282   // handled the response.
283   void FetchPolicy(const base::Closure& trigger_fetch) {
284     MockDeviceManagementJob* policy_request = NULL;
285     EXPECT_CALL(device_management_service_,
286                 CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH, _))
287         .WillOnce(device_management_service_.CreateAsyncJob(&policy_request));
288     trigger_fetch.Run();
289     ASSERT_TRUE(policy_request);
290     EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
291     EXPECT_TRUE(manager_->core()->client()->is_registered());
292
293     Mock::VerifyAndClearExpectations(&device_management_service_);
294     EXPECT_CALL(device_management_service_, StartJob(_, _, _, _, _, _, _))
295         .Times(AnyNumber());
296
297     // Send the initial policy back. This completes the initialization flow.
298     EXPECT_CALL(*store_, Store(_));
299     policy_request->SendResponse(DM_STATUS_SUCCESS, policy_blob_);
300     Mock::VerifyAndClearExpectations(store_);
301
302     // Notifying that the store is has cached the fetched policy completes the
303     // process, and initializes the manager.
304     EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
305     store_->policy_map_.CopyFrom(policy_map_);
306     store_->NotifyStoreLoaded();
307     EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
308     Mock::VerifyAndClearExpectations(&observer_);
309     EXPECT_TRUE(manager_->policies().Equals(expected_bundle_));
310   }
311
312   // Required by the refresh scheduler that's created by the manager and
313   // for the cleanup of URLRequestContextGetter in the |signin_profile_|.
314   content::TestBrowserThreadBundle thread_bundle_;
315
316   // Convenience policy objects.
317   em::PolicyData policy_data_;
318   em::DeviceManagementResponse register_blob_;
319   em::DeviceManagementResponse policy_blob_;
320   PolicyMap policy_map_;
321   PolicyBundle expected_bundle_;
322
323   // Policy infrastructure.
324   net::TestURLFetcherFactory test_url_fetcher_factory_;
325   TestingPrefServiceSimple prefs_;
326   MockConfigurationPolicyObserver observer_;
327   MockDeviceManagementService device_management_service_;
328   MockCloudPolicyStore* store_;  // Not owned.
329   MockCloudExternalDataManager* external_data_manager_;  // Not owned.
330   scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
331   SchemaRegistry schema_registry_;
332   scoped_ptr<UserCloudPolicyManagerChromeOS> manager_;
333   scoped_ptr<UserCloudPolicyTokenForwarder> token_forwarder_;
334
335   // Required by ProfileHelper to get the signin Profile context.
336   scoped_ptr<TestingProfileManager> profile_manager_;
337   TestingProfile* profile_;
338   TestingProfile* signin_profile_;
339
340   static const char kSigninProfile[];
341
342  private:
343   DISALLOW_COPY_AND_ASSIGN(UserCloudPolicyManagerChromeOSTest);
344 };
345
346 const char UserCloudPolicyManagerChromeOSTest::kSigninProfile[] =
347     "signin_profile";
348
349 TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFirstFetch) {
350   // Tests the initialization of a manager whose Profile is waiting for the
351   // initial fetch, when the policy cache is empty.
352   ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000));
353
354   // Initialize the CloudPolicyService without any stored data.
355   EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
356   store_->NotifyStoreLoaded();
357   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
358   EXPECT_FALSE(manager_->core()->client()->is_registered());
359
360   // This starts the OAuth2 policy token fetcher using the signin Profile.
361   // The manager will then issue the registration request.
362   MockDeviceManagementJob* register_request = IssueOAuthToken(false);
363   ASSERT_TRUE(register_request);
364
365   // Reply with a valid registration response. This triggers the initial policy
366   // fetch.
367   FetchPolicy(base::Bind(&MockDeviceManagementJob::SendResponse,
368                          base::Unretained(register_request),
369                          DM_STATUS_SUCCESS, register_blob_));
370 }
371
372 TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingRefreshFetch) {
373   // Tests the initialization of a manager whose Profile is waiting for the
374   // initial fetch, when a previously cached policy and DMToken already exist.
375   ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000));
376
377   // Set the initially cached data and initialize the CloudPolicyService.
378   // The initial policy fetch is issued using the cached DMToken.
379   store_->policy_.reset(new em::PolicyData(policy_data_));
380   FetchPolicy(base::Bind(&MockCloudPolicyStore::NotifyStoreLoaded,
381                          base::Unretained(store_)));
382 }
383
384 TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchStoreError) {
385   // Tests the initialization of a manager whose Profile is waiting for the
386   // initial fetch, when the initial store load fails.
387   ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000));
388
389   // Initialize the CloudPolicyService without any stored data.
390   EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
391   store_->NotifyStoreError();
392   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
393   EXPECT_FALSE(manager_->core()->client()->is_registered());
394
395   // This starts the OAuth2 policy token fetcher using the signin Profile.
396   // The manager will then issue the registration request.
397   MockDeviceManagementJob* register_request = IssueOAuthToken(false);
398   ASSERT_TRUE(register_request);
399
400   // Reply with a valid registration response. This triggers the initial policy
401   // fetch.
402   FetchPolicy(base::Bind(&MockDeviceManagementJob::SendResponse,
403                          base::Unretained(register_request),
404                          DM_STATUS_SUCCESS, register_blob_));
405 }
406
407 TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchOAuthError) {
408   // Tests the initialization of a manager whose Profile is waiting for the
409   // initial fetch, when the OAuth2 token fetch fails.
410   ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000));
411
412   // Initialize the CloudPolicyService without any stored data.
413   EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
414   store_->NotifyStoreLoaded();
415   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
416   EXPECT_FALSE(manager_->core()->client()->is_registered());
417
418   // This starts the OAuth2 policy token fetcher using the signin Profile.
419   // The manager will initialize with no policy after the token fetcher fails.
420   EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
421
422   // The PolicyOAuth2TokenFetcher posts delayed retries on some errors. This
423   // data will make it fail immediately.
424   net::TestURLFetcher* fetcher = PrepareOAuthFetcher(
425       GaiaUrls::GetInstance()->client_login_to_oauth2_url());
426   ASSERT_TRUE(fetcher);
427   fetcher->set_response_code(400);
428   fetcher->SetResponseString("Error=BadAuthentication");
429   EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
430   fetcher->delegate()->OnURLFetchComplete(fetcher);
431   EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
432   EXPECT_TRUE(PolicyBundle().Equals(manager_->policies()));
433   Mock::VerifyAndClearExpectations(&observer_);
434 }
435
436 TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchRegisterError) {
437   // Tests the initialization of a manager whose Profile is waiting for the
438   // initial fetch, when the device management registration fails.
439   ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000));
440
441   // Initialize the CloudPolicyService without any stored data.
442   EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
443   store_->NotifyStoreError();
444   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
445   EXPECT_FALSE(manager_->core()->client()->is_registered());
446
447   // This starts the OAuth2 policy token fetcher using the signin Profile.
448   // The manager will then issue the registration request.
449   MockDeviceManagementJob* register_request = IssueOAuthToken(false);
450   ASSERT_TRUE(register_request);
451
452   // Now make it fail.
453   EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
454   EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
455   register_request->SendResponse(DM_STATUS_TEMPORARY_UNAVAILABLE,
456                                  em::DeviceManagementResponse());
457   EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
458   EXPECT_TRUE(PolicyBundle().Equals(manager_->policies()));
459   Mock::VerifyAndClearExpectations(&observer_);
460 }
461
462 TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchPolicyFetchError) {
463   // Tests the initialization of a manager whose Profile is waiting for the
464   // initial fetch, when the policy fetch request fails.
465   ASSERT_NO_FATAL_FAILURE(CreateManager(true, 1000));
466
467   // Initialize the CloudPolicyService without any stored data.
468   EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
469   store_->NotifyStoreLoaded();
470   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
471   EXPECT_FALSE(manager_->core()->client()->is_registered());
472
473   // This starts the OAuth2 policy token fetcher using the signin Profile.
474   // The manager will then issue the registration request.
475   MockDeviceManagementJob* register_request = IssueOAuthToken(false);
476   ASSERT_TRUE(register_request);
477
478   // Reply with a valid registration response. This triggers the initial policy
479   // fetch.
480   MockDeviceManagementJob* policy_request = NULL;
481   EXPECT_CALL(device_management_service_,
482               CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH, _))
483       .WillOnce(device_management_service_.CreateAsyncJob(&policy_request));
484   register_request->SendResponse(DM_STATUS_SUCCESS, register_blob_);
485   Mock::VerifyAndClearExpectations(&device_management_service_);
486   ASSERT_TRUE(policy_request);
487   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
488   EXPECT_TRUE(manager_->core()->client()->is_registered());
489
490   // Make the policy fetch fail. The observer gets 2 notifications: one from the
491   // RefreshPolicies callback, and another from the OnClientError callback.
492   // A single notification suffices for this edge case, but this behavior is
493   // also correct and makes the implementation simpler.
494   EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())).Times(AtLeast(1));
495   EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
496   policy_request->SendResponse(DM_STATUS_TEMPORARY_UNAVAILABLE,
497                                em::DeviceManagementResponse());
498   Mock::VerifyAndClearExpectations(&observer_);
499   EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
500   EXPECT_TRUE(PolicyBundle().Equals(manager_->policies()));
501 }
502
503 TEST_F(UserCloudPolicyManagerChromeOSTest, BlockingFetchTimeout) {
504   // The blocking fetch should be abandoned after the timeout.
505   ASSERT_NO_FATAL_FAILURE(CreateManager(true, 0));
506
507   // Initialize the CloudPolicyService without any stored data.
508   EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
509   store_->NotifyStoreLoaded();
510   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
511   EXPECT_FALSE(manager_->core()->client()->is_registered());
512
513   // Running the message loop should trigger the timeout.
514   EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get())).Times(AtLeast(1));
515   EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
516   base::RunLoop().RunUntilIdle();
517   Mock::VerifyAndClearExpectations(&observer_);
518   EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
519   EXPECT_TRUE(PolicyBundle().Equals(manager_->policies()));
520 }
521
522
523 TEST_F(UserCloudPolicyManagerChromeOSTest, NonBlockingFirstFetch) {
524   // Tests the first policy fetch request by a Profile that isn't managed.
525   ASSERT_NO_FATAL_FAILURE(CreateManager(false, 1000));
526
527   // Initialize the CloudPolicyService without any stored data. Since the
528   // manager is not waiting for the initial fetch, it will become initialized
529   // once the store is ready.
530   EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
531   EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
532   EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
533   store_->NotifyStoreLoaded();
534   Mock::VerifyAndClearExpectations(&observer_);
535   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
536   EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
537   EXPECT_FALSE(manager_->core()->client()->is_registered());
538
539   // The manager is waiting for the refresh token, and hasn't started any
540   // fetchers.
541   EXPECT_FALSE(test_url_fetcher_factory_.GetFetcherByID(0));
542
543   // Set a fake refresh token at the OAuth2TokenService.
544   FakeProfileOAuth2TokenService* token_service =
545     static_cast<FakeProfileOAuth2TokenService*>(
546         ProfileOAuth2TokenServiceFactory::GetForProfile(profile_));
547   ASSERT_TRUE(token_service);
548   SigninManagerBase* signin_manager =
549       SigninManagerFactory::GetForProfile(profile_);
550   ASSERT_TRUE(signin_manager);
551   const std::string& account_id = signin_manager->GetAuthenticatedAccountId();
552   EXPECT_FALSE(token_service->RefreshTokenIsAvailable(account_id));
553   token_service->UpdateCredentials(account_id, "refresh_token");
554   EXPECT_TRUE(token_service->RefreshTokenIsAvailable(account_id));
555
556   // That should have notified the manager, which now issues the request for the
557   // policy oauth token.
558   MockDeviceManagementJob* register_request = IssueOAuthToken(true);
559   ASSERT_TRUE(register_request);
560   register_request->SendResponse(DM_STATUS_SUCCESS, register_blob_);
561
562   // The refresh scheduler takes care of the initial fetch for unmanaged users.
563   // Running the task runner issues the initial fetch.
564   FetchPolicy(
565       base::Bind(&base::TestSimpleTaskRunner::RunUntilIdle, task_runner_));
566 }
567
568 TEST_F(UserCloudPolicyManagerChromeOSTest, NonBlockingRefreshFetch) {
569   // Tests a non-blocking initial policy fetch for a Profile that already has
570   // a cached DMToken.
571   ASSERT_NO_FATAL_FAILURE(CreateManager(false, 1000));
572
573   // Set the initially cached data and initialize the CloudPolicyService.
574   // The initial policy fetch is issued using the cached DMToken.
575   EXPECT_FALSE(manager_->core()->service()->IsInitializationComplete());
576   EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
577   EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
578   store_->policy_.reset(new em::PolicyData(policy_data_));
579   store_->NotifyStoreLoaded();
580   Mock::VerifyAndClearExpectations(&observer_);
581   EXPECT_TRUE(manager_->core()->service()->IsInitializationComplete());
582   EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
583   EXPECT_TRUE(manager_->core()->client()->is_registered());
584
585   // The refresh scheduler takes care of the initial fetch for unmanaged users.
586   // Running the task runner issues the initial fetch.
587   FetchPolicy(
588       base::Bind(&base::TestSimpleTaskRunner::RunUntilIdle, task_runner_));
589 }
590
591 }  // namespace policy