Home | History | Annotate | Download | only in login
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <vector>
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "base/callback.h"
     10 #include "base/command_line.h"
     11 #include "base/location.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/run_loop.h"
     14 #include "chrome/browser/chrome_notification_types.h"
     15 #include "chrome/browser/chromeos/login/authenticator.h"
     16 #include "chrome/browser/chromeos/login/existing_user_controller.h"
     17 #include "chrome/browser/chromeos/login/helper.h"
     18 #include "chrome/browser/chromeos/login/mock_authenticator.h"
     19 #include "chrome/browser/chromeos/login/mock_login_display.h"
     20 #include "chrome/browser/chromeos/login/mock_login_display_host.h"
     21 #include "chrome/browser/chromeos/login/mock_login_utils.h"
     22 #include "chrome/browser/chromeos/login/mock_url_fetchers.h"
     23 #include "chrome/browser/chromeos/login/mock_user_manager.h"
     24 #include "chrome/browser/chromeos/login/user_manager.h"
     25 #include "chrome/browser/chromeos/login/wizard_controller.h"
     26 #include "chrome/browser/chromeos/policy/device_local_account.h"
     27 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
     28 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
     29 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
     30 #include "chrome/browser/chromeos/settings/cros_settings.h"
     31 #include "chrome/browser/policy/browser_policy_connector.h"
     32 #include "chrome/common/chrome_switches.h"
     33 #include "chrome/test/base/testing_browser_process.h"
     34 #include "chrome/test/base/testing_profile.h"
     35 #include "chrome/test/base/ui_test_utils.h"
     36 #include "chromeos/chromeos_switches.h"
     37 #include "chromeos/dbus/fake_session_manager_client.h"
     38 #include "chromeos/settings/cros_settings_names.h"
     39 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
     40 #include "components/policy/core/common/cloud/cloud_policy_core.h"
     41 #include "components/policy/core/common/cloud/cloud_policy_store.h"
     42 #include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
     43 #include "components/policy/core/common/cloud/policy_builder.h"
     44 #include "content/public/test/mock_notification_observer.h"
     45 #include "content/public/test/test_utils.h"
     46 #include "google_apis/gaia/mock_url_fetcher_factory.h"
     47 #include "grit/generated_resources.h"
     48 #include "testing/gmock/include/gmock/gmock.h"
     49 #include "testing/gtest/include/gtest/gtest.h"
     50 #include "ui/base/l10n/l10n_util.h"
     51 
     52 using ::testing::AnyNumber;
     53 using ::testing::Invoke;
     54 using ::testing::InvokeWithoutArgs;
     55 using ::testing::Return;
     56 using ::testing::ReturnNull;
     57 using ::testing::Sequence;
     58 using ::testing::WithArg;
     59 using ::testing::_;
     60 
     61 namespace em = enterprise_management;
     62 
     63 namespace chromeos {
     64 
     65 namespace {
     66 
     67 const char kUsername[] = "test_user (at) gmail.com";
     68 const char kNewUsername[] = "test_new_user (at) gmail.com";
     69 const char kPassword[] = "test_password";
     70 
     71 const char kPublicSessionAccountId[] = "public_session_user@localhost";
     72 const int kAutoLoginNoDelay = 0;
     73 const int kAutoLoginShortDelay = 1;
     74 const int kAutoLoginLongDelay = 10000;
     75 
     76 
     77 ACTION_P2(CreateAuthenticator, username, password) {
     78   return new MockAuthenticator(arg0, username, password);
     79 }
     80 
     81 }  // namespace
     82 
     83 class ExistingUserControllerTest : public policy::DevicePolicyCrosBrowserTest,
     84                                    public testing::WithParamInterface<bool> {
     85  protected:
     86   ExistingUserControllerTest()
     87       : mock_login_display_(NULL), mock_user_manager_(NULL) {}
     88 
     89   ExistingUserController* existing_user_controller() {
     90     return ExistingUserController::current_controller();
     91   }
     92 
     93   const ExistingUserController* existing_user_controller() const {
     94     return ExistingUserController::current_controller();
     95   }
     96 
     97   virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
     98     SetUpSessionManager();
     99 
    100     DevicePolicyCrosBrowserTest::SetUpInProcessBrowserTestFixture();
    101 
    102     mock_login_utils_ = new MockLoginUtils();
    103     LoginUtils::Set(mock_login_utils_);
    104     EXPECT_CALL(*mock_login_utils_, DelegateDeleted(_))
    105         .Times(1);
    106 
    107     mock_login_display_host_.reset(new MockLoginDisplayHost());
    108     mock_login_display_ = new MockLoginDisplay();
    109     SetUpLoginDisplay();
    110   }
    111 
    112   virtual void SetUpSessionManager() {
    113   }
    114 
    115   virtual void SetUpLoginDisplay() {
    116     EXPECT_CALL(*mock_login_display_host_.get(), CreateLoginDisplay(_))
    117         .Times(1)
    118         .WillOnce(Return(mock_login_display_));
    119     EXPECT_CALL(*mock_login_display_host_.get(), GetNativeWindow())
    120         .Times(1)
    121         .WillOnce(ReturnNull());
    122     EXPECT_CALL(*mock_login_display_host_.get(), OnPreferencesChanged())
    123         .Times(1);
    124     EXPECT_CALL(*mock_login_display_, Init(_, false, true, true))
    125         .Times(1);
    126   }
    127 
    128   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
    129     command_line->AppendSwitch(switches::kLoginManager);
    130     if (GetParam())
    131       command_line->AppendSwitch(::switches::kMultiProfiles);
    132   }
    133 
    134   virtual void SetUpUserManager() {
    135     // Replace the UserManager singleton with a mock.
    136     mock_user_manager_ = new MockUserManager;
    137     user_manager_enabler_.reset(
    138         new ScopedUserManagerEnabler(mock_user_manager_));
    139     EXPECT_CALL(*mock_user_manager_, IsKnownUser(kUsername))
    140         .Times(AnyNumber())
    141         .WillRepeatedly(Return(true));
    142     EXPECT_CALL(*mock_user_manager_, IsKnownUser(kNewUsername))
    143         .Times(AnyNumber())
    144         .WillRepeatedly(Return(false));
    145     EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
    146         .Times(AnyNumber())
    147         .WillRepeatedly(Return(false));
    148     EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest())
    149         .Times(AnyNumber())
    150         .WillRepeatedly(Return(false));
    151     EXPECT_CALL(*mock_user_manager_, IsLoggedInAsDemoUser())
    152         .Times(AnyNumber())
    153         .WillRepeatedly(Return(false));
    154     EXPECT_CALL(*mock_user_manager_, IsLoggedInAsPublicAccount())
    155         .Times(AnyNumber())
    156         .WillRepeatedly(Return(false));
    157     EXPECT_CALL(*mock_user_manager_, IsSessionStarted())
    158         .Times(AnyNumber())
    159         .WillRepeatedly(Return(false));
    160     EXPECT_CALL(*mock_user_manager_, IsCurrentUserNew())
    161         .Times(AnyNumber())
    162         .WillRepeatedly(Return(false));
    163     EXPECT_CALL(*mock_user_manager_, Shutdown())
    164         .Times(1);
    165     EXPECT_CALL(*mock_user_manager_, GetProfileByUser(_))
    166         .Times(AnyNumber())
    167         .WillRepeatedly(Return(testing_profile_.get()));
    168   }
    169 
    170   virtual void SetUpOnMainThread() OVERRIDE {
    171     testing_profile_.reset(new TestingProfile());
    172     SetUpUserManager();
    173     existing_user_controller_.reset(
    174         new ExistingUserController(mock_login_display_host_.get()));
    175     ASSERT_EQ(existing_user_controller(), existing_user_controller_.get());
    176     existing_user_controller_->Init(UserList());
    177     profile_prepared_cb_ =
    178         base::Bind(&ExistingUserController::OnProfilePrepared,
    179                    base::Unretained(existing_user_controller()),
    180                    testing_profile_.get());
    181   }
    182 
    183   virtual void CleanUpOnMainThread() OVERRIDE {
    184     // ExistingUserController must be deleted before the thread is cleaned up:
    185     // If there is an outstanding login attempt when ExistingUserController is
    186     // deleted, its LoginPerformer instance will be deleted, which in turn
    187     // deletes its OnlineAttemptHost instance.  However, OnlineAttemptHost must
    188     // be deleted on the UI thread.
    189     existing_user_controller_.reset();
    190     DevicePolicyCrosBrowserTest::InProcessBrowserTest::CleanUpOnMainThread();
    191     testing_profile_.reset(NULL);
    192     user_manager_enabler_.reset();
    193   }
    194 
    195   // ExistingUserController private member accessors.
    196   base::OneShotTimer<ExistingUserController>* auto_login_timer() {
    197     return existing_user_controller()->auto_login_timer_.get();
    198   }
    199 
    200   const std::string& auto_login_username() const {
    201     return existing_user_controller()->public_session_auto_login_username_;
    202   }
    203 
    204   int auto_login_delay() const {
    205     return existing_user_controller()->public_session_auto_login_delay_;
    206   }
    207 
    208   bool is_login_in_progress() const {
    209     return existing_user_controller()->is_login_in_progress_;
    210   }
    211 
    212   scoped_ptr<ExistingUserController> existing_user_controller_;
    213 
    214   // |mock_login_display_| is owned by the ExistingUserController, which calls
    215   // CreateLoginDisplay() on the |mock_login_display_host_| to get it.
    216   MockLoginDisplay* mock_login_display_;
    217   scoped_ptr<MockLoginDisplayHost> mock_login_display_host_;
    218 
    219   // Owned by LoginUtilsWrapper.
    220   MockLoginUtils* mock_login_utils_;
    221 
    222   MockUserManager* mock_user_manager_;  // Not owned.
    223   scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_;
    224 
    225   scoped_ptr<TestingProfile> testing_profile_;
    226 
    227   // Mock URLFetcher.
    228   MockURLFetcherFactory<SuccessFetcher> factory_;
    229 
    230   base::Callback<void(void)> profile_prepared_cb_;
    231 
    232  private:
    233   DISALLOW_COPY_AND_ASSIGN(ExistingUserControllerTest);
    234 };
    235 
    236 IN_PROC_BROWSER_TEST_P(ExistingUserControllerTest, ExistingUserLogin) {
    237   // This is disabled twice: once right after signin but before checking for
    238   // auto-enrollment, and again after doing an ownership status check.
    239   EXPECT_CALL(*mock_login_display_, SetUIEnabled(false))
    240       .Times(2);
    241   EXPECT_CALL(*mock_login_utils_, CreateAuthenticator(_))
    242       .Times(1)
    243       .WillOnce(WithArg<0>(CreateAuthenticator(kUsername, kPassword)));
    244   EXPECT_CALL(*mock_login_utils_,
    245               PrepareProfile(UserContext(kUsername, kPassword, "", kUsername),
    246                              _, _, _, _))
    247       .Times(1)
    248       .WillOnce(InvokeWithoutArgs(&profile_prepared_cb_,
    249                                   &base::Callback<void(void)>::Run));
    250   EXPECT_CALL(*mock_login_utils_,
    251               DoBrowserLaunch(testing_profile_.get(),
    252                               mock_login_display_host_.get()))
    253       .Times(1);
    254   EXPECT_CALL(*mock_login_display_, OnLoginSuccess(kUsername))
    255       .Times(1);
    256   EXPECT_CALL(*mock_login_display_, SetUIEnabled(true))
    257       .Times(1);
    258   EXPECT_CALL(*mock_login_display_, OnFadeOut())
    259       .Times(1);
    260   EXPECT_CALL(*mock_login_display_host_,
    261               StartWizardPtr(WizardController::kTermsOfServiceScreenName, NULL))
    262       .Times(0);
    263   EXPECT_CALL(*mock_user_manager_, IsCurrentUserNew())
    264       .Times(AnyNumber())
    265       .WillRepeatedly(Return(false));
    266   existing_user_controller()->Login(UserContext(kUsername, kPassword, ""));
    267   content::RunAllPendingInMessageLoop();
    268 }
    269 
    270 IN_PROC_BROWSER_TEST_P(ExistingUserControllerTest, AutoEnrollAfterSignIn) {
    271   EXPECT_CALL(*mock_login_display_host_,
    272               StartWizardPtr(WizardController::kEnrollmentScreenName,
    273                              _))
    274       .Times(1);
    275   EXPECT_CALL(*mock_login_display_, OnFadeOut())
    276       .Times(1);
    277   EXPECT_CALL(*mock_login_display_host_.get(), OnCompleteLogin())
    278       .Times(1);
    279   EXPECT_CALL(*mock_user_manager_, IsCurrentUserNew())
    280       .Times(AnyNumber())
    281       .WillRepeatedly(Return(false));
    282   // The order of these expected calls matters: the UI if first disabled
    283   // during the login sequence, and is enabled again for the enrollment screen.
    284   Sequence uiEnabledSequence;
    285   EXPECT_CALL(*mock_login_display_, SetUIEnabled(false))
    286       .Times(1)
    287       .InSequence(uiEnabledSequence);
    288   EXPECT_CALL(*mock_login_display_, SetUIEnabled(true))
    289       .Times(1)
    290       .InSequence(uiEnabledSequence);
    291   existing_user_controller()->DoAutoEnrollment();
    292   existing_user_controller()->CompleteLogin(
    293       UserContext(kUsername, kPassword, ""));
    294   content::RunAllPendingInMessageLoop();
    295 }
    296 
    297 IN_PROC_BROWSER_TEST_P(ExistingUserControllerTest,
    298                        NewUserDontAutoEnrollAfterSignIn) {
    299   EXPECT_CALL(*mock_login_display_host_,
    300               StartWizardPtr(WizardController::kEnrollmentScreenName,
    301                              _))
    302       .Times(0);
    303   EXPECT_CALL(*mock_login_display_host_,
    304               StartWizardPtr(WizardController::kTermsOfServiceScreenName,
    305                              NULL))
    306       .Times(1);
    307   EXPECT_CALL(*mock_login_utils_, CreateAuthenticator(_))
    308       .Times(1)
    309       .WillOnce(WithArg<0>(CreateAuthenticator(kNewUsername, kPassword)));
    310   EXPECT_CALL(*mock_login_utils_,
    311               PrepareProfile(UserContext(kNewUsername,
    312                                          kPassword,
    313                                          std::string(),
    314                                          kNewUsername),
    315                              _, _, _, _))
    316       .Times(1)
    317       .WillOnce(InvokeWithoutArgs(&profile_prepared_cb_,
    318                                   &base::Callback<void(void)>::Run));
    319   EXPECT_CALL(*mock_login_display_, OnLoginSuccess(kNewUsername))
    320       .Times(1);
    321   EXPECT_CALL(*mock_login_display_, OnFadeOut())
    322       .Times(1);
    323   EXPECT_CALL(*mock_login_display_host_.get(), OnCompleteLogin())
    324       .Times(1);
    325   EXPECT_CALL(*mock_user_manager_, IsCurrentUserNew())
    326       .Times(AnyNumber())
    327       .WillRepeatedly(Return(true));
    328 
    329   // The order of these expected calls matters: the UI if first disabled
    330   // during the login sequence, and is enabled again after login completion.
    331   Sequence uiEnabledSequence;
    332   // This is disabled twice: once right after signin but before checking for
    333   // auto-enrollment, and again after doing an ownership status check.
    334   EXPECT_CALL(*mock_login_display_, SetUIEnabled(false))
    335       .Times(2)
    336       .InSequence(uiEnabledSequence);
    337   EXPECT_CALL(*mock_login_display_, SetUIEnabled(true))
    338       .Times(1)
    339       .InSequence(uiEnabledSequence);
    340 
    341   existing_user_controller()->CompleteLogin(
    342       UserContext(kNewUsername, kPassword, ""));
    343   content::RunAllPendingInMessageLoop();
    344 }
    345 
    346 MATCHER_P(HasDetails, expected, "") {
    347   return expected == *content::Details<const std::string>(arg).ptr();
    348 }
    349 
    350 class ExistingUserControllerPublicSessionTest
    351     : public ExistingUserControllerTest {
    352  protected:
    353   ExistingUserControllerPublicSessionTest()
    354       : public_session_user_id_(policy::GenerateDeviceLocalAccountUserId(
    355             kPublicSessionAccountId,
    356             policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)) {
    357   }
    358 
    359   virtual void SetUpOnMainThread() OVERRIDE {
    360     ExistingUserControllerTest::SetUpOnMainThread();
    361 
    362     // Wait for the public session user to be created.
    363     if (!chromeos::UserManager::Get()->IsKnownUser(public_session_user_id_)) {
    364       content::WindowedNotificationObserver(
    365           chrome::NOTIFICATION_USER_LIST_CHANGED,
    366           base::Bind(&chromeos::UserManager::IsKnownUser,
    367                      base::Unretained(chromeos::UserManager::Get()),
    368                      public_session_user_id_)).Wait();
    369     }
    370 
    371     // Wait for the device local account policy to be installed.
    372     policy::CloudPolicyStore* store = TestingBrowserProcess::GetGlobal()->
    373         browser_policy_connector()->GetDeviceLocalAccountPolicyService()->
    374         GetBrokerForUser(public_session_user_id_)->core()->store();
    375     if (!store->has_policy()) {
    376       policy::MockCloudPolicyStoreObserver observer;
    377 
    378       base::RunLoop loop;
    379       store->AddObserver(&observer);
    380       EXPECT_CALL(observer, OnStoreLoaded(store))
    381           .Times(1)
    382           .WillOnce(InvokeWithoutArgs(&loop, &base::RunLoop::Quit));
    383       loop.Run();
    384       store->RemoveObserver(&observer);
    385     }
    386   }
    387 
    388   virtual void SetUpSessionManager() OVERRIDE {
    389     InstallOwnerKey();
    390 
    391     // Setup the device policy.
    392     em::ChromeDeviceSettingsProto& proto(device_policy()->payload());
    393     em::DeviceLocalAccountInfoProto* account =
    394         proto.mutable_device_local_accounts()->add_account();
    395     account->set_account_id(kPublicSessionAccountId);
    396     account->set_type(
    397         em::DeviceLocalAccountInfoProto::ACCOUNT_TYPE_PUBLIC_SESSION);
    398     RefreshDevicePolicy();
    399 
    400     // Setup the device local account policy.
    401     policy::UserPolicyBuilder device_local_account_policy;
    402     device_local_account_policy.policy_data().set_username(
    403         kPublicSessionAccountId);
    404     device_local_account_policy.policy_data().set_policy_type(
    405         policy::dm_protocol::kChromePublicAccountPolicyType);
    406     device_local_account_policy.policy_data().set_settings_entity_id(
    407         kPublicSessionAccountId);
    408     device_local_account_policy.Build();
    409     session_manager_client()->set_device_local_account_policy(
    410         kPublicSessionAccountId,
    411         device_local_account_policy.GetBlob());
    412   }
    413 
    414   virtual void SetUpLoginDisplay() OVERRIDE {
    415     EXPECT_CALL(*mock_login_display_host_.get(), CreateLoginDisplay(_))
    416         .Times(1)
    417         .WillOnce(Return(mock_login_display_));
    418     EXPECT_CALL(*mock_login_display_host_.get(), GetNativeWindow())
    419       .Times(AnyNumber())
    420       .WillRepeatedly(ReturnNull());
    421     EXPECT_CALL(*mock_login_display_host_.get(), OnPreferencesChanged())
    422       .Times(AnyNumber());
    423     EXPECT_CALL(*mock_login_display_, Init(_, _, _, _))
    424       .Times(AnyNumber());
    425   }
    426 
    427   virtual void SetUpUserManager() OVERRIDE {
    428   }
    429 
    430   void ExpectSuccessfulLogin(const std::string& username,
    431                              const std::string& password) {
    432     EXPECT_CALL(*mock_login_display_, SetUIEnabled(false))
    433         .Times(AnyNumber());
    434     EXPECT_CALL(*mock_login_utils_, CreateAuthenticator(_))
    435         .Times(1)
    436         .WillOnce(WithArg<0>(CreateAuthenticator(username, password)));
    437     EXPECT_CALL(*mock_login_utils_,
    438                 PrepareProfile(UserContext(username, password, "", username),
    439                                _, _, _, _))
    440         .Times(1)
    441         .WillOnce(InvokeWithoutArgs(&profile_prepared_cb_,
    442                                     &base::Callback<void(void)>::Run));
    443     EXPECT_CALL(*mock_login_utils_,
    444                 DoBrowserLaunch(testing_profile_.get(),
    445                                 mock_login_display_host_.get()))
    446         .Times(1);
    447     EXPECT_CALL(*mock_login_display_, OnLoginSuccess(username))
    448         .Times(1);
    449     EXPECT_CALL(*mock_login_display_, SetUIEnabled(true))
    450         .Times(1);
    451     EXPECT_CALL(*mock_login_display_, OnFadeOut())
    452         .Times(1);
    453     EXPECT_CALL(*mock_login_display_host_,
    454                 StartWizardPtr(WizardController::kTermsOfServiceScreenName,
    455                                NULL))
    456         .Times(0);
    457   }
    458 
    459   void SetAutoLoginPolicy(const std::string& username, int delay) {
    460     // Wait until ExistingUserController has finished auto-login
    461     // configuration by observing the same settings that trigger
    462     // ConfigurePublicSessionAutoLogin.
    463 
    464     em::ChromeDeviceSettingsProto& proto(device_policy()->payload());
    465 
    466     // If both settings have changed we need to wait for both to
    467     // propagate, so check the new values against the old ones.
    468     scoped_refptr<content::MessageLoopRunner> runner1;
    469     scoped_ptr<CrosSettings::ObserverSubscription> subscription1;
    470     if (!proto.has_device_local_accounts() ||
    471         !proto.device_local_accounts().has_auto_login_id() ||
    472         proto.device_local_accounts().auto_login_id() != username) {
    473       runner1 = new content::MessageLoopRunner;
    474       subscription1 = chromeos::CrosSettings::Get()->AddSettingsObserver(
    475           chromeos::kAccountsPrefDeviceLocalAccountAutoLoginId,
    476           runner1->QuitClosure());
    477     }
    478     scoped_refptr<content::MessageLoopRunner> runner2;
    479     scoped_ptr<CrosSettings::ObserverSubscription> subscription2;
    480     if (!proto.has_device_local_accounts() ||
    481         !proto.device_local_accounts().has_auto_login_delay() ||
    482         proto.device_local_accounts().auto_login_delay() != delay) {
    483       runner1 = new content::MessageLoopRunner;
    484       subscription1 = chromeos::CrosSettings::Get()->AddSettingsObserver(
    485           chromeos::kAccountsPrefDeviceLocalAccountAutoLoginDelay,
    486           runner1->QuitClosure());
    487     }
    488 
    489     // Update the policy.
    490     proto.mutable_device_local_accounts()->set_auto_login_id(username);
    491     proto.mutable_device_local_accounts()->set_auto_login_delay(delay);
    492     RefreshDevicePolicy();
    493 
    494     // Wait for ExistingUserController to read the updated settings.
    495     if (runner1.get())
    496       runner1->Run();
    497     if (runner2.get())
    498       runner2->Run();
    499   }
    500 
    501   void ConfigureAutoLogin() {
    502     existing_user_controller()->ConfigurePublicSessionAutoLogin();
    503   }
    504 
    505   void FireAutoLogin() {
    506     existing_user_controller()->OnPublicSessionAutoLoginTimerFire();
    507   }
    508 
    509   const std::string public_session_user_id_;
    510 
    511  private:
    512   DISALLOW_COPY_AND_ASSIGN(ExistingUserControllerPublicSessionTest);
    513 };
    514 
    515 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    516                        ConfigureAutoLoginUsingPolicy) {
    517   existing_user_controller()->OnSigninScreenReady();
    518   EXPECT_EQ("", auto_login_username());
    519   EXPECT_EQ(0, auto_login_delay());
    520   EXPECT_FALSE(auto_login_timer());
    521 
    522   // Set the policy.
    523   SetAutoLoginPolicy(kPublicSessionAccountId, kAutoLoginLongDelay);
    524   EXPECT_EQ(public_session_user_id_, auto_login_username());
    525   EXPECT_EQ(kAutoLoginLongDelay, auto_login_delay());
    526   ASSERT_TRUE(auto_login_timer());
    527   EXPECT_TRUE(auto_login_timer()->IsRunning());
    528 
    529   // Unset the policy.
    530   SetAutoLoginPolicy("", 0);
    531   EXPECT_EQ("", auto_login_username());
    532   EXPECT_EQ(0, auto_login_delay());
    533   ASSERT_TRUE(auto_login_timer());
    534   EXPECT_FALSE(auto_login_timer()->IsRunning());
    535 }
    536 
    537 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    538                        AutoLoginNoDelay) {
    539   // Set up mocks to check login success.
    540   ExpectSuccessfulLogin(public_session_user_id_, "");
    541   existing_user_controller()->OnSigninScreenReady();
    542 
    543   // Start auto-login and wait for login tasks to complete.
    544   SetAutoLoginPolicy(kPublicSessionAccountId, kAutoLoginNoDelay);
    545   content::RunAllPendingInMessageLoop();
    546 }
    547 
    548 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    549                        AutoLoginShortDelay) {
    550   // Set up mocks to check login success.
    551   ExpectSuccessfulLogin(public_session_user_id_, "");
    552   existing_user_controller()->OnSigninScreenReady();
    553   SetAutoLoginPolicy(kPublicSessionAccountId, kAutoLoginShortDelay);
    554   ASSERT_TRUE(auto_login_timer());
    555   // Don't assert that timer is running: with the short delay sometimes
    556   // the trigger happens before the assert.  We've already tested that
    557   // the timer starts when it should.
    558 
    559   // Wait for the timer to fire.
    560   base::RunLoop runner;
    561   base::OneShotTimer<base::RunLoop> timer;
    562   timer.Start(FROM_HERE,
    563               base::TimeDelta::FromMilliseconds(kAutoLoginShortDelay + 1),
    564               runner.QuitClosure());
    565   runner.Run();
    566 
    567   // Wait for login tasks to complete.
    568   content::RunAllPendingInMessageLoop();
    569 }
    570 
    571 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    572                        LoginStopsAutoLogin) {
    573   // Set up mocks to check login success.
    574   ExpectSuccessfulLogin(kUsername, kPassword);
    575 
    576   existing_user_controller()->OnSigninScreenReady();
    577   SetAutoLoginPolicy(kPublicSessionAccountId, kAutoLoginLongDelay);
    578   ASSERT_TRUE(auto_login_timer());
    579 
    580   // Login and check that it stopped the timer.
    581   existing_user_controller()->Login(UserContext(kUsername, kPassword, ""));
    582   EXPECT_TRUE(is_login_in_progress());
    583   ASSERT_TRUE(auto_login_timer());
    584   EXPECT_FALSE(auto_login_timer()->IsRunning());
    585 
    586   // Wait for login tasks to complete.
    587   content::RunAllPendingInMessageLoop();
    588 
    589   // Timer should still be stopped after login completes.
    590   ASSERT_TRUE(auto_login_timer());
    591   EXPECT_FALSE(auto_login_timer()->IsRunning());
    592 }
    593 
    594 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    595                        GuestModeLoginStopsAutoLogin) {
    596   EXPECT_CALL(*mock_login_display_, SetUIEnabled(false))
    597       .Times(1);
    598   EXPECT_CALL(*mock_login_utils_, CreateAuthenticator(_))
    599       .Times(1)
    600       .WillOnce(WithArg<0>(CreateAuthenticator(kUsername, kPassword)));
    601   EXPECT_CALL(*mock_login_utils_, CompleteOffTheRecordLogin(_))
    602       .Times(1);
    603 
    604   existing_user_controller()->OnSigninScreenReady();
    605   SetAutoLoginPolicy(kPublicSessionAccountId, kAutoLoginLongDelay);
    606   ASSERT_TRUE(auto_login_timer());
    607 
    608   // Login and check that it stopped the timer.
    609   existing_user_controller()->LoginAsGuest();
    610   EXPECT_TRUE(is_login_in_progress());
    611   ASSERT_TRUE(auto_login_timer());
    612   EXPECT_FALSE(auto_login_timer()->IsRunning());
    613 
    614   // Wait for login tasks to complete.
    615   content::RunAllPendingInMessageLoop();
    616 
    617   // Timer should still be stopped after login completes.
    618   ASSERT_TRUE(auto_login_timer());
    619   EXPECT_FALSE(auto_login_timer()->IsRunning());
    620 }
    621 
    622 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    623                        CompleteLoginStopsAutoLogin) {
    624   // Set up mocks to check login success.
    625   ExpectSuccessfulLogin(kUsername, kPassword);
    626   EXPECT_CALL(*mock_login_display_host_, OnCompleteLogin())
    627       .Times(1);
    628 
    629   existing_user_controller()->OnSigninScreenReady();
    630   SetAutoLoginPolicy(kPublicSessionAccountId, kAutoLoginLongDelay);
    631   ASSERT_TRUE(auto_login_timer());
    632 
    633   // Check that login completes and stops the timer.
    634   existing_user_controller()->CompleteLogin(
    635       UserContext(kUsername, kPassword, ""));
    636   ASSERT_TRUE(auto_login_timer());
    637   EXPECT_FALSE(auto_login_timer()->IsRunning());
    638 
    639   // Wait for login tasks to complete.
    640   content::RunAllPendingInMessageLoop();
    641 
    642   // Timer should still be stopped after login completes.
    643   ASSERT_TRUE(auto_login_timer());
    644   EXPECT_FALSE(auto_login_timer()->IsRunning());
    645 }
    646 
    647 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    648                        PublicSessionLoginStopsAutoLogin) {
    649   // Set up mocks to check login success.
    650   ExpectSuccessfulLogin(public_session_user_id_, "");
    651   existing_user_controller()->OnSigninScreenReady();
    652   SetAutoLoginPolicy(kPublicSessionAccountId, kAutoLoginLongDelay);
    653   ASSERT_TRUE(auto_login_timer());
    654 
    655   // Login and check that it stopped the timer.
    656   existing_user_controller()->LoginAsPublicAccount(public_session_user_id_);
    657   EXPECT_TRUE(is_login_in_progress());
    658   ASSERT_TRUE(auto_login_timer());
    659   EXPECT_FALSE(auto_login_timer()->IsRunning());
    660 
    661   // Wait for login tasks to complete.
    662   content::RunAllPendingInMessageLoop();
    663 
    664   // Timer should still be stopped after login completes.
    665   ASSERT_TRUE(auto_login_timer());
    666   EXPECT_FALSE(auto_login_timer()->IsRunning());
    667 }
    668 
    669 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    670                        PRE_TestLoadingPublicUsersFromLocalState) {
    671   // First run propagates public accounts and stores them in Local State.
    672 }
    673 
    674 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest,
    675                        TestLoadingPublicUsersFromLocalState) {
    676   // Second run loads list of public accounts from Local State.
    677 }
    678 
    679 INSTANTIATE_TEST_CASE_P(ExistingUserControllerTestInstantiation,
    680                         ExistingUserControllerTest,
    681                         testing::Bool());
    682 
    683 INSTANTIATE_TEST_CASE_P(ExistingUserControllerPublicSessionTestInstantiation,
    684                         ExistingUserControllerPublicSessionTest,
    685                         testing::Bool());
    686 
    687 }  // namespace chromeos
    688