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