12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/test_request_interceptor.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_client.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_switches.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/policy_test_utils.h"
188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_errors.h"
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/device_management_backend.pb.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using content::BrowserThread;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::AnyNumber;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::InvokeWithoutArgs;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Mock;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace em = enterprise_management;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests the cloud policy stack using a URLRequestJobFactory::ProtocolHandler
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to intercept requests and produce canned responses.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CloudPolicyManagerTest : public InProcessBrowserTest {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CloudPolicyManagerTest() {}
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CloudPolicyManagerTest() {}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CommandLine* command_line = CommandLine::ForCurrentProcess();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    command_line->AppendSwitchASCII(switches::kDeviceManagementUrl,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    "http://localhost");
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(PolicyServiceIsEmpty(g_browser_process->policy_service()))
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "Pre-existing policies in this machine will make this test fail.";
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    interceptor_.reset(new TestRequestInterceptor(
638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        "localhost",
648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)));
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPolicyConnector* connector =
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        g_browser_process->browser_policy_connector();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connector->ScheduleServiceInitialization(0);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Mock a signed-in user. This is used by the UserCloudPolicyStore to pass
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the username to the UserCloudPolicyValidator.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SigninManager* signin_manager =
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SigninManagerFactory::GetForProfile(browser()->profile());
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(signin_manager);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    signin_manager->SetAuthenticatedUsername("user@example.com");
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(policy_manager());
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    policy_manager()->Connect(
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        g_browser_process->local_state(),
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        g_browser_process->system_request_context(),
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        UserCloudPolicyManager::CreateCloudPolicyClient(
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            connector->device_management_service(),
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            g_browser_process->system_request_context()).Pass());
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CleanUpOnMainThread() OVERRIDE {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Verify that all the expected requests were handled.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0u, interceptor_->GetPendingSize());
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interceptor_.reset();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UserCloudPolicyManagerChromeOS* policy_manager() {
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return UserCloudPolicyManagerFactoryChromeOS::GetForProfile(
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser()->profile());
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UserCloudPolicyManager* policy_manager() {
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return UserCloudPolicyManagerFactory::GetForBrowserContext(
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        browser()->profile());
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_CHROMEOS)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Register the client of the policy_manager() using a bogus auth token, and
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // returns once the registration gets a result back.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Register() {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(policy_manager());
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(policy_manager()->core()->client());
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::RunLoop run_loop;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockCloudPolicyClientObserver observer;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(observer, OnRegistrationStateChanged(_))
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .Times(AnyNumber())
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(observer, OnClientError(_))
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .Times(AnyNumber())
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy_manager()->core()->client()->AddObserver(&observer);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give a bogus OAuth token to the |policy_manager|. This should make its
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CloudPolicyClient fetch the DMToken.
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    em::DeviceRegisterRequest::Type registration_type =
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        em::DeviceRegisterRequest::USER;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        em::DeviceRegisterRequest::BROWSER;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    policy_manager()->core()->client()->Register(
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        registration_type, "bogus", std::string(), false, std::string(),
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        std::string());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    run_loop.Run();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy_manager()->core()->client()->RemoveObserver(&observer);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestRequestInterceptor> interceptor_;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(CloudPolicyManagerTest, Register) {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Accept one register request. The initial request should not include the
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reregister flag.
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  em::DeviceRegisterRequest::Type expected_type =
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      em::DeviceRegisterRequest::USER;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      em::DeviceRegisterRequest::BROWSER;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool expect_reregister = false;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor_->PushJobCallback(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestRequestInterceptor::RegisterJob(expected_type, expect_reregister));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(Register());
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_manager()->core()->client()->is_registered());
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(CloudPolicyManagerTest, RegisterFails) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The interceptor makes all requests fail by default; this will trigger
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // an OnClientError() call on the observer.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(Register());
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(CloudPolicyManagerTest, RegisterFailsWithRetries) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fail 4 times with ERR_NETWORK_CHANGED; the first 3 will trigger a retry,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the last one will forward the error to the client and unblock the
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // register process.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 4; ++i) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interceptor_->PushJobCallback(
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestRequestInterceptor::ErrorJob(net::ERR_NETWORK_CHANGED));
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(Register());
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(CloudPolicyManagerTest, RegisterWithRetry) {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Accept one register request after failing once. The retry request should
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // set the reregister flag.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor_->PushJobCallback(
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestRequestInterceptor::ErrorJob(net::ERR_NETWORK_CHANGED));
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  em::DeviceRegisterRequest::Type expected_type =
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      em::DeviceRegisterRequest::USER;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      em::DeviceRegisterRequest::BROWSER;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool expect_reregister = true;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor_->PushJobCallback(
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestRequestInterceptor::RegisterJob(expected_type, expect_reregister));
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(Register());
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_manager()->core()->client()->is_registered());
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace policy
203