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" 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_configuration.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/authenticator.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_status_consumer.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/policy/enterprise_install_attributes.h" 26d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_test_helper.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/mock_owner_key_util.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/predictor.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h" 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/rlz/rlz.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/scoped_testing_local_state.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/cryptohome/mock_async_method_caller.h" 448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chromeos/cryptohome/system_salt_getter.h" 458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chromeos/dbus/fake_dbus_thread_manager.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/disks/disk_mount_manager.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/disks/mock_disk_mount_manager.h" 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/login/login_state.h" 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_handler.h" 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/system/mock_statistics_provider.h" 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/system/statistics_provider.h" 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/device_management_service.h" 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/policy_service.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/device_management_backend.pb.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "rlz/lib/rlz_value_store.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ::testing::AnyNumber; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace em = enterprise_management; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SaveArg; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDomain[] = "domain.com"; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUsername[] = "user@domain.com"; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDeviceId[] = "100200300"; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUsernameOtherDomain[] = "user@other.com"; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOAuthTokenCookie[] = "oauth_token=1234"; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kGaiaAccountDisabledResponse[] = "Error=AccountDeleted"; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOAuth2TokenPairData[] = 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{" 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"refresh_token\": \"1234\"," 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"access_token\": \"5678\"," 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"expires_in\": 3600" 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOAuth2AccessTokenData[] = 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{" 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"access_token\": \"5678\"," 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"expires_in\": 3600" 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMServer[] = "http://server/device_management"; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMRegisterRequest[] = 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://server/device_management?request=register"; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMPolicyRequest[] = 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://server/device_management?request=policy"; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDMToken[] = "1234"; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Single task of the fake IO loop used in the test, that just waits until 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// it is signaled to quit or perform some work. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |completion| is the event to wait for, and |work| is the task to invoke 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when signaled. If the task returns false then this quits the IO loop. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BlockLoop(base::WaitableEvent* completion, base::Callback<bool()> work) { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) do { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completion->Wait(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } while (work.Run()); 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->QuitNow(); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CopyLockResult(base::RunLoop* loop, 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy::EnterpriseInstallAttributes::LockResult* out, 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy::EnterpriseInstallAttributes::LockResult result) { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *out = result; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loop->Quit(); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsTest : public testing::Test, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public LoginUtils::Delegate, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public LoginStatusConsumer { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialization here is important. The UI thread gets the test's 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop, as does the file thread (which never actually gets 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // started - so this is a way to fake multiple threads on a single 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test thread). The IO thread does not get the message loop set, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and is never started. This is necessary so that we skip various 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bits of initialization that get posted to the IO thread. We do 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // however, at one point in the test, temporarily set the message 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loop for the IO thread. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsTest() 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : fake_io_thread_completion_(false, false), 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_("fake_io_thread"), 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) loop_(base::MessageLoop::TYPE_IO), 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_process_(TestingBrowserProcess::GetGlobal()), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_state_(browser_process_), 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_thread_(BrowserThread::UI, &loop_), 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) db_thread_(BrowserThread::DB, &loop_), 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_thread_(BrowserThread::FILE, &loop_), 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_input_method_manager_(NULL), 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_async_method_caller_(NULL), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connector_(NULL), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prepared_profile_(NULL) {} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This test is not a full blown InProcessBrowserTest, and doesn't have 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all the usual threads running. However a lot of subsystems pulled from 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ProfileImpl post to IO (usually from ProfileIOData), and DCHECK that 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // those tasks were posted. Those tasks in turn depend on a lot of other 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // components that aren't there during this test, so this kludge is used to 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have a running IO loop that doesn't really execute any tasks. 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See InvokeOnIO() below for a way to perform specific tasks on IO, when 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that's necessary. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A thread is needed to create a new MessageLoop, since there can be only 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // one loop per thread. 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_.StartWithOptions( 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop* fake_io_loop = fake_io_thread_.message_loop(); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make this loop enter the single task, BlockLoop(). Pass in the completion 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // event and the work callback. 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_.StopSoon(); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_loop->PostTask( 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlockLoop, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &fake_io_thread_completion_, 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LoginUtilsTest::DoIOWork, base::Unretained(this)))); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Map BrowserThread::IO to this loop. This allows posting to IO but nothing 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will be executed. 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) io_thread_.reset( 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new content::TestBrowserThread(BrowserThread::IO, fake_io_loop)); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitchASCII( 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::switches::kDeviceManagementUrl, kDMServer); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kLoginProfile, "user"); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DBusThreadManager should be initialized before io_thread_state_, as 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DBusThreadManager is used from chromeos::ProxyConfigServiceImpl, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which is part of io_thread_state_. 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DBusThreadManager::InitializeWithStub(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SystemSaltGetter::Initialize(); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginState::Initialize(); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(mock_statistics_provider_, GetMachineStatistic(_, _)) 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .WillRepeatedly(Return(false)); 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::system::StatisticsProvider::SetTestProvider( 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &mock_statistics_provider_); 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_input_method_manager_ = new input_method::MockInputMethodManager(); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_method::InitializeForTesting(mock_input_method_manager_); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disks::DiskMountManager::InitializeForTesting(&mock_disk_mount_manager_); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_disk_mount_manager_.SetupDefaultReplies(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_async_method_caller_ = new cryptohome::MockAsyncMethodCaller; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cryptohome::AsyncMethodCaller::InitializeForTesting( 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_async_method_caller_); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_device_settings_service_.reset(new ScopedTestDeviceSettingsService); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_cros_settings_.reset(new ScopedTestCrosSettings); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_user_manager_.reset(new ScopedTestUserManager); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // IOThread creates ProxyConfigServiceImpl and 2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // BrowserPolicyConnector::Init() creates a NetworkConfigurationUpdater, 2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // which both access NetworkHandler. Thus initialize it here before creating 2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // IOThread and before calling BrowserPolicyConnector::Init(). 2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NetworkHandler::Initialize(); 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_process_->SetProfileManager( 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ProfileManagerWithoutInit(scoped_temp_dir_.path())); 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) browser_process_->SetSystemRequestContext( 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new net::TestURLRequestContextGetter( 23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::MessageLoopProxy::current())); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connector_ = browser_process_->browser_policy_connector(); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connector_->Init(local_state_.Get(), 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_process_->system_request_context()); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) io_thread_state_.reset(new IOThread(local_state_.Get(), 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_process_->policy_service(), 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, NULL)); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_process_->SetIOThread(io_thread_state_.get()); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rlz_initialized_cb_ = base::Bind(&base::DoNothing); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rlz_lib::testing::SetRlzStoreDirectory(scoped_temp_dir_.path()); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RLZTracker::EnableZeroDelayForTesting(); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cryptohome::AsyncMethodCaller::Shutdown(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_async_method_caller_ = NULL; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_user_manager_.reset(); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvokeOnIO( 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LoginUtilsTest::TearDownOnIO, base::Unretained(this))); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LoginUtils instance must not outlive Profile instances. 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoginUtils::Set(NULL); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_method::Shutdown(); 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginState::Shutdown(); 2688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SystemSaltGetter::Shutdown(); 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These trigger some tasks that have to run while BrowserThread::UI 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exists. Delete all the profiles before deleting the connector. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_process_->SetProfileManager(NULL); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connector_ = NULL; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_process_->SetBrowserPolicyConnector(NULL); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuitIOLoop(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TearDownOnIO() { 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // chrome_browser_net::Predictor usually skips its shutdown routines on 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unit_tests, but does the full thing when 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // g_browser_process->profile_manager() is valid during initialization. 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // That includes a WaitableEvent on UI waiting for a task on IO, so that 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // task must execute. Do it directly from here now. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> profiles = 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_process_->profile_manager()->GetLoadedProfiles(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_browser_net::Predictor* predictor = 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profiles[i]->GetNetworkPredictor(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (predictor) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) predictor->EnablePredictorOnIOThread(false); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) predictor->Shutdown(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunUntilIdle() { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunUntilIdle(); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::GetBlockingPool()->FlushForTesting(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunUntilIdle(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invokes |task| on the IO loop and returns after it has executed. 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InvokeOnIO(const base::Closure& task) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_work_ = task; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_completion_.Signal(); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Makes the fake IO loop return. 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void QuitIOLoop() { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_completion_.Signal(); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper for BlockLoop, InvokeOnIO and QuitIOLoop. 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DoIOWork() { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_work = !fake_io_thread_work_.is_null(); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_work) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_work_.Run(); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_io_thread_work_.Reset(); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitWhenIdleClosure()); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there was work then keep waiting for more work. 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there was no work then quit the fake IO loop. 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_work; 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnProfilePrepared(Profile* profile) OVERRIDE { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prepared_profile_ = profile; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnRlzInitialized(Profile* profile) OVERRIDE { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rlz_initialized_cb_.Run(); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLoginFailure(const LoginFailure& error) OVERRIDE { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "OnLoginFailure not expected"; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void OnLoginSuccess(const UserContext& user_context) OVERRIDE { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "OnLoginSuccess not expected"; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void EnrollDevice(const std::string& username) { 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::RunLoop loop; 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy::EnterpriseInstallAttributes::LockResult result; 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connector_->GetInstallAttributes()->LockDevice( 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) username, policy::DEVICE_MODE_ENTERPRISE, kDeviceId, 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&CopyLockResult, &loop, &result)); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loop.Run(); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(policy::EnterpriseInstallAttributes::LOCK_SUCCESS, result); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrepareProfile(const std::string& username) { 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Normally this would happen during browser startup, but for tests 36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // we need to trigger creation of Profile-related services. 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ChromeBrowserMainExtraPartsProfiles:: 36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EnsureBrowserContextKeyedServiceFactoriesBuilt(); 36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DeviceSettingsTestHelper device_settings_test_helper; 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DeviceSettingsService::Get()->SetSessionManager( 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &device_settings_test_helper, new MockOwnerKeyUtil()); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_async_method_caller_, AsyncMount(_, _, _, _)) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return()); 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_async_method_caller_, AsyncGetSanitizedUsername(_, _)) 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(Return()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Authenticator> authenticator = 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils::Get()->CreateAuthenticator(this); 377d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) authenticator->CompleteLogin(ProfileHelper::GetSigninProfile(), 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserContext(username, 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "password", 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) username)); // username_hash 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool kUsingOAuth = true; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setting |kHasCookies| to false prevents ProfileAuthData::Transfer from 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // waiting for an IO task before proceeding. 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool kHasCookies = false; 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const bool kHasActiveSession = false; 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoginUtils::Get()->PrepareProfile( 3898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) UserContext(username, "password", std::string(), username, kUsingOAuth), 3908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string(), kHasCookies, kHasActiveSession, this); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_settings_test_helper.Flush(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DeviceSettingsService::Get()->UnsetSessionManager(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::TestURLFetcher* PrepareOAuthFetcher(const GURL& expected_url) { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID(0); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!fetcher) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher->delegate()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(fetcher->GetOriginalURL().spec(), 404d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) expected_url.spec(), 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_url(fetcher->GetOriginalURL()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_response_code(200); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_status(net::URLRequestStatus()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fetcher; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* PrepareDMServiceFetcher( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& expected_url, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const em::DeviceManagementResponse& response) { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID( 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::DeviceManagementService::kURLFetcherID); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!fetcher) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher->delegate()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(fetcher->GetOriginalURL().spec(), 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_url, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_url(fetcher->GetOriginalURL()); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_response_code(200); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_status(net::URLRequestStatus()); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(response.SerializeToString(&data)); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->SetResponseString(data); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fetcher; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* PrepareDMRegisterFetcher() { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceManagementResponse response; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceRegisterResponse* register_response = 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.mutable_register_response(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register_response->set_device_management_token(kDMToken); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register_response->set_enrollment_type( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceRegisterResponse::ENTERPRISE); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrepareDMServiceFetcher(kDMRegisterRequest, response); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* PrepareDMPolicyFetcher() { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) em::DeviceManagementResponse response; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.mutable_policy_response()->add_response(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrepareDMServiceFetcher(kDMPolicyRequest, response); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Must be the first member variable as browser_process_ and local_state_ 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // rely on this being set up. 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestingBrowserProcessInitializer initializer_; 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure fake_io_thread_work_; 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WaitableEvent fake_io_thread_completion_; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Thread fake_io_thread_; 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop loop_; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingBrowserProcess* browser_process_; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedTestingLocalState local_state_; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread db_thread_; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<content::TestBrowserThread> io_thread_; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<IOThread> io_thread_state_; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_method::MockInputMethodManager* mock_input_method_manager_; 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disks::MockDiskMountManager mock_disk_mount_manager_; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcherFactory test_url_fetcher_factory_; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cryptohome::MockAsyncMethodCaller* mock_async_method_caller_; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::system::MockStatisticsProvider mock_statistics_provider_; 4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy::BrowserPolicyConnector* connector_; 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ScopedTestDeviceSettingsService> test_device_settings_service_; 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ScopedTestCrosSettings> test_cros_settings_; 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ScopedTestUserManager> test_user_manager_; 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* prepared_profile_; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure rlz_initialized_cb_; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir scoped_temp_dir_; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string device_policy_; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string user_policy_; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginUtilsTest); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsBlockingLoginTest 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public LoginUtilsTest, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public testing::WithParamInterface<int> {}; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LoginUtilsTest, NormalLoginDoesntBlock) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager* user_manager = UserManager::Get(); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(connector_->IsEnterpriseManaged()); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(policy::USER_AFFILIATION_NONE, 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connector_->GetUserAffiliation(kUsername)); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile will be created without waiting for a policy response. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareProfile(kUsername); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prepared_profile_); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(user_manager->IsUserLoggedIn()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kUsername, user_manager->GetLoggedInUser()->email()); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LoginUtilsTest, EnterpriseLoginDoesntBlockForNormalUser) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager* user_manager = UserManager::Get(); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(connector_->IsEnterpriseManaged()); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enroll the device. 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnrollDevice(kUsername); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(connector_->IsEnterpriseManaged()); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDomain, connector_->GetEnterpriseDomain()); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(policy::USER_AFFILIATION_NONE, 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connector_->GetUserAffiliation(kUsernameOtherDomain)); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Login with a non-enterprise user shouldn't block. 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareProfile(kUsernameOtherDomain); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prepared_profile_); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(user_manager->IsUserLoggedIn()); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kUsernameOtherDomain, user_manager->GetLoggedInUser()->email()); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LoginUtilsTest, RlzInitialized) { 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No RLZ brand code set initially. 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(local_state_.Get()->HasPrefPath(prefs::kRLZBrand)); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RunLoop wait_for_rlz_init; 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rlz_initialized_cb_ = wait_for_rlz_init.QuitClosure(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareProfile(kUsername); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wait_for_rlz_init.Run(); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for blocking RLZ tasks to complete. 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RLZ brand code has been set to empty string. 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(local_state_.Get()->HasPrefPath(prefs::kRLZBrand)); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(std::string(), local_state_.Get()->GetString(prefs::kRLZBrand)); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RLZ value for homepage access point should have been initialized. 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 rlz_string; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(RLZTracker::GetAccessPointRlz( 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RLZTracker::CHROME_HOME_PAGE, &rlz_string)); 561d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_EQ(base::string16(), rlz_string); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(LoginUtilsBlockingLoginTest, EnterpriseLoginBlocksForEnterpriseUser) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager* user_manager = UserManager::Get(); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(connector_->IsEnterpriseManaged()); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enroll the device. 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnrollDevice(kUsername); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsUserLoggedIn()); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(connector_->IsEnterpriseManaged()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDomain, connector_->GetEnterpriseDomain()); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(policy::USER_AFFILIATION_MANAGED, 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connector_->GetUserAffiliation(kUsername)); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(user_manager->IsKnownUser(kUsername)); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Login with a user of the enterprise domain waits for policy. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareProfile(kUsername); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(user_manager->IsUserLoggedIn()); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(user_manager->IsCurrentUserNew()); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GaiaUrls* gaia_urls = GaiaUrls::GetInstance(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcher* fetcher; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |steps| is the test parameter, and is the number of successful fetches. 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first incomplete fetch will fail. In any case, the profile creation 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should resume. 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int steps = GetParam(); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The next expected fetcher ID. This is used to make it fail. 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_expected_fetcher_id = 0; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 1) break; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fake refresh token retrieval: 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->client_login_to_oauth2_url()); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ResponseCookies cookies; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies.push_back(kOAuthTokenCookie); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_cookies(cookies); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 2) break; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fake OAuth2 token pair retrieval: 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->oauth2_token_url()); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(kOAuth2TokenPairData); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 3) break; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fake OAuth2 access token retrieval: 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher = PrepareOAuthFetcher(gaia_urls->oauth2_token_url()); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(kOAuth2AccessTokenData); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cloud policy subsystem is now ready to fetch the dmtoken and the user 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // policy. 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_expected_fetcher_id = policy::DeviceManagementService::kURLFetcherID; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 4) break; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher = PrepareDMRegisterFetcher(); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The policy fetch job has now been scheduled, run it: 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunUntilIdle(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 5) break; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that there is no profile prepared just before the policy fetch. 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher = PrepareDMPolicyFetcher(); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunUntilIdle(); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (steps < 5) { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the profile hasn't been created yet. 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prepared_profile_); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make the current fetcher fail with a Gaia error. 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcher* fetcher = test_url_fetcher_factory_.GetFetcherByID( 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_expected_fetcher_id); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fetcher); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fetcher->delegate()); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->set_url(fetcher->GetOriginalURL()); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->set_response_code(401); 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This response body is important to make the gaia fetcher skip its delayed 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // retry behavior, which makes testing harder. If this is sent to the policy 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fetchers then it will make them fail too. 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher->SetResponseString(kGaiaAccountDisabledResponse); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunUntilIdle(); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile is finally ready: 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prepared_profile_); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P( 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsBlockingLoginTestInstance, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsBlockingLoginTest, 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(0, 1, 2, 3, 4, 5)); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace chromeos 678