login_utils_browsertest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_utils.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/scoped_temp_dir.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/cros_library.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/mock_cryptohome_library.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/authenticator.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_status_consumer.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/predictor.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/cloud_policy_data_store.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/policy_service.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/proto/device_management_backend.pb.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_pref_service.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/cryptohome/mock_async_method_caller.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_cryptohome_client.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_session_manager_client.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.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 chromeos {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace em = enterprise_management;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SaveArg;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTrue[] = "true";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDomain[] = "domain.com";
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUsername[] = "user@domain.com";
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMode[] = "enterprise";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDeviceId[] = "100200300";
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUsernameOtherDomain[] = "user@other.com";
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAttributeOwned[] = "enterprise.owned";
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAttributeOwner[] = "enterprise.user";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAttrEnterpriseDomain[] = "enterprise.domain";
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAttrEnterpriseMode[] = "enterprise.mode";
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAttrEnterpriseDeviceId[] = "enterprise.device_id";
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOAuthTokenCookie[] = "oauth_token=1234";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOAuthGetAccessTokenData[] =
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "oauth_token=1234&oauth_token_secret=1234";
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOAuthServiceTokenData[] =
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "wrap_access_token=1234&wrap_access_token_expires_in=123456789";
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMServer[] = "http://server/device_management";
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMRegisterRequest[] =
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://server/device_management?request=register";
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMPolicyRequest[] =
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://server/device_management?request=policy";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMToken[] = "1234";
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to mark |flag|, indicating that RefreshPolicies() has executed its
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callback.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetFlag(bool* flag) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *flag = true;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(MockSessionManagerClientRetrievePolicyCallback, policy) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg0.Run(*policy);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(MockSessionManagerClientStorePolicyCallback, success) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1.Run(success);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsTest : public testing::Test,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public LoginUtils::Delegate,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public LoginStatusConsumer {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialization here is important. The UI thread gets the test's
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message loop, as does the file thread (which never actually gets
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // started - so this is a way to fake multiple threads on a single
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test thread).  The IO thread does not get the message loop set,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and is never started.  This is necessary so that we skip various
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bits of initialization that get posted to the IO thread.  We do
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // however, at one point in the test, temporarily set the message
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loop for the IO thread.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoginUtilsTest()
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : loop_(MessageLoop::TYPE_IO),
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser_process_(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<TestingBrowserProcess*>(g_browser_process)),
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        local_state_(browser_process_),
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_thread_(content::BrowserThread::UI, &loop_),
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(content::BrowserThread::DB),
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_thread_(content::BrowserThread::FILE, &loop_),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_thread_(content::BrowserThread::IO),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mock_async_method_caller_(NULL),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connector_(NULL),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cryptohome_(NULL),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prepared_profile_(NULL) {}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine* command_line = CommandLine::ForCurrentProcess();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kDeviceManagementUrl, kDMServer);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    local_state_.Get()->RegisterStringPref(prefs::kApplicationLocale, "");
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DBusThreadManager should be initialized before io_thread_state_, as
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DBusThreadManager is used from chromeos::ProxyConfigServiceImpl,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // which is part of io_thread_state_.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DBusThreadManager::InitializeForTesting(&mock_dbus_thread_manager_);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_method::InputMethodManager::InitializeForTesting(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &mock_input_method_manager_);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Likewise, SessionManagerClient should also be initialized before
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // io_thread_state_.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockSessionManagerClient* session_managed_client =
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mock_dbus_thread_manager_.mock_session_manager_client();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*session_managed_client, RetrieveDevicePolicy(_))
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            MockSessionManagerClientRetrievePolicyCallback(&device_policy_));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*session_managed_client, RetrieveUserPolicy(_))
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            MockSessionManagerClientRetrievePolicyCallback(&user_policy_));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*session_managed_client, StoreUserPolicy(_, _))
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DoAll(SaveArg<0>(&user_policy_),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  MockSessionManagerClientStorePolicyCallback(true)));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_async_method_caller_ = new cryptohome::MockAsyncMethodCaller;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cryptohome::AsyncMethodCaller::InitializeForTesting(
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mock_async_method_caller_);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_state_.reset(new IOThread(local_state_.Get(), NULL, NULL));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_process_->SetIOThread(io_thread_state_.get());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CrosLibrary::TestApi* test_api = CrosLibrary::Get()->GetTestApi();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_api);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cryptohome_ = new MockCryptohomeLibrary();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesIsReady())
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesIsInvalid())
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(false));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesIsFirstInstall())
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, TpmIsEnabled())
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(false));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesSet(kAttributeOwned, kTrue))
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesSet(kAttributeOwner,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   kUsername))
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesSet(kAttrEnterpriseDomain,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   kDomain))
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesSet(kAttrEnterpriseMode,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   kMode))
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesSet(kAttrEnterpriseDeviceId,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   kDeviceId))
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesFinalize())
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesGet(kAttributeOwned, _))
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(DoAll(SetArgPointee<1>(kTrue),
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Return(true)));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesGet(kAttributeOwner, _))
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(DoAll(SetArgPointee<1>(kUsername),
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Return(true)));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesGet(kAttrEnterpriseDomain, _))
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(DoAll(SetArgPointee<1>(kDomain),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Return(true)));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesGet(kAttrEnterpriseMode, _))
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(DoAll(SetArgPointee<1>(kMode),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Return(true)));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesGet(kAttrEnterpriseDeviceId, _))
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(DoAll(SetArgPointee<1>(kDeviceId),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Return(true)));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api->SetCryptohomeLibrary(cryptohome_, true);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_dbus_thread_manager_.mock_cryptohome_client(),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IsMounted(_));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_process_->SetProfileManager(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ProfileManagerWithoutInit(scoped_temp_dir_.path()));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connector_ = browser_process_->browser_policy_connector();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connector_->Init();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunUntilIdle();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cryptohome::AsyncMethodCaller::Shutdown();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_async_method_caller_ = NULL;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunUntilIdle();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // chrome_browser_net::Predictor usually skips its shutdown routines on
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // unit_tests, but does the full thing when
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // g_browser_process->profile_manager() is valid during initialization.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Run a task on a temporary BrowserThread::IO that allows skipping
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // these routines.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      //
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // It is important to not have a fake message loop on the IO
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // thread for the whole test, see comment on LoginUtilsTest
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // constructor for details.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_thread_.DeprecatedSetMessageLoop(&loop_);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loop_.PostTask(FROM_HERE,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Bind(&LoginUtilsTest::TearDownOnIO,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                base::Unretained(this)));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunUntilIdle();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_thread_.DeprecatedSetMessageLoop(NULL);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These trigger some tasks that have to run while BrowserThread::UI
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // exists. Delete all the profiles before deleting the connector.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_process_->SetProfileManager(NULL);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connector_ = NULL;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_process_->SetBrowserPolicyConnector(NULL);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunUntilIdle();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TearDownOnIO() {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<Profile*> profiles =
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser_process_->profile_manager()->GetLoadedProfiles();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < profiles.size(); ++i) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_browser_net::Predictor* predictor =
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          profiles[i]->GetNetworkPredictor();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (predictor) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        predictor->EnablePredictorOnIOThread(false);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        predictor->Shutdown();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunUntilIdle() {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loop_.RunUntilIdle();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::GetBlockingPool()->FlushForTesting();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loop_.RunUntilIdle();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnProfilePrepared(Profile* profile) OVERRIDE {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(prepared_profile_);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prepared_profile_ = profile;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLoginFailure(const LoginFailure& error) OVERRIDE {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL() << "OnLoginFailure not expected";
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLoginSuccess(const std::string& username,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& password,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool pending_requests,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool using_oauth) OVERRIDE {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL() << "OnLoginSuccess not expected";
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LockDevice(const std::string& username) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, InstallAttributesIsFirstInstall())
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(true))
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(false));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy::CloudPolicyDataStore* device_data_store =
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connector_->GetDeviceCloudPolicyDataStore();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_data_store->set_device_mode(policy::DEVICE_MODE_ENTERPRISE);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_data_store->set_device_id(kDeviceId);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(policy::EnterpriseInstallAttributes::LOCK_SUCCESS,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              connector_->LockDevice(username));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunUntilIdle();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrepareProfile(const std::string& username) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedDeviceSettingsTestHelper device_settings_test_helper;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockSessionManagerClient* session_manager_client =
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mock_dbus_thread_manager_.mock_session_manager_client();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*session_manager_client, StartSession(_));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*cryptohome_, GetSystemSalt())
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(std::string("stub_system_salt")));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_async_method_caller_, AsyncMount(_, _, _, _))
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<Authenticator> authenticator =
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LoginUtils::Get()->CreateAuthenticator(this);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    authenticator->CompleteLogin(ProfileManager::GetDefaultProfile(),
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 username,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 "password");
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool kPendingRequests = false;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool kUsingOAuth = true;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool kHasCookies = true;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoginUtils::Get()->PrepareProfile(username, std::string(), "password",
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      kPendingRequests, kUsingOAuth,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      kHasCookies, this);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_settings_test_helper.Flush();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunUntilIdle();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* PrepareOAuthFetcher(const std::string& expected_url) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID(0);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(fetcher);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(fetcher->delegate());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(StartsWithASCII(fetcher->GetOriginalURL().spec(),
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                expected_url,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                true));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_url(fetcher->GetOriginalURL());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_response_code(200);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_status(net::URLRequestStatus());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fetcher;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* PrepareDMServiceFetcher(
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& expected_url,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const em::DeviceManagementResponse& response) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID(0);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(fetcher);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(fetcher->delegate());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(StartsWithASCII(fetcher->GetOriginalURL().spec(),
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                expected_url,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                true));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_url(fetcher->GetOriginalURL());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_response_code(200);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_status(net::URLRequestStatus());
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(response.SerializeToString(&data));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->SetResponseString(data);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fetcher;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* PrepareDMRegisterFetcher() {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::DeviceManagementResponse response;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::DeviceRegisterResponse* register_response =
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        response.mutable_register_response();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register_response->set_device_management_token(kDMToken);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    register_response->set_enrollment_type(
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        em::DeviceRegisterResponse::ENTERPRISE);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PrepareDMServiceFetcher(kDMRegisterRequest, response);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* PrepareDMPolicyFetcher() {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::DeviceManagementResponse response;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response.mutable_policy_response()->add_response();
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PrepareDMServiceFetcher(kDMPolicyRequest, response);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedStubCrosEnabler stub_cros_enabler_;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop loop_;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingBrowserProcess* browser_process_;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedTestingLocalState local_state_;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IOThread> io_thread_state_;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDBusThreadManager mock_dbus_thread_manager_;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method::MockInputMethodManager mock_input_method_manager_;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcherFactory test_url_fetcher_factory_;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cryptohome::MockAsyncMethodCaller* mock_async_method_caller_;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy::BrowserPolicyConnector* connector_;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCryptohomeLibrary* cryptohome_;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* prepared_profile_;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedTempDir scoped_temp_dir_;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string device_policy_;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string user_policy_;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LoginUtilsTest);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsBlockingLoginTest
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public LoginUtilsTest,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public testing::WithParamInterface<int> {};
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LoginUtilsTest, NormalLoginDoesntBlock) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserManager* user_manager = UserManager::Get();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(!user_manager->IsUserLoggedIn());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connector_->IsEnterpriseManaged());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prepared_profile_);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile will be created without waiting for a policy response.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrepareProfile(kUsername);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prepared_profile_);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(user_manager->IsUserLoggedIn());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kUsername, user_manager->GetLoggedInUser()->email());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LoginUtilsTest, EnterpriseLoginDoesntBlockForNormalUser) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserManager* user_manager = UserManager::Get();
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(!user_manager->IsUserLoggedIn());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connector_->IsEnterpriseManaged());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prepared_profile_);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enroll the device.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LockDevice(kUsername);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(!user_manager->IsUserLoggedIn());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connector_->IsEnterpriseManaged());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kDomain, connector_->GetEnterpriseDomain());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prepared_profile_);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Login with a non-enterprise user shouldn't block.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrepareProfile(kUsernameOtherDomain);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prepared_profile_);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(user_manager->IsUserLoggedIn());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kUsernameOtherDomain, user_manager->GetLoggedInUser()->email());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LoginUtilsTest, OAuth1TokenFetchFailureUnblocksRefreshPolicies) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0. Check that a user is not logged in yet.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserManager* user_manager = UserManager::Get();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(!user_manager->IsUserLoggedIn());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connector_->IsEnterpriseManaged());
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prepared_profile_);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. Fake sign-in.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile will be created without waiting for a policy.
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver profile_creation_observer(
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_PROFILE_CREATED,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrepareProfile(kUsername);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until the profile is fully initialized. This makes sure the async
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefs init has finished, and the OnProfileCreated() callback has been
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invoked.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_creation_observer.Wait();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prepared_profile_);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(user_manager->IsUserLoggedIn());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kUsername, user_manager->GetLoggedInUser()->email());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. Get the pending oauth1 access token fetcher.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* fetcher =
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrepareOAuthFetcher(GaiaUrls::GetInstance()->get_oauth_token_url());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. Issuing a RefreshPolicies() now blocks waiting for the oauth token.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool refresh_policies_completed = false;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_process_->policy_service()->RefreshPolicies(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(SetFlag, &refresh_policies_completed));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunUntilIdle();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(refresh_policies_completed);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 4. Now make the fetcher fail. RefreshPolicies() should unblock.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The OAuth1TokenFetcher retries up to 5 times with a 3 second delay;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // just invoke the callback directly to avoid waiting for that.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The |mock_fetcher| is passed instead of the original because the original
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is deleted by the GaiaOAuthFetcher after the first callback.
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcherDelegate* delegate = fetcher->delegate();
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(delegate);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher mock_fetcher(fetcher->id(),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   fetcher->GetOriginalURL(),
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   delegate);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_fetcher.set_status(net::URLRequestStatus());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_fetcher.set_response_code(404);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 6; ++i) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(refresh_policies_completed);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->OnURLFetchComplete(&mock_fetcher);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunUntilIdle();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(refresh_policies_completed);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(LoginUtilsBlockingLoginTest, EnterpriseLoginBlocksForEnterpriseUser) {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserManager* user_manager = UserManager::Get();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(!user_manager->IsUserLoggedIn());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connector_->IsEnterpriseManaged());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prepared_profile_);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enroll the device.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LockDevice(kUsername);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(!user_manager->IsUserLoggedIn());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connector_->IsEnterpriseManaged());
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kDomain, connector_->GetEnterpriseDomain());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prepared_profile_);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Login with a user of the enterprise domain waits for policy.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrepareProfile(kUsername);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prepared_profile_);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(user_manager->IsUserLoggedIn());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GaiaUrls* gaia_urls = GaiaUrls::GetInstance();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* fetcher;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |steps| is the test parameter, and is the number of successful fetches.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The first incomplete fetch will fail. In any case, the profile creation
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should resume.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int steps = GetParam();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (steps < 1) break;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fake OAuth token retrieval:
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher = PrepareOAuthFetcher(gaia_urls->get_oauth_token_url());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fetcher);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ResponseCookies cookies;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookies.push_back(kOAuthTokenCookie);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_cookies(cookies);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (steps < 2) break;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fake OAuth access token retrieval:
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher = PrepareOAuthFetcher(gaia_urls->oauth_get_access_token_url());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fetcher);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->SetResponseString(kOAuthGetAccessTokenData);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (steps < 3) break;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fake OAuth service token retrieval:
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher = PrepareOAuthFetcher(gaia_urls->oauth_wrap_bridge_url());
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fetcher);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->SetResponseString(kOAuthServiceTokenData);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The cloud policy subsystem is now ready to fetch the dmtoken and the user
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // policy.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunUntilIdle();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (steps < 4) break;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher = PrepareDMRegisterFetcher();
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fetcher);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The policy fetch job has now been scheduled, run it:
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunUntilIdle();
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (steps < 5) break;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that there is no profile prepared just before the policy fetch.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(prepared_profile_);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher = PrepareDMPolicyFetcher();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fetcher);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (0);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (steps < 5) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that the profile hasn't been created yet.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(prepared_profile_);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make the current fetcher fail.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID(0);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(fetcher);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(fetcher->delegate());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_url(fetcher->GetOriginalURL());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_response_code(500);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile is finally ready:
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prepared_profile_);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoginUtilsBlockingLoginTestInstance,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoginUtilsBlockingLoginTest,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Values(0, 1, 2, 3, 4, 5));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
601