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