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.
5 #include "chrome/browser/chromeos/login/wizard_controller.h"
7 #include "base/basictypes.h"
8 #include "base/command_line.h"
9 #include "base/compiler_specific.h"
10 #include "base/path_service.h"
11 #include "base/prefs/pref_registry_simple.h"
12 #include "base/prefs/pref_service.h"
13 #include "base/prefs/pref_service_factory.h"
14 #include "base/prefs/testing_pref_store.h"
15 #include "base/run_loop.h"
16 #include "base/strings/string_util.h"
17 #include "base/strings/utf_string_conversions.h"
18 #include "chrome/browser/browser_process.h"
19 #include "chrome/browser/browser_shutdown.h"
20 #include "chrome/browser/chrome_notification_types.h"
21 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
22 #include "chrome/browser/chromeos/base/locale_util.h"
23 #include "chrome/browser/chromeos/geolocation/simple_geolocation_provider.h"
24 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
25 #include "chrome/browser/chromeos/login/enrollment/mock_auto_enrollment_check_screen.h"
26 #include "chrome/browser/chromeos/login/enrollment/mock_enrollment_screen.h"
27 #include "chrome/browser/chromeos/login/existing_user_controller.h"
28 #include "chrome/browser/chromeos/login/screens/error_screen.h"
29 #include "chrome/browser/chromeos/login/screens/hid_detection_screen.h"
30 #include "chrome/browser/chromeos/login/screens/mock_eula_screen.h"
31 #include "chrome/browser/chromeos/login/screens/mock_network_screen.h"
32 #include "chrome/browser/chromeos/login/screens/mock_update_screen.h"
33 #include "chrome/browser/chromeos/login/screens/network_screen.h"
34 #include "chrome/browser/chromeos/login/screens/reset_screen.h"
35 #include "chrome/browser/chromeos/login/screens/user_image_screen.h"
36 #include "chrome/browser/chromeos/login/screens/wrong_hwid_screen.h"
37 #include "chrome/browser/chromeos/login/startup_utils.h"
38 #include "chrome/browser/chromeos/login/test/wizard_in_process_browser_test.h"
39 #include "chrome/browser/chromeos/login/test_login_utils.h"
40 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
41 #include "chrome/browser/chromeos/login/ui/webui_login_view.h"
42 #include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
43 #include "chrome/browser/chromeos/policy/server_backed_device_state.h"
44 #include "chrome/browser/chromeos/profiles/profile_helper.h"
45 #include "chrome/browser/chromeos/timezone/timezone_request.h"
46 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
47 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
48 #include "chrome/common/chrome_paths.h"
49 #include "chrome/common/chrome_switches.h"
50 #include "chrome/common/pref_names.h"
51 #include "chrome/grit/generated_resources.h"
52 #include "chrome/test/base/ui_test_utils.h"
53 #include "chromeos/audio/cras_audio_handler.h"
54 #include "chromeos/chromeos_switches.h"
55 #include "chromeos/chromeos_test_utils.h"
56 #include "chromeos/dbus/dbus_thread_manager.h"
57 #include "chromeos/dbus/fake_session_manager_client.h"
58 #include "chromeos/login/auth/key.h"
59 #include "chromeos/login/auth/mock_auth_status_consumer.h"
60 #include "chromeos/login/auth/mock_authenticator.h"
61 #include "chromeos/login/auth/user_context.h"
62 #include "chromeos/network/network_state.h"
63 #include "chromeos/network/network_state_handler.h"
64 #include "chromeos/settings/timezone_settings.h"
65 #include "content/public/test/browser_test_utils.h"
66 #include "content/public/test/test_utils.h"
67 #include "net/test/spawned_test_server/spawned_test_server.h"
68 #include "net/url_request/test_url_fetcher_factory.h"
69 #include "net/url_request/url_fetcher_impl.h"
70 #include "testing/gmock/include/gmock/gmock.h"
71 #include "testing/gtest/include/gtest/gtest.h"
72 #include "third_party/icu/source/common/unicode/locid.h"
73 #include "ui/base/accelerators/accelerator.h"
74 #include "ui/base/l10n/l10n_util.h"
76 using ::testing::Exactly;
77 using ::testing::Invoke;
78 using ::testing::Return;
84 const char kUsername[] = "test_user@managedchrome.com";
85 const char kPassword[] = "test_password";
87 const char kGeolocationResponseBody[] =
93 " \"accuracy\": 1200.4\n"
96 // Timezone should not match kGeolocationResponseBody to check that exactly
97 // this value will be used.
98 const char kTimezoneResponseBody[] =
100 " \"dstOffset\" : 0.0,\n"
101 " \"rawOffset\" : -32400.0,\n"
102 " \"status\" : \"OK\",\n"
103 " \"timeZoneId\" : \"America/Anchorage\",\n"
104 " \"timeZoneName\" : \"Pacific Standard Time\"\n"
107 class PrefStoreStub : public TestingPrefStore {
109 // TestingPrefStore overrides:
110 virtual PrefReadError GetReadError() const OVERRIDE {
111 return PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE;
114 virtual bool IsInitializationComplete() const OVERRIDE {
119 virtual ~PrefStoreStub() {}
122 struct SwitchLanguageTestData {
123 SwitchLanguageTestData() : success(false), done(false) {}
125 std::string requested_locale;
126 std::string loaded_locale;
131 void OnLocaleSwitched(SwitchLanguageTestData* self,
132 const std::string& locale,
133 const std::string& loaded_locale,
134 const bool success) {
135 self->requested_locale = locale;
136 self->loaded_locale = loaded_locale;
137 self->success = success;
141 void RunSwitchLanguageTest(const std::string& locale,
142 const std::string& expected_locale,
143 const bool expect_success) {
144 SwitchLanguageTestData data;
145 scoped_ptr<locale_util::SwitchLanguageCallback> callback(
146 new locale_util::SwitchLanguageCallback(
147 base::Bind(&OnLocaleSwitched, base::Unretained(&data))));
148 locale_util::SwitchLanguage(locale, true, false, callback.Pass());
150 // Token writing moves control to BlockingPool and back.
151 content::RunAllBlockingPoolTasksUntilIdle();
153 EXPECT_EQ(data.done, true);
154 EXPECT_EQ(data.requested_locale, locale);
155 EXPECT_EQ(data.loaded_locale, expected_locale);
156 EXPECT_EQ(data.success, expect_success);
159 void SetUpCrasAndEnableChromeVox(int volume_percent, bool mute_on) {
160 AccessibilityManager* a11y = AccessibilityManager::Get();
161 CrasAudioHandler* cras = CrasAudioHandler::Get();
163 // Audio output is at |volume_percent| and |mute_on|. Spoken feedback
165 cras->SetOutputVolumePercent(volume_percent);
166 cras->SetOutputMute(mute_on);
167 a11y->EnableSpokenFeedback(false, ash::A11Y_NOTIFICATION_NONE);
169 // Spoken feedback is enabled.
170 a11y->EnableSpokenFeedback(true, ash::A11Y_NOTIFICATION_NONE);
171 base::RunLoop().RunUntilIdle();
174 void QuitLoopOnAutoEnrollmentProgress(
175 policy::AutoEnrollmentState expected_state,
177 policy::AutoEnrollmentState actual_state) {
178 if (expected_state == actual_state)
182 void WaitForAutoEnrollmentState(policy::AutoEnrollmentState state) {
184 AutoEnrollmentController* auto_enrollment_controller =
185 LoginDisplayHostImpl::default_host()->GetAutoEnrollmentController();
186 scoped_ptr<AutoEnrollmentController::ProgressCallbackList::Subscription>
187 progress_subscription(
188 auto_enrollment_controller->RegisterProgressCallback(
189 base::Bind(&QuitLoopOnAutoEnrollmentProgress, state, &loop)));
197 template <class T, class H>
198 class MockOutShowHide : public T {
200 template <class P> explicit MockOutShowHide(P p) : T(p) {}
201 template <class P> MockOutShowHide(P p, H* actor)
202 : T(p, actor), actor_(actor) {}
204 H* actor() const { return actor_.get(); }
206 MOCK_METHOD0(Show, void());
207 MOCK_METHOD0(Hide, void());
210 scoped_ptr<H> actor_;
213 #define MOCK(mock_var, screen_name, mocked_class, actor_class) \
214 mock_var = new MockOutShowHide<mocked_class, actor_class>( \
215 WizardController::default_controller(), new actor_class); \
216 WizardController::default_controller() \
217 ->screens_[WizardController::screen_name] = make_linked_ptr(mock_var); \
218 EXPECT_CALL(*mock_var, Show()).Times(0); \
219 EXPECT_CALL(*mock_var, Hide()).Times(0);
221 class WizardControllerTest : public WizardInProcessBrowserTest {
223 WizardControllerTest() : WizardInProcessBrowserTest(
224 WizardController::kTestNoScreenName) {}
225 virtual ~WizardControllerTest() {}
227 virtual void SetUpOnMainThread() OVERRIDE {
228 AccessibilityManager::Get()->
229 SetProfileForTest(ProfileHelper::GetSigninProfile());
230 WizardInProcessBrowserTest::SetUpOnMainThread();
233 ErrorScreen* GetErrorScreen() {
234 return static_cast<ScreenObserver*>(WizardController::default_controller())
238 content::WebContents* GetWebContents() {
239 LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
240 LoginDisplayHostImpl::default_host());
243 WebUILoginView* webui_login_view = host->GetWebUILoginView();
244 if (!webui_login_view)
246 return webui_login_view->GetWebContents();
249 void WaitUntilJSIsReady() {
250 LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
251 LoginDisplayHostImpl::default_host());
254 chromeos::OobeUI* oobe_ui = host->GetOobeUI();
257 base::RunLoop run_loop;
258 const bool oobe_ui_ready = oobe_ui->IsJSReady(run_loop.QuitClosure());
263 bool JSExecuteBooleanExpression(const std::string& expression) {
265 EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
267 "window.domAutomationController.send(!!(" + expression + "));",
272 void CheckCurrentScreen(const std::string& screen_name) {
273 EXPECT_EQ(WizardController::default_controller()->GetScreen(screen_name),
274 WizardController::default_controller()->current_screen());
278 DISALLOW_COPY_AND_ASSIGN(WizardControllerTest);
281 IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
282 ASSERT_TRUE(WizardController::default_controller() != NULL);
283 WizardController::default_controller()->AdvanceToScreen(
284 WizardController::kNetworkScreenName);
286 // Checking the default locale. Provided that the profile is cleared in SetUp.
287 EXPECT_EQ("en-US", g_browser_process->GetApplicationLocale());
288 EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage());
289 EXPECT_FALSE(base::i18n::IsRTL());
290 const base::string16 en_str =
291 l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
293 RunSwitchLanguageTest("fr", "fr", true);
294 EXPECT_EQ("fr", g_browser_process->GetApplicationLocale());
295 EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage());
296 EXPECT_FALSE(base::i18n::IsRTL());
297 const base::string16 fr_str =
298 l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
300 EXPECT_NE(en_str, fr_str);
302 RunSwitchLanguageTest("ar", "ar", true);
303 EXPECT_EQ("ar", g_browser_process->GetApplicationLocale());
304 EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage());
305 EXPECT_TRUE(base::i18n::IsRTL());
306 const base::string16 ar_str =
307 l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
309 EXPECT_NE(fr_str, ar_str);
312 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsChangedForChromeVox) {
313 SetUpCrasAndEnableChromeVox(75 /* volume_percent */, true /* mute_on */);
315 // Check that output is unmuted now and at some level.
316 CrasAudioHandler* cras = CrasAudioHandler::Get();
317 ASSERT_FALSE(cras->IsOutputMuted());
318 ASSERT_EQ(WizardController::kMinAudibleOutputVolumePercent,
319 cras->GetOutputVolumePercent());
322 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsUnchangedForChromeVox) {
323 SetUpCrasAndEnableChromeVox(75 /* volume_percent */, false /* mute_on */);
325 // Check that output is unmuted now and at some level.
326 CrasAudioHandler* cras = CrasAudioHandler::Get();
327 ASSERT_FALSE(cras->IsOutputMuted());
328 ASSERT_EQ(75, cras->GetOutputVolumePercent());
331 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsAdjustedForChromeVox) {
332 SetUpCrasAndEnableChromeVox(5 /* volume_percent */, false /* mute_on */);
334 // Check that output is unmuted now and at some level.
335 CrasAudioHandler* cras = CrasAudioHandler::Get();
336 ASSERT_FALSE(cras->IsOutputMuted());
337 ASSERT_EQ(WizardController::kMinAudibleOutputVolumePercent,
338 cras->GetOutputVolumePercent());
341 class WizardControllerTestURLFetcherFactory
342 : public net::TestURLFetcherFactory {
344 virtual net::URLFetcher* CreateURLFetcher(
347 net::URLFetcher::RequestType request_type,
348 net::URLFetcherDelegate* d) OVERRIDE {
351 SimpleGeolocationProvider::DefaultGeolocationProviderURL().spec(),
353 return new net::FakeURLFetcher(url,
355 std::string(kGeolocationResponseBody),
357 net::URLRequestStatus::SUCCESS);
359 if (StartsWithASCII(url.spec(),
360 chromeos::DefaultTimezoneProviderURL().spec(),
362 return new net::FakeURLFetcher(url,
364 std::string(kTimezoneResponseBody),
366 net::URLRequestStatus::SUCCESS);
368 return net::TestURLFetcherFactory::CreateURLFetcher(
369 id, url, request_type, d);
371 virtual ~WizardControllerTestURLFetcherFactory() {}
374 class TimeZoneTestRunner {
376 void OnResolved() { loop_.Quit(); }
377 void Run() { loop_.Run(); }
383 class WizardControllerFlowTest : public WizardControllerTest {
385 WizardControllerFlowTest() {}
386 // Overriden from InProcessBrowserTest:
387 virtual void SetUpOnMainThread() OVERRIDE {
388 WizardControllerTest::SetUpOnMainThread();
390 // Make sure that OOBE is run as an "official" build.
391 WizardController::default_controller()->is_official_build_ = true;
393 // Clear portal list (as it is by default in OOBE).
394 NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
396 // Set up the mocks for all screens.
397 MOCK(mock_network_screen_,
400 MockNetworkScreenActor);
401 MOCK(mock_update_screen_,
404 MockUpdateScreenActor);
405 MOCK(mock_eula_screen_,
408 MockEulaScreenActor);
409 MOCK(mock_enrollment_screen_,
410 kEnrollmentScreenName,
411 MockEnrollmentScreen,
412 MockEnrollmentScreenActor);
413 MOCK(mock_auto_enrollment_check_screen_,
414 kAutoEnrollmentCheckScreenName,
415 MockAutoEnrollmentCheckScreen,
416 MockAutoEnrollmentCheckScreenActor);
418 // Switch to the initial screen.
419 EXPECT_EQ(NULL, WizardController::default_controller()->current_screen());
420 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
421 WizardController::default_controller()->AdvanceToScreen(
422 WizardController::kNetworkScreenName);
425 virtual void TearDown() {
426 if (fallback_fetcher_factory_) {
427 fetcher_factory_.reset();
428 net::URLFetcherImpl::set_factory(fallback_fetcher_factory_.get());
429 fallback_fetcher_factory_.reset();
433 void InitTimezoneResolver() {
434 fallback_fetcher_factory_.reset(new WizardControllerTestURLFetcherFactory);
435 net::URLFetcherImpl::set_factory(NULL);
436 fetcher_factory_.reset(
437 new net::FakeURLFetcherFactory(fallback_fetcher_factory_.get()));
439 network_portal_detector_ = new NetworkPortalDetectorTestImpl();
440 NetworkPortalDetector::InitializeForTesting(network_portal_detector_);
442 NetworkPortalDetector::CaptivePortalState online_state;
443 online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
444 online_state.response_code = 204;
446 // Default detworks happens to be usually "eth1" in tests.
447 const NetworkState* default_network =
448 NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
450 network_portal_detector_->SetDefaultNetworkForTesting(
451 default_network->guid());
452 network_portal_detector_->SetDetectionResultsForTesting(
453 default_network->guid(),
457 void OnExit(ScreenObserver::ExitCodes exit_code) {
458 WizardController::default_controller()->OnExit(exit_code);
461 chromeos::SimpleGeolocationProvider* GetGeolocationProvider() {
462 return WizardController::default_controller()->geolocation_provider_.get();
465 void WaitUntilTimezoneResolved() {
466 scoped_ptr<TimeZoneTestRunner> runner(new TimeZoneTestRunner);
467 if (!WizardController::default_controller()
468 ->SetOnTimeZoneResolvedForTesting(
469 base::Bind(&TimeZoneTestRunner::OnResolved,
470 base::Unretained(runner.get()))))
476 void ResetAutoEnrollmentCheckScreen() {
477 WizardController::default_controller()->screens_.erase(
478 WizardController::kAutoEnrollmentCheckScreenName);
481 MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
482 mock_network_screen_;
483 MockOutShowHide<MockUpdateScreen, MockUpdateScreenActor>* mock_update_screen_;
484 MockOutShowHide<MockEulaScreen, MockEulaScreenActor>* mock_eula_screen_;
485 MockOutShowHide<MockEnrollmentScreen,
486 MockEnrollmentScreenActor>* mock_enrollment_screen_;
487 MockOutShowHide<MockAutoEnrollmentCheckScreen,
488 MockAutoEnrollmentCheckScreenActor>* mock_auto_enrollment_check_screen_;
491 NetworkPortalDetectorTestImpl* network_portal_detector_;
493 // Use a test factory as a fallback so we don't have to deal with other
495 scoped_ptr<WizardControllerTestURLFetcherFactory> fallback_fetcher_factory_;
496 scoped_ptr<net::FakeURLFetcherFactory> fetcher_factory_;
498 DISALLOW_COPY_AND_ASSIGN(WizardControllerFlowTest);
501 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
502 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
503 CheckCurrentScreen(WizardController::kNetworkScreenName);
505 WaitUntilJSIsReady();
507 // Check visibility of the header bar.
508 ASSERT_FALSE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
510 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
511 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
512 OnExit(ScreenObserver::NETWORK_CONNECTED);
514 CheckCurrentScreen(WizardController::kEulaScreenName);
516 // Header bar should still be visible.
517 ASSERT_FALSE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
519 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
520 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
521 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
522 // Enable TimeZone resolve
523 InitTimezoneResolver();
524 OnExit(ScreenObserver::EULA_ACCEPTED);
525 EXPECT_TRUE(GetGeolocationProvider());
526 // Let update screen smooth time process (time = 0ms).
527 content::RunAllPendingInMessageLoop();
529 CheckCurrentScreen(WizardController::kUpdateScreenName);
530 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
531 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
532 OnExit(ScreenObserver::UPDATE_INSTALLED);
534 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
535 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(0);
536 EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
537 OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
539 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
540 EXPECT_EQ("ethernet,wifi,cellular",
541 NetworkHandler::Get()->network_state_handler()
542 ->GetCheckPortalListForTest());
544 WaitUntilTimezoneResolved();
545 EXPECT_EQ("America/Anchorage",
546 base::UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance()
547 ->GetCurrentTimezoneID()));
550 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
551 CheckCurrentScreen(WizardController::kNetworkScreenName);
552 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
553 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
554 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
555 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
556 OnExit(ScreenObserver::NETWORK_CONNECTED);
558 CheckCurrentScreen(WizardController::kEulaScreenName);
559 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
560 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
561 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
562 OnExit(ScreenObserver::EULA_ACCEPTED);
563 // Let update screen smooth time process (time = 0ms).
564 content::RunAllPendingInMessageLoop();
566 CheckCurrentScreen(WizardController::kUpdateScreenName);
567 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
568 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
569 OnExit(ScreenObserver::UPDATE_ERROR_UPDATING);
571 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
572 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(0);
573 EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
574 OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
576 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
579 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowSkipUpdateEnroll) {
580 CheckCurrentScreen(WizardController::kNetworkScreenName);
581 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
582 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
583 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
584 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
585 OnExit(ScreenObserver::NETWORK_CONNECTED);
587 CheckCurrentScreen(WizardController::kEulaScreenName);
588 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
589 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
590 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
591 WizardController::default_controller()->SkipUpdateEnrollAfterEula();
592 EXPECT_CALL(*mock_enrollment_screen_->actor(),
593 SetParameters(mock_enrollment_screen_,
594 EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
597 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
598 OnExit(ScreenObserver::EULA_ACCEPTED);
599 content::RunAllPendingInMessageLoop();
601 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
602 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
603 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
604 EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(0);
605 OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
606 content::RunAllPendingInMessageLoop();
608 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
609 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
610 EXPECT_EQ("ethernet,wifi,cellular",
611 NetworkHandler::Get()->network_state_handler()
612 ->GetCheckPortalListForTest());
615 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) {
616 CheckCurrentScreen(WizardController::kNetworkScreenName);
617 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
618 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
619 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
620 OnExit(ScreenObserver::NETWORK_CONNECTED);
622 CheckCurrentScreen(WizardController::kEulaScreenName);
623 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
624 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
625 EXPECT_CALL(*mock_network_screen_, Hide()).Times(0); // last transition
626 OnExit(ScreenObserver::EULA_BACK);
628 CheckCurrentScreen(WizardController::kNetworkScreenName);
631 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
632 ControlFlowEnrollmentCompleted) {
633 CheckCurrentScreen(WizardController::kNetworkScreenName);
634 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
635 EXPECT_CALL(*mock_enrollment_screen_->actor(),
636 SetParameters(mock_enrollment_screen_,
637 EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
640 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
641 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
643 WizardController::default_controller()->AdvanceToScreen(
644 WizardController::kEnrollmentScreenName);
645 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
646 OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
648 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
651 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
652 ControlFlowAutoEnrollmentCompleted) {
653 WizardController::default_controller()->SkipPostLoginScreensForTesting();
654 CheckCurrentScreen(WizardController::kNetworkScreenName);
655 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
657 UserContext user_context(kUsername);
658 user_context.SetKey(Key(kPassword));
659 user_context.SetUserIDHash(user_context.GetUserID());
660 LoginUtils::Set(new TestLoginUtils(user_context));
661 MockAuthStatusConsumer mock_consumer;
663 // Must have a pending signin to resume after auto-enrollment:
664 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
665 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
666 ExistingUserController::current_controller()->DoAutoEnrollment();
667 ExistingUserController::current_controller()->set_login_status_consumer(
669 // This calls StartWizard, destroying the current controller() and its mocks;
670 // don't set expectations on those objects.
671 ExistingUserController::current_controller()->CompleteLogin(user_context);
672 // Run the tasks posted to complete the login:
673 base::MessageLoop::current()->RunUntilIdle();
675 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
676 // This is the main expectation: after auto-enrollment, login is resumed.
677 EXPECT_CALL(mock_consumer, OnAuthSuccess(_)).Times(1);
678 OnExit(ScreenObserver::ENTERPRISE_AUTO_MAGIC_ENROLLMENT_COMPLETED);
679 // Prevent browser launch when the profile is prepared:
680 browser_shutdown::SetTryingToQuit(true);
681 // Run the tasks posted to complete the login:
682 base::MessageLoop::current()->RunUntilIdle();
685 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
686 ControlFlowWrongHWIDScreenFromLogin) {
687 CheckCurrentScreen(WizardController::kNetworkScreenName);
689 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
690 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
691 ExistingUserController::current_controller()->ShowWrongHWIDScreen();
693 CheckCurrentScreen(WizardController::kWrongHWIDScreenName);
695 // After warning is skipped, user returns to sign-in screen.
696 // And this destroys WizardController.
697 OnExit(ScreenObserver::WRONG_HWID_WARNING_SKIPPED);
698 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
701 class WizardControllerEnrollmentFlowTest : public WizardControllerFlowTest {
703 WizardControllerEnrollmentFlowTest() {}
705 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
706 WizardControllerFlowTest::SetUpCommandLine(command_line);
708 command_line->AppendSwitchASCII(
709 switches::kEnterpriseEnableForcedReEnrollment,
710 chromeos::AutoEnrollmentController::kForcedReEnrollmentAlways);
711 command_line->AppendSwitchASCII(
712 switches::kEnterpriseEnrollmentInitialModulus, "1");
713 command_line->AppendSwitchASCII(
714 switches::kEnterpriseEnrollmentModulusLimit, "2");
718 DISALLOW_COPY_AND_ASSIGN(WizardControllerEnrollmentFlowTest);
721 IN_PROC_BROWSER_TEST_F(WizardControllerEnrollmentFlowTest,
722 ControlFlowForcedReEnrollment) {
723 CheckCurrentScreen(WizardController::kNetworkScreenName);
724 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
725 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
726 OnExit(ScreenObserver::NETWORK_CONNECTED);
728 CheckCurrentScreen(WizardController::kEulaScreenName);
729 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
730 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
731 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
732 OnExit(ScreenObserver::EULA_ACCEPTED);
733 // Let update screen smooth time process (time = 0ms).
734 content::RunAllPendingInMessageLoop();
736 CheckCurrentScreen(WizardController::kUpdateScreenName);
737 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
738 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
739 OnExit(ScreenObserver::UPDATE_INSTALLED);
741 AutoEnrollmentCheckScreen* screen =
742 AutoEnrollmentCheckScreen::Get(WizardController::default_controller());
744 WizardController::default_controller()->current_screen());
745 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
747 // Wait for auto-enrollment controller to encounter the connection error.
748 WaitForAutoEnrollmentState(policy::AUTO_ENROLLMENT_STATE_CONNECTION_ERROR);
750 // The error screen shows up if there's no auto-enrollment decision.
751 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
752 EXPECT_EQ(GetErrorScreen(),
753 WizardController::default_controller()->current_screen());
754 base::DictionaryValue device_state;
755 device_state.SetString(policy::kDeviceStateRestoreMode,
756 policy::kDeviceStateRestoreModeReEnrollmentEnforced);
757 g_browser_process->local_state()->Set(prefs::kServerBackedDeviceState,
759 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
760 EXPECT_CALL(*mock_enrollment_screen_->actor(),
761 SetParameters(mock_enrollment_screen_,
762 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
764 OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
766 ResetAutoEnrollmentCheckScreen();
768 // Make sure enterprise enrollment page shows up.
769 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
770 OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
772 EXPECT_TRUE(StartupUtils::IsOobeCompleted());
775 class WizardControllerBrokenLocalStateTest : public WizardControllerTest {
777 WizardControllerBrokenLocalStateTest()
778 : fake_session_manager_client_(NULL) {
781 virtual ~WizardControllerBrokenLocalStateTest() {}
783 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
784 WizardControllerTest::SetUpInProcessBrowserTestFixture();
786 fake_session_manager_client_ = new FakeSessionManagerClient;
787 DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient(
788 scoped_ptr<SessionManagerClient>(fake_session_manager_client_));
791 virtual void SetUpOnMainThread() OVERRIDE {
792 base::PrefServiceFactory factory;
793 factory.set_user_prefs(make_scoped_refptr(new PrefStoreStub()));
794 local_state_ = factory.Create(new PrefRegistrySimple()).Pass();
795 WizardController::set_local_state_for_testing(local_state_.get());
797 WizardControllerTest::SetUpOnMainThread();
799 // Make sure that OOBE is run as an "official" build.
800 WizardController::default_controller()->is_official_build_ = true;
803 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
804 WizardControllerTest::TearDownInProcessBrowserTestFixture();
808 FakeSessionManagerClient* fake_session_manager_client() const {
809 return fake_session_manager_client_;
813 scoped_ptr<PrefService> local_state_;
814 FakeSessionManagerClient* fake_session_manager_client_;
816 DISALLOW_COPY_AND_ASSIGN(WizardControllerBrokenLocalStateTest);
819 IN_PROC_BROWSER_TEST_F(WizardControllerBrokenLocalStateTest,
820 LocalStateCorrupted) {
821 // Checks that after wizard controller initialization error screen
822 // in the proper state is displayed.
823 ASSERT_EQ(GetErrorScreen(),
824 WizardController::default_controller()->current_screen());
825 ASSERT_EQ(ErrorScreen::UI_STATE_LOCAL_STATE_ERROR,
826 GetErrorScreen()->GetUIState());
828 WaitUntilJSIsReady();
830 // Checks visibility of the error message and powerwash button.
831 ASSERT_FALSE(JSExecuteBooleanExpression("$('error-message').hidden"));
832 ASSERT_TRUE(JSExecuteBooleanExpression(
833 "$('error-message').classList.contains('ui-state-local-state-error')"));
834 ASSERT_TRUE(JSExecuteBooleanExpression("$('progress-dots').hidden"));
835 ASSERT_TRUE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
837 // Emulates user click on the "Restart and Powerwash" button.
838 ASSERT_EQ(0, fake_session_manager_client()->start_device_wipe_call_count());
839 ASSERT_TRUE(content::ExecuteScript(
841 "$('error-message-restart-and-powerwash-button').click();"));
842 ASSERT_EQ(1, fake_session_manager_client()->start_device_wipe_call_count());
845 class WizardControllerProxyAuthOnSigninTest : public WizardControllerTest {
847 WizardControllerProxyAuthOnSigninTest()
848 : proxy_server_(net::SpawnedTestServer::TYPE_BASIC_AUTH_PROXY,
849 net::SpawnedTestServer::kLocalhost,
852 virtual ~WizardControllerProxyAuthOnSigninTest() {}
854 // Overridden from WizardControllerTest:
855 virtual void SetUp() OVERRIDE {
856 ASSERT_TRUE(proxy_server_.Start());
857 WizardControllerTest::SetUp();
860 virtual void SetUpOnMainThread() OVERRIDE {
861 WizardControllerTest::SetUpOnMainThread();
862 WizardController::default_controller()->AdvanceToScreen(
863 WizardController::kNetworkScreenName);
866 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
867 command_line->AppendSwitchASCII(::switches::kProxyServer,
868 proxy_server_.host_port_pair().ToString());
871 net::SpawnedTestServer& proxy_server() { return proxy_server_; }
874 net::SpawnedTestServer proxy_server_;
876 DISALLOW_COPY_AND_ASSIGN(WizardControllerProxyAuthOnSigninTest);
879 IN_PROC_BROWSER_TEST_F(WizardControllerProxyAuthOnSigninTest,
880 ProxyAuthDialogOnSigninScreen) {
881 content::WindowedNotificationObserver auth_needed_waiter(
882 chrome::NOTIFICATION_AUTH_NEEDED,
883 content::NotificationService::AllSources());
885 CheckCurrentScreen(WizardController::kNetworkScreenName);
887 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
888 auth_needed_waiter.Wait();
891 class WizardControllerKioskFlowTest : public WizardControllerFlowTest {
893 WizardControllerKioskFlowTest() {}
895 // Overridden from InProcessBrowserTest:
896 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
897 base::FilePath test_data_dir;
898 ASSERT_TRUE(chromeos::test_utils::GetTestDataPath(
899 "app_mode", "kiosk_manifest", &test_data_dir));
900 command_line->AppendSwitchPath(
901 switches::kAppOemManifestFile,
902 test_data_dir.AppendASCII("kiosk_manifest.json"));
906 DISALLOW_COPY_AND_ASSIGN(WizardControllerKioskFlowTest);
909 IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
910 ControlFlowKioskForcedEnrollment) {
911 EXPECT_CALL(*mock_enrollment_screen_->actor(),
912 SetParameters(mock_enrollment_screen_,
913 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
917 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
918 CheckCurrentScreen(WizardController::kNetworkScreenName);
919 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
920 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
921 OnExit(ScreenObserver::NETWORK_CONNECTED);
923 CheckCurrentScreen(WizardController::kEulaScreenName);
924 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
925 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
926 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
927 OnExit(ScreenObserver::EULA_ACCEPTED);
928 // Let update screen smooth time process (time = 0ms).
929 content::RunAllPendingInMessageLoop();
931 CheckCurrentScreen(WizardController::kUpdateScreenName);
932 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
933 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
934 OnExit(ScreenObserver::UPDATE_INSTALLED);
936 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
937 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
938 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
939 OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
942 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
944 // Make sure enterprise enrollment page shows up right after update screen.
945 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
946 OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
948 EXPECT_TRUE(StartupUtils::IsOobeCompleted());
952 IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
953 ControlFlowEnrollmentBack) {
954 EXPECT_CALL(*mock_enrollment_screen_->actor(),
955 SetParameters(mock_enrollment_screen_,
956 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
960 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
961 CheckCurrentScreen(WizardController::kNetworkScreenName);
962 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
963 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
964 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
965 OnExit(ScreenObserver::NETWORK_CONNECTED);
967 CheckCurrentScreen(WizardController::kEulaScreenName);
968 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
969 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
970 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
971 OnExit(ScreenObserver::EULA_ACCEPTED);
972 // Let update screen smooth time process (time = 0ms).
973 content::RunAllPendingInMessageLoop();
975 CheckCurrentScreen(WizardController::kUpdateScreenName);
976 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
977 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
978 OnExit(ScreenObserver::UPDATE_INSTALLED);
980 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
981 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
982 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
983 EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(1);
984 OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
986 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
988 // Make sure enterprise enrollment page shows up right after update screen.
989 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
990 OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_BACK);
992 CheckCurrentScreen(WizardController::kNetworkScreenName);
993 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
996 class WizardControllerOobeResumeTest : public WizardControllerTest {
998 WizardControllerOobeResumeTest() {}
999 // Overriden from InProcessBrowserTest:
1000 virtual void SetUpOnMainThread() OVERRIDE {
1001 WizardControllerTest::SetUpOnMainThread();
1003 // Make sure that OOBE is run as an "official" build.
1004 WizardController::default_controller()->is_official_build_ = true;
1006 // Clear portal list (as it is by default in OOBE).
1007 NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
1009 // Set up the mocks for all screens.
1010 MOCK(mock_network_screen_,
1013 MockNetworkScreenActor);
1014 MOCK(mock_enrollment_screen_,
1015 kEnrollmentScreenName,
1016 MockEnrollmentScreen,
1017 MockEnrollmentScreenActor);
1020 void OnExit(ScreenObserver::ExitCodes exit_code) {
1021 WizardController::default_controller()->OnExit(exit_code);
1024 std::string GetFirstScreenName() {
1025 return WizardController::default_controller()->first_screen_name();
1028 MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
1029 mock_network_screen_;
1030 MockOutShowHide<MockEnrollmentScreen,
1031 MockEnrollmentScreenActor>* mock_enrollment_screen_;
1034 DISALLOW_COPY_AND_ASSIGN(WizardControllerOobeResumeTest);
1037 IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
1038 PRE_ControlFlowResumeInterruptedOobe) {
1039 // Switch to the initial screen.
1040 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
1041 WizardController::default_controller()->AdvanceToScreen(
1042 WizardController::kNetworkScreenName);
1043 CheckCurrentScreen(WizardController::kNetworkScreenName);
1044 EXPECT_CALL(*mock_enrollment_screen_->actor(),
1045 SetParameters(mock_enrollment_screen_,
1046 EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
1048 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
1049 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
1051 WizardController::default_controller()->AdvanceToScreen(
1052 WizardController::kEnrollmentScreenName);
1053 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
1056 IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
1057 ControlFlowResumeInterruptedOobe) {
1058 EXPECT_EQ(WizardController::kEnrollmentScreenName, GetFirstScreenName());
1061 // TODO(dzhioev): Add test emaulating device with wrong HWID.
1063 // TODO(nkostylev): Add test for WebUI accelerators http://crosbug.com/22571
1065 // TODO(merkulova): Add tests for bluetooth HID detection screen variations when
1066 // UI and logic is ready. http://crbug.com/127016
1068 // TODO(dzhioev): Add tests for controller/host pairing flow.
1069 // http://crbug.com/375191
1071 COMPILE_ASSERT(ScreenObserver::EXIT_CODES_COUNT == 23,
1072 add_tests_for_new_control_flow_you_just_introduced);
1074 } // namespace chromeos