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/prefs/pref_registry_simple.h"
11 #include "base/prefs/pref_service.h"
12 #include "base/prefs/pref_service_factory.h"
13 #include "base/prefs/testing_pref_store.h"
14 #include "base/run_loop.h"
15 #include "base/strings/string_util.h"
16 #include "base/strings/utf_string_conversions.h"
17 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/browser_shutdown.h"
19 #include "chrome/browser/chrome_notification_types.h"
20 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
21 #include "chrome/browser/chromeos/base/locale_util.h"
22 #include "chrome/browser/chromeos/geolocation/simple_geolocation_provider.h"
23 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
24 #include "chrome/browser/chromeos/login/enrollment/mock_auto_enrollment_check_screen.h"
25 #include "chrome/browser/chromeos/login/enrollment/mock_enrollment_screen.h"
26 #include "chrome/browser/chromeos/login/existing_user_controller.h"
27 #include "chrome/browser/chromeos/login/screens/device_disabled_screen.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_device_disabled_screen_actor.h"
31 #include "chrome/browser/chromeos/login/screens/mock_eula_screen.h"
32 #include "chrome/browser/chromeos/login/screens/mock_network_screen.h"
33 #include "chrome/browser/chromeos/login/screens/mock_update_screen.h"
34 #include "chrome/browser/chromeos/login/screens/network_screen.h"
35 #include "chrome/browser/chromeos/login/screens/reset_screen.h"
36 #include "chrome/browser/chromeos/login/screens/user_image_screen.h"
37 #include "chrome/browser/chromeos/login/screens/wrong_hwid_screen.h"
38 #include "chrome/browser/chromeos/login/startup_utils.h"
39 #include "chrome/browser/chromeos/login/test/wizard_in_process_browser_test.h"
40 #include "chrome/browser/chromeos/login/test_login_utils.h"
41 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
42 #include "chrome/browser/chromeos/login/ui/webui_login_view.h"
43 #include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h"
44 #include "chrome/browser/chromeos/policy/server_backed_device_state.h"
45 #include "chrome/browser/chromeos/policy/stub_enterprise_install_attributes.h"
46 #include "chrome/browser/chromeos/profiles/profile_helper.h"
47 #include "chrome/browser/chromeos/timezone/timezone_request.h"
48 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
49 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
50 #include "chrome/common/chrome_paths.h"
51 #include "chrome/common/chrome_switches.h"
52 #include "chrome/common/pref_names.h"
53 #include "chrome/grit/generated_resources.h"
54 #include "chromeos/audio/cras_audio_handler.h"
55 #include "chromeos/chromeos_switches.h"
56 #include "chromeos/chromeos_test_utils.h"
57 #include "chromeos/dbus/dbus_thread_manager.h"
58 #include "chromeos/dbus/fake_session_manager_client.h"
59 #include "chromeos/login/auth/key.h"
60 #include "chromeos/login/auth/mock_auth_status_consumer.h"
61 #include "chromeos/login/auth/mock_authenticator.h"
62 #include "chromeos/login/auth/user_context.h"
63 #include "chromeos/network/network_state.h"
64 #include "chromeos/network/network_state_handler.h"
65 #include "chromeos/settings/timezone_settings.h"
66 #include "chromeos/system/fake_statistics_provider.h"
67 #include "chromeos/system/statistics_provider.h"
68 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
69 #include "content/public/test/browser_test_utils.h"
70 #include "content/public/test/test_utils.h"
71 #include "net/test/spawned_test_server/spawned_test_server.h"
72 #include "net/url_request/test_url_fetcher_factory.h"
73 #include "net/url_request/url_fetcher_impl.h"
74 #include "testing/gmock/include/gmock/gmock.h"
75 #include "testing/gtest/include/gtest/gtest.h"
76 #include "third_party/icu/source/common/unicode/locid.h"
77 #include "ui/base/accelerators/accelerator.h"
78 #include "ui/base/l10n/l10n_util.h"
80 using ::testing::Exactly;
81 using ::testing::Invoke;
82 using ::testing::Mock;
83 using ::testing::Return;
89 const char kUsername[] = "test_user@managedchrome.com";
90 const char kPassword[] = "test_password";
92 const char kGeolocationResponseBody[] =
98 " \"accuracy\": 1200.4\n"
101 // Timezone should not match kGeolocationResponseBody to check that exactly
102 // this value will be used.
103 const char kTimezoneResponseBody[] =
105 " \"dstOffset\" : 0.0,\n"
106 " \"rawOffset\" : -32400.0,\n"
107 " \"status\" : \"OK\",\n"
108 " \"timeZoneId\" : \"America/Anchorage\",\n"
109 " \"timeZoneName\" : \"Pacific Standard Time\"\n"
112 const char kDisabledMessage[] = "This device has been disabled.";
114 class PrefStoreStub : public TestingPrefStore {
116 // TestingPrefStore overrides:
117 virtual PrefReadError GetReadError() const override {
118 return PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE;
121 virtual bool IsInitializationComplete() const override {
126 virtual ~PrefStoreStub() {}
129 struct SwitchLanguageTestData {
130 SwitchLanguageTestData() : success(false), done(false) {}
132 std::string requested_locale;
133 std::string loaded_locale;
138 void OnLocaleSwitched(SwitchLanguageTestData* self,
139 const std::string& locale,
140 const std::string& loaded_locale,
141 const bool success) {
142 self->requested_locale = locale;
143 self->loaded_locale = loaded_locale;
144 self->success = success;
148 void RunSwitchLanguageTest(const std::string& locale,
149 const std::string& expected_locale,
150 const bool expect_success) {
151 SwitchLanguageTestData data;
152 scoped_ptr<locale_util::SwitchLanguageCallback> callback(
153 new locale_util::SwitchLanguageCallback(
154 base::Bind(&OnLocaleSwitched, base::Unretained(&data))));
155 locale_util::SwitchLanguage(locale, true, false, callback.Pass());
157 // Token writing moves control to BlockingPool and back.
158 content::RunAllBlockingPoolTasksUntilIdle();
160 EXPECT_EQ(data.done, true);
161 EXPECT_EQ(data.requested_locale, locale);
162 EXPECT_EQ(data.loaded_locale, expected_locale);
163 EXPECT_EQ(data.success, expect_success);
166 void SetUpCrasAndEnableChromeVox(int volume_percent, bool mute_on) {
167 AccessibilityManager* a11y = AccessibilityManager::Get();
168 CrasAudioHandler* cras = CrasAudioHandler::Get();
170 // Audio output is at |volume_percent| and |mute_on|. Spoken feedback
172 cras->SetOutputVolumePercent(volume_percent);
173 cras->SetOutputMute(mute_on);
174 a11y->EnableSpokenFeedback(false, ui::A11Y_NOTIFICATION_NONE);
176 // Spoken feedback is enabled.
177 a11y->EnableSpokenFeedback(true, ui::A11Y_NOTIFICATION_NONE);
178 base::RunLoop().RunUntilIdle();
181 void QuitLoopOnAutoEnrollmentProgress(
182 policy::AutoEnrollmentState expected_state,
184 policy::AutoEnrollmentState actual_state) {
185 if (expected_state == actual_state)
189 void WaitForAutoEnrollmentState(policy::AutoEnrollmentState state) {
191 AutoEnrollmentController* auto_enrollment_controller =
192 LoginDisplayHostImpl::default_host()->GetAutoEnrollmentController();
193 scoped_ptr<AutoEnrollmentController::ProgressCallbackList::Subscription>
194 progress_subscription(
195 auto_enrollment_controller->RegisterProgressCallback(
196 base::Bind(&QuitLoopOnAutoEnrollmentProgress, state, &loop)));
204 template <class T, class H>
205 class MockOutShowHide : public T {
207 template <class P> explicit MockOutShowHide(P p) : T(p) {}
208 template <class P> MockOutShowHide(P p, H* actor)
209 : T(p, actor), actor_(actor) {}
210 template <class P, class Q>
211 MockOutShowHide(P p, Q q, H* actor)
212 : T(p, q, actor), actor_(actor) {}
214 H* actor() const { return actor_.get(); }
216 MOCK_METHOD0(Show, void());
217 MOCK_METHOD0(Hide, void());
220 scoped_ptr<H> actor_;
223 #define MOCK(mock_var, screen_name, mocked_class, actor_class) \
224 mock_var = new MockOutShowHide<mocked_class, actor_class>( \
225 WizardController::default_controller(), new actor_class); \
226 WizardController::default_controller() \
227 ->screens_[WizardController::screen_name] = make_linked_ptr(mock_var); \
228 EXPECT_CALL(*mock_var, Show()).Times(0); \
229 EXPECT_CALL(*mock_var, Hide()).Times(0);
231 #define MOCK_WITH_DELEGATE(mock_var, screen_name, mocked_class, actor_class) \
232 mock_var = new MockOutShowHide<mocked_class, actor_class>( \
233 WizardController::default_controller(), \
234 WizardController::default_controller(), \
236 WizardController::default_controller() \
237 ->screens_[WizardController::screen_name] = make_linked_ptr(mock_var); \
238 EXPECT_CALL(*mock_var, Show()).Times(0); \
239 EXPECT_CALL(*mock_var, Hide()).Times(0);
241 class WizardControllerTest : public WizardInProcessBrowserTest {
243 WizardControllerTest() : WizardInProcessBrowserTest(
244 WizardController::kTestNoScreenName) {}
245 virtual ~WizardControllerTest() {}
247 virtual void SetUpOnMainThread() override {
248 AccessibilityManager::Get()->
249 SetProfileForTest(ProfileHelper::GetSigninProfile());
250 WizardInProcessBrowserTest::SetUpOnMainThread();
253 ErrorScreen* GetErrorScreen() {
254 return static_cast<BaseScreenDelegate*>(
255 WizardController::default_controller())->GetErrorScreen();
258 content::WebContents* GetWebContents() {
259 LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
260 LoginDisplayHostImpl::default_host());
263 WebUILoginView* webui_login_view = host->GetWebUILoginView();
264 if (!webui_login_view)
266 return webui_login_view->GetWebContents();
269 void WaitUntilJSIsReady() {
270 LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
271 LoginDisplayHostImpl::default_host());
274 chromeos::OobeUI* oobe_ui = host->GetOobeUI();
277 base::RunLoop run_loop;
278 const bool oobe_ui_ready = oobe_ui->IsJSReady(run_loop.QuitClosure());
283 bool JSExecuteBooleanExpression(const std::string& expression) {
285 EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
287 "window.domAutomationController.send(!!(" + expression + "));",
292 void CheckCurrentScreen(const std::string& screen_name) {
293 EXPECT_EQ(WizardController::default_controller()->GetScreen(screen_name),
294 WizardController::default_controller()->current_screen());
298 DISALLOW_COPY_AND_ASSIGN(WizardControllerTest);
301 IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
302 ASSERT_TRUE(WizardController::default_controller() != NULL);
303 WizardController::default_controller()->AdvanceToScreen(
304 WizardController::kNetworkScreenName);
306 // Checking the default locale. Provided that the profile is cleared in SetUp.
307 EXPECT_EQ("en-US", g_browser_process->GetApplicationLocale());
308 EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage());
309 EXPECT_FALSE(base::i18n::IsRTL());
310 const base::string16 en_str =
311 l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
313 RunSwitchLanguageTest("fr", "fr", true);
314 EXPECT_EQ("fr", g_browser_process->GetApplicationLocale());
315 EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage());
316 EXPECT_FALSE(base::i18n::IsRTL());
317 const base::string16 fr_str =
318 l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
320 EXPECT_NE(en_str, fr_str);
322 RunSwitchLanguageTest("ar", "ar", true);
323 EXPECT_EQ("ar", g_browser_process->GetApplicationLocale());
324 EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage());
325 EXPECT_TRUE(base::i18n::IsRTL());
326 const base::string16 ar_str =
327 l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE);
329 EXPECT_NE(fr_str, ar_str);
332 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsChangedForChromeVox) {
333 SetUpCrasAndEnableChromeVox(75 /* volume_percent */, true /* mute_on */);
335 // Check that output is unmuted now and at some level.
336 CrasAudioHandler* cras = CrasAudioHandler::Get();
337 ASSERT_FALSE(cras->IsOutputMuted());
338 ASSERT_EQ(WizardController::kMinAudibleOutputVolumePercent,
339 cras->GetOutputVolumePercent());
342 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsUnchangedForChromeVox) {
343 SetUpCrasAndEnableChromeVox(75 /* volume_percent */, false /* mute_on */);
345 // Check that output is unmuted now and at some level.
346 CrasAudioHandler* cras = CrasAudioHandler::Get();
347 ASSERT_FALSE(cras->IsOutputMuted());
348 ASSERT_EQ(75, cras->GetOutputVolumePercent());
351 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsAdjustedForChromeVox) {
352 SetUpCrasAndEnableChromeVox(5 /* volume_percent */, false /* mute_on */);
354 // Check that output is unmuted now and at some level.
355 CrasAudioHandler* cras = CrasAudioHandler::Get();
356 ASSERT_FALSE(cras->IsOutputMuted());
357 ASSERT_EQ(WizardController::kMinAudibleOutputVolumePercent,
358 cras->GetOutputVolumePercent());
361 class WizardControllerTestURLFetcherFactory
362 : public net::TestURLFetcherFactory {
364 virtual net::URLFetcher* CreateURLFetcher(
367 net::URLFetcher::RequestType request_type,
368 net::URLFetcherDelegate* d) override {
371 SimpleGeolocationProvider::DefaultGeolocationProviderURL().spec(),
373 return new net::FakeURLFetcher(url,
375 std::string(kGeolocationResponseBody),
377 net::URLRequestStatus::SUCCESS);
379 if (StartsWithASCII(url.spec(),
380 chromeos::DefaultTimezoneProviderURL().spec(),
382 return new net::FakeURLFetcher(url,
384 std::string(kTimezoneResponseBody),
386 net::URLRequestStatus::SUCCESS);
388 return net::TestURLFetcherFactory::CreateURLFetcher(
389 id, url, request_type, d);
391 virtual ~WizardControllerTestURLFetcherFactory() {}
394 class TimeZoneTestRunner {
396 void OnResolved() { loop_.Quit(); }
397 void Run() { loop_.Run(); }
403 class WizardControllerFlowTest : public WizardControllerTest {
405 WizardControllerFlowTest() {}
406 // Overriden from InProcessBrowserTest:
407 virtual void SetUpOnMainThread() override {
408 WizardControllerTest::SetUpOnMainThread();
410 // Make sure that OOBE is run as an "official" build.
411 WizardController* wizard_controller =
412 WizardController::default_controller();
413 wizard_controller->is_official_build_ = true;
415 // Clear portal list (as it is by default in OOBE).
416 NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
418 // Set up the mocks for all screens.
419 MOCK(mock_network_screen_,
422 MockNetworkScreenActor);
423 MOCK(mock_update_screen_,
426 MockUpdateScreenActor);
427 MOCK_WITH_DELEGATE(mock_eula_screen_,
430 MockEulaScreenActor);
431 MOCK(mock_enrollment_screen_,
432 kEnrollmentScreenName,
433 MockEnrollmentScreen,
434 MockEnrollmentScreenActor);
435 MOCK(mock_auto_enrollment_check_screen_,
436 kAutoEnrollmentCheckScreenName,
437 MockAutoEnrollmentCheckScreen,
438 MockAutoEnrollmentCheckScreenActor);
439 device_disabled_screen_actor_.reset(new MockDeviceDisabledScreenActor);
440 wizard_controller->screens_[WizardController::kDeviceDisabledScreenName] =
441 make_linked_ptr(new DeviceDisabledScreen(
443 device_disabled_screen_actor_.get()));
444 EXPECT_CALL(*device_disabled_screen_actor_, Show()).Times(0);
446 // Switch to the initial screen.
447 EXPECT_EQ(NULL, wizard_controller->current_screen());
448 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
449 wizard_controller->AdvanceToScreen(WizardController::kNetworkScreenName);
452 void TearDownOnMainThread() override {
453 device_disabled_screen_actor_.reset();
454 WizardControllerTest::TearDownOnMainThread();
457 virtual void TearDown() {
458 if (fallback_fetcher_factory_) {
459 fetcher_factory_.reset();
460 net::URLFetcherImpl::set_factory(fallback_fetcher_factory_.get());
461 fallback_fetcher_factory_.reset();
465 void InitTimezoneResolver() {
466 fallback_fetcher_factory_.reset(new WizardControllerTestURLFetcherFactory);
467 net::URLFetcherImpl::set_factory(NULL);
468 fetcher_factory_.reset(
469 new net::FakeURLFetcherFactory(fallback_fetcher_factory_.get()));
471 network_portal_detector_ = new NetworkPortalDetectorTestImpl();
472 NetworkPortalDetector::InitializeForTesting(network_portal_detector_);
474 NetworkPortalDetector::CaptivePortalState online_state;
475 online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
476 online_state.response_code = 204;
478 // Default detworks happens to be usually "eth1" in tests.
479 const NetworkState* default_network =
480 NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
482 network_portal_detector_->SetDefaultNetworkForTesting(
483 default_network->guid());
484 network_portal_detector_->SetDetectionResultsForTesting(
485 default_network->guid(),
489 void OnExit(BaseScreenDelegate::ExitCodes exit_code) {
490 WizardController::default_controller()->OnExit(exit_code);
493 chromeos::SimpleGeolocationProvider* GetGeolocationProvider() {
494 return WizardController::default_controller()->geolocation_provider_.get();
497 void WaitUntilTimezoneResolved() {
498 scoped_ptr<TimeZoneTestRunner> runner(new TimeZoneTestRunner);
499 if (!WizardController::default_controller()
500 ->SetOnTimeZoneResolvedForTesting(
501 base::Bind(&TimeZoneTestRunner::OnResolved,
502 base::Unretained(runner.get()))))
508 void ResetAutoEnrollmentCheckScreen() {
509 WizardController::default_controller()->screens_.erase(
510 WizardController::kAutoEnrollmentCheckScreenName);
513 MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
514 mock_network_screen_;
515 MockOutShowHide<MockUpdateScreen, MockUpdateScreenActor>* mock_update_screen_;
516 MockOutShowHide<MockEulaScreen, MockEulaScreenActor>* mock_eula_screen_;
517 MockOutShowHide<MockEnrollmentScreen,
518 MockEnrollmentScreenActor>* mock_enrollment_screen_;
519 MockOutShowHide<MockAutoEnrollmentCheckScreen,
520 MockAutoEnrollmentCheckScreenActor>* mock_auto_enrollment_check_screen_;
521 scoped_ptr<MockDeviceDisabledScreenActor> device_disabled_screen_actor_;
524 NetworkPortalDetectorTestImpl* network_portal_detector_;
526 // Use a test factory as a fallback so we don't have to deal with other
528 scoped_ptr<WizardControllerTestURLFetcherFactory> fallback_fetcher_factory_;
529 scoped_ptr<net::FakeURLFetcherFactory> fetcher_factory_;
531 DISALLOW_COPY_AND_ASSIGN(WizardControllerFlowTest);
534 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
535 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
536 CheckCurrentScreen(WizardController::kNetworkScreenName);
538 WaitUntilJSIsReady();
540 // Check visibility of the header bar.
541 ASSERT_FALSE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
543 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
544 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
545 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
547 CheckCurrentScreen(WizardController::kEulaScreenName);
549 // Header bar should still be visible.
550 ASSERT_FALSE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
552 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
553 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
554 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
555 // Enable TimeZone resolve
556 InitTimezoneResolver();
557 OnExit(BaseScreenDelegate::EULA_ACCEPTED);
558 EXPECT_TRUE(GetGeolocationProvider());
560 // Let update screen smooth time process (time = 0ms).
561 content::RunAllPendingInMessageLoop();
563 CheckCurrentScreen(WizardController::kUpdateScreenName);
564 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
565 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
566 OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
568 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
569 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(0);
570 EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
571 OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
573 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
574 EXPECT_EQ("ethernet,wifi,cellular",
575 NetworkHandler::Get()->network_state_handler()
576 ->GetCheckPortalListForTest());
578 WaitUntilTimezoneResolved();
579 EXPECT_EQ("America/Anchorage",
580 base::UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance()
581 ->GetCurrentTimezoneID()));
584 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
585 CheckCurrentScreen(WizardController::kNetworkScreenName);
586 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
587 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
588 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
589 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
590 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
592 CheckCurrentScreen(WizardController::kEulaScreenName);
593 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
594 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
595 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
596 OnExit(BaseScreenDelegate::EULA_ACCEPTED);
598 // Let update screen smooth time process (time = 0ms).
599 content::RunAllPendingInMessageLoop();
601 CheckCurrentScreen(WizardController::kUpdateScreenName);
602 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
603 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
604 OnExit(BaseScreenDelegate::UPDATE_ERROR_UPDATING);
606 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
607 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(0);
608 EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
609 OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
611 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
614 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowSkipUpdateEnroll) {
615 CheckCurrentScreen(WizardController::kNetworkScreenName);
616 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
617 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
618 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
619 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
620 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
622 CheckCurrentScreen(WizardController::kEulaScreenName);
623 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
624 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
625 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
626 WizardController::default_controller()->SkipUpdateEnrollAfterEula();
627 EXPECT_CALL(*mock_enrollment_screen_->actor(),
628 SetParameters(mock_enrollment_screen_,
629 EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
632 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
633 OnExit(BaseScreenDelegate::EULA_ACCEPTED);
634 content::RunAllPendingInMessageLoop();
636 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
637 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
638 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
639 EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(0);
640 OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
641 content::RunAllPendingInMessageLoop();
643 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
644 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
645 EXPECT_EQ("ethernet,wifi,cellular",
646 NetworkHandler::Get()->network_state_handler()
647 ->GetCheckPortalListForTest());
650 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) {
651 CheckCurrentScreen(WizardController::kNetworkScreenName);
652 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
653 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
654 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
655 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
657 CheckCurrentScreen(WizardController::kEulaScreenName);
658 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
659 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
660 EXPECT_CALL(*mock_network_screen_, Hide()).Times(0); // last transition
661 OnExit(BaseScreenDelegate::EULA_BACK);
663 CheckCurrentScreen(WizardController::kNetworkScreenName);
666 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
667 ControlFlowEnrollmentCompleted) {
668 CheckCurrentScreen(WizardController::kNetworkScreenName);
669 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
670 EXPECT_CALL(*mock_enrollment_screen_->actor(),
671 SetParameters(mock_enrollment_screen_,
672 EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
675 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
676 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
678 WizardController::default_controller()->AdvanceToScreen(
679 WizardController::kEnrollmentScreenName);
680 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
681 OnExit(BaseScreenDelegate::ENTERPRISE_ENROLLMENT_COMPLETED);
683 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
686 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
687 ControlFlowAutoEnrollmentCompleted) {
688 WizardController::default_controller()->SkipPostLoginScreensForTesting();
689 CheckCurrentScreen(WizardController::kNetworkScreenName);
690 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
692 UserContext user_context(kUsername);
693 user_context.SetKey(Key(kPassword));
694 user_context.SetUserIDHash(user_context.GetUserID());
695 LoginUtils::Set(new TestLoginUtils(user_context));
696 MockAuthStatusConsumer mock_consumer;
698 // Must have a pending signin to resume after auto-enrollment:
699 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
700 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
701 ExistingUserController::current_controller()->DoAutoEnrollment();
702 ExistingUserController::current_controller()->set_login_status_consumer(
704 // This calls StartWizard, destroying the current controller() and its mocks;
705 // don't set expectations on those objects.
706 ExistingUserController::current_controller()->CompleteLogin(user_context);
707 // Run the tasks posted to complete the login:
708 base::MessageLoop::current()->RunUntilIdle();
710 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
711 // This is the main expectation: after auto-enrollment, login is resumed.
712 EXPECT_CALL(mock_consumer, OnAuthSuccess(_)).Times(1);
713 OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_MAGIC_ENROLLMENT_COMPLETED);
714 // Prevent browser launch when the profile is prepared:
715 browser_shutdown::SetTryingToQuit(true);
716 // Run the tasks posted to complete the login:
717 base::MessageLoop::current()->RunUntilIdle();
720 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
721 ControlFlowWrongHWIDScreenFromLogin) {
722 CheckCurrentScreen(WizardController::kNetworkScreenName);
724 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
725 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
726 ExistingUserController::current_controller()->ShowWrongHWIDScreen();
728 CheckCurrentScreen(WizardController::kWrongHWIDScreenName);
730 // After warning is skipped, user returns to sign-in screen.
731 // And this destroys WizardController.
732 OnExit(BaseScreenDelegate::WRONG_HWID_WARNING_SKIPPED);
733 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
736 class WizardControllerDeviceStateTest : public WizardControllerFlowTest {
738 WizardControllerDeviceStateTest()
739 : install_attributes_(std::string(),
742 policy::DEVICE_MODE_NOT_SET) {
743 fake_statistics_provider_.SetMachineStatistic("serial_number", "test");
744 fake_statistics_provider_.SetMachineStatistic(system::kActivateDateKey,
748 virtual void SetUpCommandLine(CommandLine* command_line) override {
749 WizardControllerFlowTest::SetUpCommandLine(command_line);
751 command_line->AppendSwitchASCII(
752 switches::kEnterpriseEnableForcedReEnrollment,
753 chromeos::AutoEnrollmentController::kForcedReEnrollmentAlways);
754 command_line->AppendSwitchASCII(
755 switches::kEnterpriseEnrollmentInitialModulus, "1");
756 command_line->AppendSwitchASCII(
757 switches::kEnterpriseEnrollmentModulusLimit, "2");
760 system::ScopedFakeStatisticsProvider fake_statistics_provider_;
763 policy::ScopedStubEnterpriseInstallAttributes install_attributes_;
765 DISALLOW_COPY_AND_ASSIGN(WizardControllerDeviceStateTest);
768 IN_PROC_BROWSER_TEST_F(WizardControllerDeviceStateTest,
769 ControlFlowForcedReEnrollment) {
770 CheckCurrentScreen(WizardController::kNetworkScreenName);
771 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
772 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
773 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
775 CheckCurrentScreen(WizardController::kEulaScreenName);
776 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
777 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
778 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
779 OnExit(BaseScreenDelegate::EULA_ACCEPTED);
781 // Let update screen smooth time process (time = 0ms).
782 content::RunAllPendingInMessageLoop();
784 CheckCurrentScreen(WizardController::kUpdateScreenName);
785 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
786 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
787 OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
789 AutoEnrollmentCheckScreen* screen =
790 AutoEnrollmentCheckScreen::Get(WizardController::default_controller());
792 WizardController::default_controller()->current_screen());
793 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
796 // Wait for auto-enrollment controller to encounter the connection error.
797 WaitForAutoEnrollmentState(policy::AUTO_ENROLLMENT_STATE_CONNECTION_ERROR);
799 // The error screen shows up if there's no auto-enrollment decision.
800 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
801 EXPECT_EQ(GetErrorScreen(),
802 WizardController::default_controller()->current_screen());
803 base::DictionaryValue device_state;
804 device_state.SetString(policy::kDeviceStateRestoreMode,
805 policy::kDeviceStateRestoreModeReEnrollmentEnforced);
806 g_browser_process->local_state()->Set(prefs::kServerBackedDeviceState,
808 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
809 EXPECT_CALL(*mock_enrollment_screen_->actor(),
810 SetParameters(mock_enrollment_screen_,
811 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
813 OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
815 ResetAutoEnrollmentCheckScreen();
817 // Make sure enterprise enrollment page shows up.
818 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
819 OnExit(BaseScreenDelegate::ENTERPRISE_ENROLLMENT_COMPLETED);
821 EXPECT_TRUE(StartupUtils::IsOobeCompleted());
824 IN_PROC_BROWSER_TEST_F(WizardControllerDeviceStateTest,
825 ControlFlowNoForcedReEnrollmentOnFirstBoot) {
826 fake_statistics_provider_.ClearMachineStatistic(system::kActivateDateKey);
827 EXPECT_NE(policy::AUTO_ENROLLMENT_STATE_NO_ENROLLMENT,
828 LoginDisplayHostImpl::default_host()
829 ->GetAutoEnrollmentController()
832 CheckCurrentScreen(WizardController::kNetworkScreenName);
833 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
834 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
835 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
837 CheckCurrentScreen(WizardController::kEulaScreenName);
838 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
839 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
840 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
841 OnExit(BaseScreenDelegate::EULA_ACCEPTED);
843 // Let update screen smooth time process (time = 0ms).
844 content::RunAllPendingInMessageLoop();
846 CheckCurrentScreen(WizardController::kUpdateScreenName);
847 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
848 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
849 OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
851 AutoEnrollmentCheckScreen* screen =
852 AutoEnrollmentCheckScreen::Get(WizardController::default_controller());
854 WizardController::default_controller()->current_screen());
856 EXPECT_EQ(policy::AUTO_ENROLLMENT_STATE_NO_ENROLLMENT,
857 LoginDisplayHostImpl::default_host()
858 ->GetAutoEnrollmentController()
862 IN_PROC_BROWSER_TEST_F(WizardControllerDeviceStateTest,
863 ControlFlowDeviceDisabled) {
864 CheckCurrentScreen(WizardController::kNetworkScreenName);
865 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
866 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
867 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
869 CheckCurrentScreen(WizardController::kEulaScreenName);
870 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
871 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
872 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
873 OnExit(BaseScreenDelegate::EULA_ACCEPTED);
875 // Let update screen smooth time process (time = 0ms).
876 content::RunAllPendingInMessageLoop();
878 CheckCurrentScreen(WizardController::kUpdateScreenName);
879 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
880 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
881 OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
883 AutoEnrollmentCheckScreen* screen =
884 AutoEnrollmentCheckScreen::Get(WizardController::default_controller());
886 WizardController::default_controller()->current_screen());
887 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
890 // Wait for auto-enrollment controller to encounter the connection error.
891 WaitForAutoEnrollmentState(policy::AUTO_ENROLLMENT_STATE_CONNECTION_ERROR);
893 // The error screen shows up if device state could not be retrieved.
894 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
895 EXPECT_EQ(GetErrorScreen(),
896 WizardController::default_controller()->current_screen());
897 base::DictionaryValue device_state;
898 device_state.SetString(policy::kDeviceStateRestoreMode,
899 policy::kDeviceStateRestoreModeDisabled);
900 device_state.SetString(policy::kDeviceStateDisabledMessage, kDisabledMessage);
901 g_browser_process->local_state()->Set(prefs::kServerBackedDeviceState,
903 EXPECT_CALL(*device_disabled_screen_actor_,
904 UpdateMessage(kDisabledMessage)).Times(1);
905 EXPECT_CALL(*device_disabled_screen_actor_, Show()).Times(1);
906 OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
908 ResetAutoEnrollmentCheckScreen();
910 // Make sure the device disabled screen is shown.
911 CheckCurrentScreen(WizardController::kDeviceDisabledScreenName);
913 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
916 class WizardControllerBrokenLocalStateTest : public WizardControllerTest {
918 WizardControllerBrokenLocalStateTest()
919 : fake_session_manager_client_(NULL) {
922 virtual ~WizardControllerBrokenLocalStateTest() {}
924 virtual void SetUpInProcessBrowserTestFixture() override {
925 WizardControllerTest::SetUpInProcessBrowserTestFixture();
927 fake_session_manager_client_ = new FakeSessionManagerClient;
928 DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient(
929 scoped_ptr<SessionManagerClient>(fake_session_manager_client_));
932 virtual void SetUpOnMainThread() override {
933 base::PrefServiceFactory factory;
934 factory.set_user_prefs(make_scoped_refptr(new PrefStoreStub()));
935 local_state_ = factory.Create(new PrefRegistrySimple()).Pass();
936 WizardController::set_local_state_for_testing(local_state_.get());
938 WizardControllerTest::SetUpOnMainThread();
940 // Make sure that OOBE is run as an "official" build.
941 WizardController::default_controller()->is_official_build_ = true;
944 FakeSessionManagerClient* fake_session_manager_client() const {
945 return fake_session_manager_client_;
949 scoped_ptr<PrefService> local_state_;
950 FakeSessionManagerClient* fake_session_manager_client_;
952 DISALLOW_COPY_AND_ASSIGN(WizardControllerBrokenLocalStateTest);
955 IN_PROC_BROWSER_TEST_F(WizardControllerBrokenLocalStateTest,
956 LocalStateCorrupted) {
957 // Checks that after wizard controller initialization error screen
958 // in the proper state is displayed.
959 ASSERT_EQ(GetErrorScreen(),
960 WizardController::default_controller()->current_screen());
961 ASSERT_EQ(ErrorScreen::UI_STATE_LOCAL_STATE_ERROR,
962 GetErrorScreen()->GetUIState());
964 WaitUntilJSIsReady();
966 // Checks visibility of the error message and powerwash button.
967 ASSERT_FALSE(JSExecuteBooleanExpression("$('error-message').hidden"));
968 ASSERT_TRUE(JSExecuteBooleanExpression(
969 "$('error-message').classList.contains('ui-state-local-state-error')"));
970 ASSERT_TRUE(JSExecuteBooleanExpression("$('progress-dots').hidden"));
971 ASSERT_TRUE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
973 // Emulates user click on the "Restart and Powerwash" button.
974 ASSERT_EQ(0, fake_session_manager_client()->start_device_wipe_call_count());
975 ASSERT_TRUE(content::ExecuteScript(
977 "$('error-message-restart-and-powerwash-button').click();"));
978 ASSERT_EQ(1, fake_session_manager_client()->start_device_wipe_call_count());
981 class WizardControllerProxyAuthOnSigninTest : public WizardControllerTest {
983 WizardControllerProxyAuthOnSigninTest()
984 : proxy_server_(net::SpawnedTestServer::TYPE_BASIC_AUTH_PROXY,
985 net::SpawnedTestServer::kLocalhost,
988 virtual ~WizardControllerProxyAuthOnSigninTest() {}
990 // Overridden from WizardControllerTest:
991 virtual void SetUp() override {
992 ASSERT_TRUE(proxy_server_.Start());
993 WizardControllerTest::SetUp();
996 virtual void SetUpOnMainThread() override {
997 WizardControllerTest::SetUpOnMainThread();
998 WizardController::default_controller()->AdvanceToScreen(
999 WizardController::kNetworkScreenName);
1002 virtual void SetUpCommandLine(CommandLine* command_line) override {
1003 command_line->AppendSwitchASCII(::switches::kProxyServer,
1004 proxy_server_.host_port_pair().ToString());
1007 net::SpawnedTestServer& proxy_server() { return proxy_server_; }
1010 net::SpawnedTestServer proxy_server_;
1012 DISALLOW_COPY_AND_ASSIGN(WizardControllerProxyAuthOnSigninTest);
1015 IN_PROC_BROWSER_TEST_F(WizardControllerProxyAuthOnSigninTest,
1016 ProxyAuthDialogOnSigninScreen) {
1017 content::WindowedNotificationObserver auth_needed_waiter(
1018 chrome::NOTIFICATION_AUTH_NEEDED,
1019 content::NotificationService::AllSources());
1021 CheckCurrentScreen(WizardController::kNetworkScreenName);
1023 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
1024 auth_needed_waiter.Wait();
1027 class WizardControllerKioskFlowTest : public WizardControllerFlowTest {
1029 WizardControllerKioskFlowTest() {}
1031 // Overridden from InProcessBrowserTest:
1032 virtual void SetUpCommandLine(CommandLine* command_line) override {
1033 base::FilePath test_data_dir;
1034 ASSERT_TRUE(chromeos::test_utils::GetTestDataPath(
1035 "app_mode", "kiosk_manifest", &test_data_dir));
1036 command_line->AppendSwitchPath(
1037 switches::kAppOemManifestFile,
1038 test_data_dir.AppendASCII("kiosk_manifest.json"));
1042 DISALLOW_COPY_AND_ASSIGN(WizardControllerKioskFlowTest);
1045 IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
1046 ControlFlowKioskForcedEnrollment) {
1047 EXPECT_CALL(*mock_enrollment_screen_->actor(),
1048 SetParameters(mock_enrollment_screen_,
1049 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
1053 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
1054 CheckCurrentScreen(WizardController::kNetworkScreenName);
1055 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
1056 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
1057 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
1059 CheckCurrentScreen(WizardController::kEulaScreenName);
1060 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
1061 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
1062 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
1063 OnExit(BaseScreenDelegate::EULA_ACCEPTED);
1065 // Let update screen smooth time process (time = 0ms).
1066 content::RunAllPendingInMessageLoop();
1068 CheckCurrentScreen(WizardController::kUpdateScreenName);
1069 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
1070 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
1071 OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
1073 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
1074 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
1075 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
1076 OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
1078 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
1080 // Make sure enterprise enrollment page shows up right after update screen.
1081 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
1082 OnExit(BaseScreenDelegate::ENTERPRISE_ENROLLMENT_COMPLETED);
1084 EXPECT_TRUE(StartupUtils::IsOobeCompleted());
1088 IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
1089 ControlFlowEnrollmentBack) {
1090 EXPECT_CALL(*mock_enrollment_screen_->actor(),
1091 SetParameters(mock_enrollment_screen_,
1092 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
1096 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
1097 CheckCurrentScreen(WizardController::kNetworkScreenName);
1098 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
1099 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
1100 OnExit(BaseScreenDelegate::NETWORK_CONNECTED);
1102 CheckCurrentScreen(WizardController::kEulaScreenName);
1103 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
1104 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
1105 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
1106 OnExit(BaseScreenDelegate::EULA_ACCEPTED);
1108 // Let update screen smooth time process (time = 0ms).
1109 content::RunAllPendingInMessageLoop();
1111 CheckCurrentScreen(WizardController::kUpdateScreenName);
1112 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
1113 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
1114 OnExit(BaseScreenDelegate::UPDATE_INSTALLED);
1116 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
1117 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Hide()).Times(1);
1118 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
1119 EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(1);
1120 OnExit(BaseScreenDelegate::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
1122 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
1124 // Make sure enterprise enrollment page shows up right after update screen.
1125 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
1126 EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(1);
1127 OnExit(BaseScreenDelegate::ENTERPRISE_ENROLLMENT_BACK);
1129 CheckCurrentScreen(WizardController::kAutoEnrollmentCheckScreenName);
1130 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
1133 class WizardControllerOobeResumeTest : public WizardControllerTest {
1135 WizardControllerOobeResumeTest() {}
1136 // Overriden from InProcessBrowserTest:
1137 virtual void SetUpOnMainThread() override {
1138 WizardControllerTest::SetUpOnMainThread();
1140 // Make sure that OOBE is run as an "official" build.
1141 WizardController::default_controller()->is_official_build_ = true;
1143 // Clear portal list (as it is by default in OOBE).
1144 NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
1146 // Set up the mocks for all screens.
1147 MOCK(mock_network_screen_,
1150 MockNetworkScreenActor);
1151 MOCK(mock_enrollment_screen_,
1152 kEnrollmentScreenName,
1153 MockEnrollmentScreen,
1154 MockEnrollmentScreenActor);
1157 void OnExit(BaseScreenDelegate::ExitCodes exit_code) {
1158 WizardController::default_controller()->OnExit(exit_code);
1161 std::string GetFirstScreenName() {
1162 return WizardController::default_controller()->first_screen_name();
1165 MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
1166 mock_network_screen_;
1167 MockOutShowHide<MockEnrollmentScreen,
1168 MockEnrollmentScreenActor>* mock_enrollment_screen_;
1171 DISALLOW_COPY_AND_ASSIGN(WizardControllerOobeResumeTest);
1174 IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
1175 PRE_ControlFlowResumeInterruptedOobe) {
1176 // Switch to the initial screen.
1177 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
1178 WizardController::default_controller()->AdvanceToScreen(
1179 WizardController::kNetworkScreenName);
1180 CheckCurrentScreen(WizardController::kNetworkScreenName);
1181 EXPECT_CALL(*mock_enrollment_screen_->actor(),
1182 SetParameters(mock_enrollment_screen_,
1183 EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
1185 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
1186 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
1188 WizardController::default_controller()->AdvanceToScreen(
1189 WizardController::kEnrollmentScreenName);
1190 CheckCurrentScreen(WizardController::kEnrollmentScreenName);
1193 IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
1194 ControlFlowResumeInterruptedOobe) {
1195 EXPECT_EQ(WizardController::kEnrollmentScreenName, GetFirstScreenName());
1198 // TODO(dzhioev): Add test emaulating device with wrong HWID.
1200 // TODO(nkostylev): Add test for WebUI accelerators http://crosbug.com/22571
1202 // TODO(merkulova): Add tests for bluetooth HID detection screen variations when
1203 // UI and logic is ready. http://crbug.com/127016
1205 // TODO(dzhioev): Add tests for controller/host pairing flow.
1206 // http://crbug.com/375191
1208 COMPILE_ASSERT(BaseScreenDelegate::EXIT_CODES_COUNT == 23,
1209 add_tests_for_new_control_flow_you_just_introduced);
1211 } // namespace chromeos