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