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.
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"
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
;
61 namespace em
= enterprise_management
;
67 const char kUsername
[] = "test_user@gmail.com";
68 const char kNewUsername
[] = "test_new_user@gmail.com";
69 const char kPassword
[] = "test_password";
71 const char kPublicSessionAccountId
[] = "public_session_user@localhost";
72 const int kAutoLoginNoDelay
= 0;
73 const int kAutoLoginShortDelay
= 1;
74 const int kAutoLoginLongDelay
= 10000;
77 ACTION_P2(CreateAuthenticator
, username
, password
) {
78 return new MockAuthenticator(arg0
, username
, password
);
83 class ExistingUserControllerTest
: public policy::DevicePolicyCrosBrowserTest
,
84 public testing::WithParamInterface
<bool> {
86 ExistingUserControllerTest()
87 : mock_login_display_(NULL
), mock_user_manager_(NULL
) {}
89 ExistingUserController
* existing_user_controller() {
90 return ExistingUserController::current_controller();
93 const ExistingUserController
* existing_user_controller() const {
94 return ExistingUserController::current_controller();
97 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE
{
98 SetUpSessionManager();
100 DevicePolicyCrosBrowserTest::SetUpInProcessBrowserTestFixture();
102 mock_login_utils_
= new MockLoginUtils();
103 LoginUtils::Set(mock_login_utils_
);
104 EXPECT_CALL(*mock_login_utils_
, DelegateDeleted(_
))
107 mock_login_display_host_
.reset(new MockLoginDisplayHost());
108 mock_login_display_
= new MockLoginDisplay();
112 virtual void SetUpSessionManager() {
115 virtual void SetUpLoginDisplay() {
116 EXPECT_CALL(*mock_login_display_host_
.get(), CreateLoginDisplay(_
))
118 .WillOnce(Return(mock_login_display_
));
119 EXPECT_CALL(*mock_login_display_host_
.get(), GetNativeWindow())
121 .WillOnce(ReturnNull());
122 EXPECT_CALL(*mock_login_display_host_
.get(), OnPreferencesChanged())
124 EXPECT_CALL(*mock_login_display_
, Init(_
, false, true, true))
128 virtual void SetUpCommandLine(CommandLine
* command_line
) OVERRIDE
{
129 command_line
->AppendSwitch(switches::kLoginManager
);
131 command_line
->AppendSwitch(::switches::kMultiProfiles
);
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
))
141 .WillRepeatedly(Return(true));
142 EXPECT_CALL(*mock_user_manager_
, IsKnownUser(kNewUsername
))
144 .WillRepeatedly(Return(false));
145 EXPECT_CALL(*mock_user_manager_
, IsUserLoggedIn())
147 .WillRepeatedly(Return(false));
148 EXPECT_CALL(*mock_user_manager_
, IsLoggedInAsGuest())
150 .WillRepeatedly(Return(false));
151 EXPECT_CALL(*mock_user_manager_
, IsLoggedInAsDemoUser())
153 .WillRepeatedly(Return(false));
154 EXPECT_CALL(*mock_user_manager_
, IsLoggedInAsPublicAccount())
156 .WillRepeatedly(Return(false));
157 EXPECT_CALL(*mock_user_manager_
, IsSessionStarted())
159 .WillRepeatedly(Return(false));
160 EXPECT_CALL(*mock_user_manager_
, IsCurrentUserNew())
162 .WillRepeatedly(Return(false));
163 EXPECT_CALL(*mock_user_manager_
, Shutdown())
165 EXPECT_CALL(*mock_user_manager_
, GetProfileByUser(_
))
167 .WillRepeatedly(Return(testing_profile_
.get()));
170 virtual void SetUpOnMainThread() OVERRIDE
{
171 testing_profile_
.reset(new TestingProfile());
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());
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();
195 // ExistingUserController private member accessors.
196 base::OneShotTimer
<ExistingUserController
>* auto_login_timer() {
197 return existing_user_controller()->auto_login_timer_
.get();
200 const std::string
& auto_login_username() const {
201 return existing_user_controller()->public_session_auto_login_username_
;
204 int auto_login_delay() const {
205 return existing_user_controller()->public_session_auto_login_delay_
;
208 bool is_login_in_progress() const {
209 return existing_user_controller()->is_login_in_progress_
;
212 scoped_ptr
<ExistingUserController
> existing_user_controller_
;
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_
;
219 // Owned by LoginUtilsWrapper.
220 MockLoginUtils
* mock_login_utils_
;
222 MockUserManager
* mock_user_manager_
; // Not owned.
223 scoped_ptr
<ScopedUserManagerEnabler
> user_manager_enabler_
;
225 scoped_ptr
<TestingProfile
> testing_profile_
;
228 MockURLFetcherFactory
<SuccessFetcher
> factory_
;
230 base::Callback
<void(void)> profile_prepared_cb_
;
233 DISALLOW_COPY_AND_ASSIGN(ExistingUserControllerTest
);
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))
241 EXPECT_CALL(*mock_login_utils_
, CreateAuthenticator(_
))
243 .WillOnce(WithArg
<0>(CreateAuthenticator(kUsername
, kPassword
)));
244 EXPECT_CALL(*mock_login_utils_
,
245 PrepareProfile(UserContext(kUsername
, kPassword
, "", kUsername
),
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()))
254 EXPECT_CALL(*mock_login_display_
, OnLoginSuccess(kUsername
))
256 EXPECT_CALL(*mock_login_display_
, SetUIEnabled(true))
258 EXPECT_CALL(*mock_login_display_
, OnFadeOut())
260 EXPECT_CALL(*mock_login_display_host_
,
261 StartWizardPtr(WizardController::kTermsOfServiceScreenName
, NULL
))
263 EXPECT_CALL(*mock_user_manager_
, IsCurrentUserNew())
265 .WillRepeatedly(Return(false));
266 existing_user_controller()->Login(UserContext(kUsername
, kPassword
, ""));
267 content::RunAllPendingInMessageLoop();
270 IN_PROC_BROWSER_TEST_P(ExistingUserControllerTest
, AutoEnrollAfterSignIn
) {
271 EXPECT_CALL(*mock_login_display_host_
,
272 StartWizardPtr(WizardController::kEnrollmentScreenName
,
275 EXPECT_CALL(*mock_login_display_
, OnFadeOut())
277 EXPECT_CALL(*mock_login_display_host_
.get(), OnCompleteLogin())
279 EXPECT_CALL(*mock_user_manager_
, IsCurrentUserNew())
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))
287 .InSequence(uiEnabledSequence
);
288 EXPECT_CALL(*mock_login_display_
, SetUIEnabled(true))
290 .InSequence(uiEnabledSequence
);
291 existing_user_controller()->DoAutoEnrollment();
292 existing_user_controller()->CompleteLogin(
293 UserContext(kUsername
, kPassword
, ""));
294 content::RunAllPendingInMessageLoop();
297 IN_PROC_BROWSER_TEST_P(ExistingUserControllerTest
,
298 NewUserDontAutoEnrollAfterSignIn
) {
299 EXPECT_CALL(*mock_login_display_host_
,
300 StartWizardPtr(WizardController::kEnrollmentScreenName
,
303 EXPECT_CALL(*mock_login_display_host_
,
304 StartWizardPtr(WizardController::kTermsOfServiceScreenName
,
307 EXPECT_CALL(*mock_login_utils_
, CreateAuthenticator(_
))
309 .WillOnce(WithArg
<0>(CreateAuthenticator(kNewUsername
, kPassword
)));
310 EXPECT_CALL(*mock_login_utils_
,
311 PrepareProfile(UserContext(kNewUsername
,
317 .WillOnce(InvokeWithoutArgs(&profile_prepared_cb_
,
318 &base::Callback
<void(void)>::Run
));
319 EXPECT_CALL(*mock_login_display_
, OnLoginSuccess(kNewUsername
))
321 EXPECT_CALL(*mock_login_display_
, OnFadeOut())
323 EXPECT_CALL(*mock_login_display_host_
.get(), OnCompleteLogin())
325 EXPECT_CALL(*mock_user_manager_
, IsCurrentUserNew())
327 .WillRepeatedly(Return(true));
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))
336 .InSequence(uiEnabledSequence
);
337 EXPECT_CALL(*mock_login_display_
, SetUIEnabled(true))
339 .InSequence(uiEnabledSequence
);
341 existing_user_controller()->CompleteLogin(
342 UserContext(kNewUsername
, kPassword
, ""));
343 content::RunAllPendingInMessageLoop();
346 MATCHER_P(HasDetails
, expected
, "") {
347 return expected
== *content::Details
<const std::string
>(arg
).ptr();
350 class ExistingUserControllerPublicSessionTest
351 : public ExistingUserControllerTest
{
353 ExistingUserControllerPublicSessionTest()
354 : public_session_user_id_(policy::GenerateDeviceLocalAccountUserId(
355 kPublicSessionAccountId
,
356 policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION
)) {
359 virtual void SetUpOnMainThread() OVERRIDE
{
360 ExistingUserControllerTest::SetUpOnMainThread();
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();
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
;
379 store
->AddObserver(&observer
);
380 EXPECT_CALL(observer
, OnStoreLoaded(store
))
382 .WillOnce(InvokeWithoutArgs(&loop
, &base::RunLoop::Quit
));
384 store
->RemoveObserver(&observer
);
388 virtual void SetUpSessionManager() OVERRIDE
{
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
);
397 em::DeviceLocalAccountInfoProto::ACCOUNT_TYPE_PUBLIC_SESSION
);
398 RefreshDevicePolicy();
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());
414 virtual void SetUpLoginDisplay() OVERRIDE
{
415 EXPECT_CALL(*mock_login_display_host_
.get(), CreateLoginDisplay(_
))
417 .WillOnce(Return(mock_login_display_
));
418 EXPECT_CALL(*mock_login_display_host_
.get(), GetNativeWindow())
420 .WillRepeatedly(ReturnNull());
421 EXPECT_CALL(*mock_login_display_host_
.get(), OnPreferencesChanged())
423 EXPECT_CALL(*mock_login_display_
, Init(_
, _
, _
, _
))
427 virtual void SetUpUserManager() OVERRIDE
{
430 void ExpectSuccessfulLogin(const std::string
& username
,
431 const std::string
& password
) {
432 EXPECT_CALL(*mock_login_display_
, SetUIEnabled(false))
434 EXPECT_CALL(*mock_login_utils_
, CreateAuthenticator(_
))
436 .WillOnce(WithArg
<0>(CreateAuthenticator(username
, password
)));
437 EXPECT_CALL(*mock_login_utils_
,
438 PrepareProfile(UserContext(username
, password
, "", username
),
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()))
447 EXPECT_CALL(*mock_login_display_
, OnLoginSuccess(username
))
449 EXPECT_CALL(*mock_login_display_
, SetUIEnabled(true))
451 EXPECT_CALL(*mock_login_display_
, OnFadeOut())
453 EXPECT_CALL(*mock_login_display_host_
,
454 StartWizardPtr(WizardController::kTermsOfServiceScreenName
,
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.
464 em::ChromeDeviceSettingsProto
& proto(device_policy()->payload());
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());
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());
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();
494 // Wait for ExistingUserController to read the updated settings.
501 void ConfigureAutoLogin() {
502 existing_user_controller()->ConfigurePublicSessionAutoLogin();
505 void FireAutoLogin() {
506 existing_user_controller()->OnPublicSessionAutoLoginTimerFire();
509 const std::string public_session_user_id_
;
512 DISALLOW_COPY_AND_ASSIGN(ExistingUserControllerPublicSessionTest
);
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());
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());
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());
537 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest
,
539 // Set up mocks to check login success.
540 ExpectSuccessfulLogin(public_session_user_id_
, "");
541 existing_user_controller()->OnSigninScreenReady();
543 // Start auto-login and wait for login tasks to complete.
544 SetAutoLoginPolicy(kPublicSessionAccountId
, kAutoLoginNoDelay
);
545 content::RunAllPendingInMessageLoop();
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.
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());
567 // Wait for login tasks to complete.
568 content::RunAllPendingInMessageLoop();
571 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest
,
572 LoginStopsAutoLogin
) {
573 // Set up mocks to check login success.
574 ExpectSuccessfulLogin(kUsername
, kPassword
);
576 existing_user_controller()->OnSigninScreenReady();
577 SetAutoLoginPolicy(kPublicSessionAccountId
, kAutoLoginLongDelay
);
578 ASSERT_TRUE(auto_login_timer());
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());
586 // Wait for login tasks to complete.
587 content::RunAllPendingInMessageLoop();
589 // Timer should still be stopped after login completes.
590 ASSERT_TRUE(auto_login_timer());
591 EXPECT_FALSE(auto_login_timer()->IsRunning());
594 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest
,
595 GuestModeLoginStopsAutoLogin
) {
596 EXPECT_CALL(*mock_login_display_
, SetUIEnabled(false))
598 EXPECT_CALL(*mock_login_utils_
, CreateAuthenticator(_
))
600 .WillOnce(WithArg
<0>(CreateAuthenticator(kUsername
, kPassword
)));
601 EXPECT_CALL(*mock_login_utils_
, CompleteOffTheRecordLogin(_
))
604 existing_user_controller()->OnSigninScreenReady();
605 SetAutoLoginPolicy(kPublicSessionAccountId
, kAutoLoginLongDelay
);
606 ASSERT_TRUE(auto_login_timer());
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());
614 // Wait for login tasks to complete.
615 content::RunAllPendingInMessageLoop();
617 // Timer should still be stopped after login completes.
618 ASSERT_TRUE(auto_login_timer());
619 EXPECT_FALSE(auto_login_timer()->IsRunning());
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())
629 existing_user_controller()->OnSigninScreenReady();
630 SetAutoLoginPolicy(kPublicSessionAccountId
, kAutoLoginLongDelay
);
631 ASSERT_TRUE(auto_login_timer());
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());
639 // Wait for login tasks to complete.
640 content::RunAllPendingInMessageLoop();
642 // Timer should still be stopped after login completes.
643 ASSERT_TRUE(auto_login_timer());
644 EXPECT_FALSE(auto_login_timer()->IsRunning());
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());
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());
661 // Wait for login tasks to complete.
662 content::RunAllPendingInMessageLoop();
664 // Timer should still be stopped after login completes.
665 ASSERT_TRUE(auto_login_timer());
666 EXPECT_FALSE(auto_login_timer()->IsRunning());
669 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest
,
670 PRE_TestLoadingPublicUsersFromLocalState
) {
671 // First run propagates public accounts and stores them in Local State.
674 IN_PROC_BROWSER_TEST_P(ExistingUserControllerPublicSessionTest
,
675 TestLoadingPublicUsersFromLocalState
) {
676 // Second run loads list of public accounts from Local State.
679 INSTANTIATE_TEST_CASE_P(ExistingUserControllerTestInstantiation
,
680 ExistingUserControllerTest
,
683 INSTANTIATE_TEST_CASE_P(ExistingUserControllerPublicSessionTestInstantiation
,
684 ExistingUserControllerPublicSessionTest
,
687 } // namespace chromeos