login_utils_browsertest.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
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" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/run_loop.h" 155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/waitable_event.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread.h" 1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_configuration.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/authenticator.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_status_consumer.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/policy/enterprise_install_attributes.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_test_helper.h" 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/mock_owner_key_util.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/predictor.h" 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/rlz/rlz.h" 3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/chrome_content_client.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/test/base/chrome_unit_test_suite.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/scoped_testing_local_state.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/cryptohome/mock_async_method_caller.h" 478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chromeos/cryptohome/system_salt_getter.h" 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chromeos/dbus/fake_dbus_thread_manager.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/disks/disk_mount_manager.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/disks/mock_disk_mount_manager.h" 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/login/login_state.h" 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_handler.h" 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/system/mock_statistics_provider.h" 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/system/statistics_provider.h" 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/device_management_service.h" 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/policy_service.h" 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_switches.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/device_management_backend.pb.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/message_center/message_center.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "rlz/lib/rlz_value_store.h" 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ::testing::AnyNumber; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace em = enterprise_management; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SaveArg; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDomain[] = "domain.com"; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUsername[] = "user@domain.com"; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDeviceId[] = "100200300"; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUsernameOtherDomain[] = "user@other.com"; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOAuthTokenCookie[] = "oauth_token=1234"; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kGaiaAccountDisabledResponse[] = "Error=AccountDeleted"; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOAuth2TokenPairData[] = 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{" 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"refresh_token\": \"1234\"," 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"access_token\": \"5678\"," 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"expires_in\": 3600" 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOAuth2AccessTokenData[] = 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{" 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"access_token\": \"5678\"," 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"expires_in\": 3600" 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMServer[] = "http://server/device_management"; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMRegisterRequest[] = 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://server/device_management?request=register"; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMPolicyRequest[] = 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://server/device_management?request=policy"; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMToken[] = "1234"; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Single task of the fake IO loop used in the test, that just waits until 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// it is signaled to quit or perform some work. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |completion| is the event to wait for, and |work| is the task to invoke 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when signaled. If the task returns false then this quits the IO loop. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BlockLoop(base::WaitableEvent* completion, base::Callback<bool()> work) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) do { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completion->Wait(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } while (work.Run()); 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->QuitNow(); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CopyLockResult(base::RunLoop* loop, 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy::EnterpriseInstallAttributes::LockResult* out, 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy::EnterpriseInstallAttributes::LockResult result) { 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *out = result; 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loop->Quit(); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsTest : public testing::Test, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public LoginUtils::Delegate, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public LoginStatusConsumer { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialization here is important. The UI thread gets the test's 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop, as does the file thread (which never actually gets 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // started - so this is a way to fake multiple threads on a single 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test thread). The IO thread does not get the message loop set, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and is never started. This is necessary so that we skip various 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bits of initialization that get posted to the IO thread. We do 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // however, at one point in the test, temporarily set the message 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loop for the IO thread. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsTest() 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : fake_io_thread_completion_(false, false), 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_("fake_io_thread"), 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_process_(TestingBrowserProcess::GetGlobal()), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_state_(browser_process_), 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_thread_(BrowserThread::UI, &loop_), 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) db_thread_(BrowserThread::DB, &loop_), 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_thread_(BrowserThread::FILE, &loop_), 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_input_method_manager_(NULL), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_async_method_caller_(NULL), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connector_(NULL), 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prepared_profile_(NULL) {} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 16723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ChromeUnitTestSuite::InitializeProviders(); 16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ChromeUnitTestSuite::InitializeResourceBundle(); 16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 17023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_client_.reset(new ChromeContentClient); 17123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::SetContentClient(content_client_.get()); 17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) browser_content_client_.reset(new chrome::ChromeContentBrowserClient()); 17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::SetBrowserClientForTesting(browser_content_client_.get()); 17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This test is not a full blown InProcessBrowserTest, and doesn't have 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all the usual threads running. However a lot of subsystems pulled from 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ProfileImpl post to IO (usually from ProfileIOData), and DCHECK that 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // those tasks were posted. Those tasks in turn depend on a lot of other 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // components that aren't there during this test, so this kludge is used to 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have a running IO loop that doesn't really execute any tasks. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See InvokeOnIO() below for a way to perform specific tasks on IO, when 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that's necessary. 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A thread is needed to create a new MessageLoop, since there can be only 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // one loop per thread. 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_.StartWithOptions( 18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop* fake_io_loop = fake_io_thread_.message_loop(); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make this loop enter the single task, BlockLoop(). Pass in the completion 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // event and the work callback. 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_.StopSoon(); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_loop->PostTask( 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlockLoop, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &fake_io_thread_completion_, 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LoginUtilsTest::DoIOWork, base::Unretained(this)))); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Map BrowserThread::IO to this loop. This allows posting to IO but nothing 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will be executed. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) io_thread_.reset( 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new content::TestBrowserThread(BrowserThread::IO, fake_io_loop)); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitchASCII( 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::switches::kDeviceManagementUrl, kDMServer); 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!command_line->HasSwitch(::switches::kMultiProfiles)) 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kLoginProfile, "user"); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DBusThreadManager should be initialized before io_thread_state_, as 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DBusThreadManager is used from chromeos::ProxyConfigServiceImpl, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which is part of io_thread_state_. 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DBusThreadManager::InitializeWithStub(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SystemSaltGetter::Initialize(); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginState::Initialize(); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(mock_statistics_provider_, GetMachineStatistic(_, _)) 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .WillRepeatedly(Return(false)); 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::system::StatisticsProvider::SetTestProvider( 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &mock_statistics_provider_); 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_input_method_manager_ = new input_method::MockInputMethodManager(); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_method::InitializeForTesting(mock_input_method_manager_); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disks::DiskMountManager::InitializeForTesting(&mock_disk_mount_manager_); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_disk_mount_manager_.SetupDefaultReplies(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_async_method_caller_ = new cryptohome::MockAsyncMethodCaller; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cryptohome::AsyncMethodCaller::InitializeForTesting( 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_async_method_caller_); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_device_settings_service_.reset(new ScopedTestDeviceSettingsService); 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_cros_settings_.reset(new ScopedTestCrosSettings); 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_user_manager_.reset(new ScopedTestUserManager); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // IOThread creates ProxyConfigServiceImpl and 2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // BrowserPolicyConnector::Init() creates a NetworkConfigurationUpdater, 2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // which both access NetworkHandler. Thus initialize it here before creating 2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // IOThread and before calling BrowserPolicyConnector::Init(). 2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NetworkHandler::Initialize(); 2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_process_->SetProfileManager( 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ProfileManagerWithoutInit(scoped_temp_dir_.path())); 24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) browser_process_->SetSystemRequestContext( 24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new net::TestURLRequestContextGetter( 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::MessageLoopProxy::current())); 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connector_ = 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_process_->platform_part()->browser_policy_connector_chromeos(); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connector_->Init(local_state_.Get(), 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_process_->system_request_context()); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) io_thread_state_.reset(new IOThread(local_state_.Get(), 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_process_->policy_service(), 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, NULL)); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_process_->SetIOThread(io_thread_state_.get()); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rlz_initialized_cb_ = base::Bind(&base::DoNothing); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rlz_lib::testing::SetRlzStoreDirectory(scoped_temp_dir_.path()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RLZTracker::EnableZeroDelayForTesting(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Message center is used by UserManager. 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message_center::MessageCenter::Initialize(); 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cryptohome::AsyncMethodCaller::Shutdown(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_async_method_caller_ = NULL; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message_center::MessageCenter::Shutdown(); 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_user_manager_.reset(); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvokeOnIO( 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LoginUtilsTest::TearDownOnIO, base::Unretained(this))); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LoginUtils instance must not outlive Profile instances. 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoginUtils::Set(NULL); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) system::StatisticsProvider::SetTestProvider(NULL); 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_method::Shutdown(); 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginState::Shutdown(); 2908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SystemSaltGetter::Shutdown(); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These trigger some tasks that have to run while BrowserThread::UI 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exists. Delete all the profiles before deleting the connector. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_process_->SetProfileManager(NULL); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connector_ = NULL; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_process_->SetBrowserPolicyConnector(NULL); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuitIOLoop(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 29923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 30023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) browser_content_client_.reset(); 30123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_client_.reset(); 30223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::SetContentClient(NULL); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TearDownOnIO() { 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // chrome_browser_net::Predictor usually skips its shutdown routines on 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unit_tests, but does the full thing when 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // g_browser_process->profile_manager() is valid during initialization. 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // That includes a WaitableEvent on UI waiting for a task on IO, so that 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // task must execute. Do it directly from here now. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> profiles = 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_process_->profile_manager()->GetLoadedProfiles(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_browser_net::Predictor* predictor = 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profiles[i]->GetNetworkPredictor(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (predictor) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) predictor->EnablePredictorOnIOThread(false); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) predictor->Shutdown(); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunUntilIdle() { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunUntilIdle(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::GetBlockingPool()->FlushForTesting(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunUntilIdle(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invokes |task| on the IO loop and returns after it has executed. 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InvokeOnIO(const base::Closure& task) { 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_work_ = task; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_completion_.Signal(); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Makes the fake IO loop return. 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void QuitIOLoop() { 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_completion_.Signal(); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper for BlockLoop, InvokeOnIO and QuitIOLoop. 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DoIOWork() { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_work = !fake_io_thread_work_.is_null(); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_work) 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_work_.Run(); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_work_.Reset(); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitWhenIdleClosure()); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there was work then keep waiting for more work. 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there was no work then quit the fake IO loop. 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_work; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnProfilePrepared(Profile* profile) OVERRIDE { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prepared_profile_ = profile; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnRlzInitialized(Profile* profile) OVERRIDE { 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rlz_initialized_cb_.Run(); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLoginFailure(const LoginFailure& error) OVERRIDE { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "OnLoginFailure not expected"; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void OnLoginSuccess(const UserContext& user_context) OVERRIDE { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "OnLoginSuccess not expected"; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void EnrollDevice(const std::string& username) { 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::RunLoop loop; 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy::EnterpriseInstallAttributes::LockResult result; 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connector_->GetInstallAttributes()->LockDevice( 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) username, policy::DEVICE_MODE_ENTERPRISE, kDeviceId, 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&CopyLockResult, &loop, &result)); 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loop.Run(); 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(policy::EnterpriseInstallAttributes::LOCK_SUCCESS, result); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrepareProfile(const std::string& username) { 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Normally this would happen during browser startup, but for tests 38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // we need to trigger creation of Profile-related services. 38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ChromeBrowserMainExtraPartsProfiles:: 39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EnsureBrowserContextKeyedServiceFactoriesBuilt(); 39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DeviceSettingsTestHelper device_settings_test_helper; 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DeviceSettingsService::Get()->SetSessionManager( 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &device_settings_test_helper, new MockOwnerKeyUtil()); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_async_method_caller_, AsyncMount(_, _, _, _)) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return()); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_async_method_caller_, AsyncGetSanitizedUsername(_, _)) 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(Return()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Authenticator> authenticator = 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils::Get()->CreateAuthenticator(this); 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) authenticator->CompleteLogin(ProfileHelper::GetSigninProfile(), 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserContext(username, 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "password", 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) username)); // username_hash 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool kUsingOAuth = true; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setting |kHasCookies| to false prevents ProfileAuthData::Transfer from 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // waiting for an IO task before proceeding. 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool kHasCookies = false; 41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const bool kHasActiveSession = false; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoginUtils::Get()->PrepareProfile( 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UserContext(username, 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "password", 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(), 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) username, 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kUsingOAuth, 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UserContext::AUTH_FLOW_GAIA_WITHOUT_SAML), 4218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string(), kHasCookies, kHasActiveSession, this); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_settings_test_helper.Flush(); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DeviceSettingsService::Get()->UnsetSessionManager(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 428d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::TestURLFetcher* PrepareOAuthFetcher(const GURL& expected_url) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID(0); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!fetcher) 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher->delegate()); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(fetcher->GetOriginalURL().spec(), 435d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) expected_url.spec(), 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_url(fetcher->GetOriginalURL()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_response_code(200); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_status(net::URLRequestStatus()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fetcher; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* PrepareDMServiceFetcher( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& expected_url, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const em::DeviceManagementResponse& response) { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID( 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::DeviceManagementService::kURLFetcherID); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!fetcher) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher->delegate()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(fetcher->GetOriginalURL().spec(), 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_url, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_url(fetcher->GetOriginalURL()); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_response_code(200); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_status(net::URLRequestStatus()); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(response.SerializeToString(&data)); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->SetResponseString(data); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fetcher; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* PrepareDMRegisterFetcher() { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceManagementResponse response; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceRegisterResponse* register_response = 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.mutable_register_response(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register_response->set_device_management_token(kDMToken); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register_response->set_enrollment_type( 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceRegisterResponse::ENTERPRISE); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrepareDMServiceFetcher(kDMRegisterRequest, response); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* PrepareDMPolicyFetcher() { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceManagementResponse response; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.mutable_policy_response()->add_response(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrepareDMServiceFetcher(kDMPolicyRequest, response); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Must be the first member variable as browser_process_ and local_state_ 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // rely on this being set up. 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestingBrowserProcessInitializer initializer_; 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 48523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<ChromeContentClient> content_client_; 48623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<chrome::ChromeContentBrowserClient> browser_content_client_; 48723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure fake_io_thread_work_; 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WaitableEvent fake_io_thread_completion_; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Thread fake_io_thread_; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopForIO loop_; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingBrowserProcess* browser_process_; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedTestingLocalState local_state_; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread db_thread_; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<content::TestBrowserThread> io_thread_; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<IOThread> io_thread_state_; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_method::MockInputMethodManager* mock_input_method_manager_; 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disks::MockDiskMountManager mock_disk_mount_manager_; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcherFactory test_url_fetcher_factory_; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cryptohome::MockAsyncMethodCaller* mock_async_method_caller_; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::system::MockStatisticsProvider mock_statistics_provider_; 5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::BrowserPolicyConnectorChromeOS* connector_; 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ScopedTestDeviceSettingsService> test_device_settings_service_; 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ScopedTestCrosSettings> test_cros_settings_; 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ScopedTestUserManager> test_user_manager_; 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* prepared_profile_; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure rlz_initialized_cb_; 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir scoped_temp_dir_; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string device_policy_; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string user_policy_; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginUtilsTest); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LoginUtilsParamTest 530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public LoginUtilsTest, 531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public testing::WithParamInterface<bool> { 532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoginUtilsParamTest() {} 534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetUp() OVERRIDE { 536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (GetParam()) 538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) command_line->AppendSwitch(::switches::kMultiProfiles); 539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoginUtilsTest::SetUp(); 540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginUtilsParamTest); 544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsBlockingLoginTest 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public LoginUtilsTest, 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public testing::WithParamInterface<int> {}; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(LoginUtilsParamTest, NormalLoginDoesntBlock) { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager* user_manager = UserManager::Get(); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(connector_->IsEnterpriseManaged()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(policy::USER_AFFILIATION_NONE, 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connector_->GetUserAffiliation(kUsername)); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile will be created without waiting for a policy response. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareProfile(kUsername); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prepared_profile_); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(user_manager->IsUserLoggedIn()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kUsername, user_manager->GetLoggedInUser()->email()); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(LoginUtilsParamTest, EnterpriseLoginDoesntBlockForNormalUser) { 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager* user_manager = UserManager::Get(); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(connector_->IsEnterpriseManaged()); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enroll the device. 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnrollDevice(kUsername); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(connector_->IsEnterpriseManaged()); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDomain, connector_->GetEnterpriseDomain()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(policy::USER_AFFILIATION_NONE, 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connector_->GetUserAffiliation(kUsernameOtherDomain)); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Login with a non-enterprise user shouldn't block. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareProfile(kUsernameOtherDomain); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prepared_profile_); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(user_manager->IsUserLoggedIn()); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kUsernameOtherDomain, user_manager->GetLoggedInUser()->email()); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(LoginUtilsParamTest, RlzInitialized) { 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No RLZ brand code set initially. 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(local_state_.Get()->HasPrefPath(prefs::kRLZBrand)); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RunLoop wait_for_rlz_init; 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rlz_initialized_cb_ = wait_for_rlz_init.QuitClosure(); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareProfile(kUsername); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wait_for_rlz_init.Run(); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for blocking RLZ tasks to complete. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RLZ brand code has been set to empty string. 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(local_state_.Get()->HasPrefPath(prefs::kRLZBrand)); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(std::string(), local_state_.Get()->GetString(prefs::kRLZBrand)); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RLZ value for homepage access point should have been initialized. 609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 rlz_string; 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(RLZTracker::GetAccessPointRlz( 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RLZTracker::CHROME_HOME_PAGE, &rlz_string)); 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::string16(), rlz_string); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(LoginUtilsBlockingLoginTest, EnterpriseLoginBlocksForEnterpriseUser) { 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager* user_manager = UserManager::Get(); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(connector_->IsEnterpriseManaged()); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enroll the device. 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnrollDevice(kUsername); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(connector_->IsEnterpriseManaged()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDomain, connector_->GetEnterpriseDomain()); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(policy::USER_AFFILIATION_MANAGED, 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connector_->GetUserAffiliation(kUsername)); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsKnownUser(kUsername)); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Login with a user of the enterprise domain waits for policy. 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareProfile(kUsername); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(user_manager->IsUserLoggedIn()); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(user_manager->IsCurrentUserNew()); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GaiaUrls* gaia_urls = GaiaUrls::GetInstance(); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* fetcher; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |steps| is the test parameter, and is the number of successful fetches. 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first incomplete fetch will fail. In any case, the profile creation 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should resume. 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int steps = GetParam(); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The next expected fetcher ID. This is used to make it fail. 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_expected_fetcher_id = 0; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 1) break; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fake refresh token retrieval: 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->client_login_to_oauth2_url()); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ResponseCookies cookies; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies.push_back(kOAuthTokenCookie); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_cookies(cookies); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 2) break; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fake OAuth2 token pair retrieval: 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->oauth2_token_url()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(kOAuth2TokenPairData); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 3) break; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fake OAuth2 access token retrieval: 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->oauth2_token_url()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(kOAuth2AccessTokenData); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cloud policy subsystem is now ready to fetch the dmtoken and the user 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // policy. 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_expected_fetcher_id = policy::DeviceManagementService::kURLFetcherID; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 4) break; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher = PrepareDMRegisterFetcher(); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The policy fetch job has now been scheduled, run it: 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 5) break; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that there is no profile prepared just before the policy fetch. 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher = PrepareDMPolicyFetcher(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunUntilIdle(); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 5) { 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the profile hasn't been created yet. 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make the current fetcher fail with a Gaia error. 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID( 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_expected_fetcher_id); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher->delegate()); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_url(fetcher->GetOriginalURL()); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(401); 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This response body is important to make the gaia fetcher skip its delayed 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // retry behavior, which makes testing harder. If this is sent to the policy 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fetchers then it will make them fail too. 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(kGaiaAccountDisabledResponse); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunUntilIdle(); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile is finally ready: 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prepared_profile_); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P( 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsBlockingLoginTestInstance, 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsBlockingLoginTest, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(0, 1, 2, 3, 4, 5)); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(LoginUtilsParamTestInstantiation, 727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoginUtilsParamTest, 728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) testing::Bool()); 729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace chromeos 733