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 "base/basictypes.h"
6 #include "base/command_line.h"
7 #include "base/compiler_specific.h"
8 #include "base/path_service.h"
9 #include "base/prefs/pref_registry_simple.h"
10 #include "base/prefs/pref_service.h"
11 #include "base/prefs/pref_service_factory.h"
12 #include "base/prefs/testing_pref_store.h"
13 #include "base/run_loop.h"
14 #include "base/strings/utf_string_conversions.h"
15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/browser_shutdown.h"
17 #include "chrome/browser/chrome_notification_types.h"
18 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
19 #include "chrome/browser/chromeos/base/locale_util.h"
20 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
21 #include "chrome/browser/chromeos/login/enrollment/mock_enrollment_screen.h"
22 #include "chrome/browser/chromeos/login/existing_user_controller.h"
23 #include "chrome/browser/chromeos/login/login_display_host_impl.h"
24 #include "chrome/browser/chromeos/login/mock_authenticator.h"
25 #include "chrome/browser/chromeos/login/mock_login_status_consumer.h"
26 #include "chrome/browser/chromeos/login/screens/error_screen.h"
27 #include "chrome/browser/chromeos/login/screens/mock_eula_screen.h"
28 #include "chrome/browser/chromeos/login/screens/mock_network_screen.h"
29 #include "chrome/browser/chromeos/login/screens/mock_update_screen.h"
30 #include "chrome/browser/chromeos/login/screens/network_screen.h"
31 #include "chrome/browser/chromeos/login/screens/reset_screen.h"
32 #include "chrome/browser/chromeos/login/screens/user_image_screen.h"
33 #include "chrome/browser/chromeos/login/screens/wrong_hwid_screen.h"
34 #include "chrome/browser/chromeos/login/startup_utils.h"
35 #include "chrome/browser/chromeos/login/test_login_utils.h"
36 #include "chrome/browser/chromeos/login/webui_login_view.h"
37 #include "chrome/browser/chromeos/login/wizard_controller.h"
38 #include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h"
39 #include "chrome/browser/chromeos/policy/server_backed_device_state.h"
40 #include "chrome/browser/chromeos/profiles/profile_helper.h"
41 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
42 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
43 #include "chrome/common/chrome_paths.h"
44 #include "chrome/common/chrome_switches.h"
45 #include "chrome/common/pref_names.h"
46 #include "chrome/test/base/ui_test_utils.h"
47 #include "chromeos/audio/cras_audio_handler.h"
48 #include "chromeos/chromeos_switches.h"
49 #include "chromeos/chromeos_test_utils.h"
50 #include "chromeos/dbus/dbus_thread_manager.h"
51 #include "chromeos/dbus/fake_dbus_thread_manager.h"
52 #include "chromeos/dbus/fake_session_manager_client.h"
53 #include "chromeos/network/network_state_handler.h"
54 #include "chromeos/system/mock_statistics_provider.h"
55 #include "chromeos/system/statistics_provider.h"
56 #include "content/public/test/browser_test_utils.h"
57 #include "content/public/test/test_utils.h"
58 #include "grit/generated_resources.h"
59 #include "net/test/spawned_test_server/spawned_test_server.h"
60 #include "testing/gmock/include/gmock/gmock.h"
61 #include "testing/gtest/include/gtest/gtest.h"
62 #include "third_party/icu/source/common/unicode/locid.h"
63 #include "ui/base/accelerators/accelerator.h"
64 #include "ui/base/l10n/l10n_util.h"
66 using ::testing::Exactly;
67 using ::testing::Invoke;
68 using ::testing::Return;
73 const char kUsername[] = "test_user@managedchrome.com";
74 const char kPassword[] = "test_password";
76 class PrefStoreStub : public TestingPrefStore {
78 // TestingPrefStore overrides:
79 virtual PrefReadError GetReadError() const OVERRIDE {
80 return PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE;
83 virtual bool IsInitializationComplete() const OVERRIDE {
88 virtual ~PrefStoreStub() {}
91 struct SwitchLanguageTestData {
92 SwitchLanguageTestData() : success(false), done(false) {}
94 std::string requested_locale;
95 std::string loaded_locale;
100 void OnLocaleSwitched(SwitchLanguageTestData* self,
101 const std::string& locale,
102 const std::string& loaded_locale,
103 const bool success) {
104 self->requested_locale = locale;
105 self->loaded_locale = loaded_locale;
106 self->success = success;
110 void RunSwitchLanguageTest(const std::string& locale,
111 const std::string& expected_locale,
112 const bool expect_success) {
113 SwitchLanguageTestData data;
114 scoped_ptr<locale_util::SwitchLanguageCallback> callback(
115 new locale_util::SwitchLanguageCallback(
116 base::Bind(&OnLocaleSwitched, base::Unretained(&data))));
117 locale_util::SwitchLanguage(locale, true, false, callback.Pass());
119 // Token writing moves control to BlockingPool and back.
120 base::RunLoop().RunUntilIdle();
121 content::BrowserThread::GetBlockingPool()->FlushForTesting();
122 base::RunLoop().RunUntilIdle();
124 EXPECT_EQ(data.done, true);
125 EXPECT_EQ(data.requested_locale, locale);
126 EXPECT_EQ(data.loaded_locale, expected_locale);
127 EXPECT_EQ(data.success, expect_success);
130 void SetUpCrasAndEnableChromeVox(int volume_percent, bool mute_on) {
131 AccessibilityManager* a11y = AccessibilityManager::Get();
132 CrasAudioHandler* cras = CrasAudioHandler::Get();
134 // Audio output is at |volume_percent| and |mute_on|. Spoken feedback
136 cras->SetOutputVolumePercent(volume_percent);
137 cras->SetOutputMute(mute_on);
138 a11y->EnableSpokenFeedback(false, ash::A11Y_NOTIFICATION_NONE);
140 // Spoken feedback is enabled.
141 a11y->EnableSpokenFeedback(true, ash::A11Y_NOTIFICATION_NONE);
142 base::RunLoop().RunUntilIdle();
145 void QuitLoopOnAutoEnrollmentProgress(
146 policy::AutoEnrollmentState expected_state,
148 policy::AutoEnrollmentState actual_state) {
149 if (expected_state == actual_state)
153 void WaitForAutoEnrollmentState(policy::AutoEnrollmentState state) {
155 AutoEnrollmentController* auto_enrollment_controller =
156 LoginDisplayHostImpl::default_host()->GetAutoEnrollmentController();
157 scoped_ptr<AutoEnrollmentController::ProgressCallbackList::Subscription>
158 progress_subscription(
159 auto_enrollment_controller->RegisterProgressCallback(
160 base::Bind(&QuitLoopOnAutoEnrollmentProgress, state, &loop)));
168 template <class T, class H>
169 class MockOutShowHide : public T {
171 template <class P> explicit MockOutShowHide(P p) : T(p) {}
172 template <class P> MockOutShowHide(P p, H* actor)
173 : T(p, actor), actor_(actor) {}
175 H* actor() const { return actor_.get(); }
177 MOCK_METHOD0(Show, void());
178 MOCK_METHOD0(Hide, void());
181 scoped_ptr<H> actor_;
184 #define MOCK(mock_var, screen_name, mocked_class, actor_class) \
185 mock_var = new MockOutShowHide<mocked_class, actor_class>( \
186 WizardController::default_controller(), new actor_class); \
187 WizardController::default_controller()->screen_name.reset(mock_var); \
188 EXPECT_CALL(*mock_var, Show()).Times(0); \
189 EXPECT_CALL(*mock_var, Hide()).Times(0);
191 class WizardControllerTest : public WizardInProcessBrowserTest {
193 WizardControllerTest() : WizardInProcessBrowserTest(
194 WizardController::kTestNoScreenName) {}
195 virtual ~WizardControllerTest() {}
197 virtual void SetUpOnMainThread() OVERRIDE {
198 AccessibilityManager::Get()->
199 SetProfileForTest(ProfileHelper::GetSigninProfile());
200 WizardInProcessBrowserTest::SetUpOnMainThread();
203 ErrorScreen* GetErrorScreen() {
204 return static_cast<ScreenObserver*>(WizardController::default_controller())
209 DISALLOW_COPY_AND_ASSIGN(WizardControllerTest);
212 IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
213 ASSERT_TRUE(WizardController::default_controller() != NULL);
214 WizardController::default_controller()->AdvanceToScreen(
215 WizardController::kNetworkScreenName);
217 // Checking the default locale. Provided that the profile is cleared in SetUp.
218 EXPECT_EQ("en-US", g_browser_process->GetApplicationLocale());
219 EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage());
220 EXPECT_FALSE(base::i18n::IsRTL());
221 const std::wstring en_str =
222 base::UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE));
224 RunSwitchLanguageTest("fr", "fr", true);
225 EXPECT_EQ("fr", g_browser_process->GetApplicationLocale());
226 EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage());
227 EXPECT_FALSE(base::i18n::IsRTL());
228 const std::wstring fr_str =
229 base::UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE));
231 EXPECT_NE(en_str, fr_str);
233 RunSwitchLanguageTest("ar", "ar", true);
234 EXPECT_EQ("ar", g_browser_process->GetApplicationLocale());
235 EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage());
236 EXPECT_TRUE(base::i18n::IsRTL());
237 const std::wstring ar_str =
238 base::UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE));
240 EXPECT_NE(fr_str, ar_str);
243 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsChangedForChromeVox) {
244 SetUpCrasAndEnableChromeVox(75 /* volume_percent */, true /* mute_on */);
246 // Check that output is unmuted now and at some level.
247 CrasAudioHandler* cras = CrasAudioHandler::Get();
248 ASSERT_FALSE(cras->IsOutputMuted());
249 ASSERT_EQ(WizardController::kMinAudibleOutputVolumePercent,
250 cras->GetOutputVolumePercent());
253 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsUnchangedForChromeVox) {
254 SetUpCrasAndEnableChromeVox(75 /* volume_percent */, false /* mute_on */);
256 // Check that output is unmuted now and at some level.
257 CrasAudioHandler* cras = CrasAudioHandler::Get();
258 ASSERT_FALSE(cras->IsOutputMuted());
259 ASSERT_EQ(75, cras->GetOutputVolumePercent());
262 IN_PROC_BROWSER_TEST_F(WizardControllerTest, VolumeIsAdjustedForChromeVox) {
263 SetUpCrasAndEnableChromeVox(5 /* volume_percent */, false /* mute_on */);
265 // Check that output is unmuted now and at some level.
266 CrasAudioHandler* cras = CrasAudioHandler::Get();
267 ASSERT_FALSE(cras->IsOutputMuted());
268 ASSERT_EQ(WizardController::kMinAudibleOutputVolumePercent,
269 cras->GetOutputVolumePercent());
272 class WizardControllerFlowTest : public WizardControllerTest {
274 WizardControllerFlowTest() {}
275 // Overriden from InProcessBrowserTest:
276 virtual void SetUpOnMainThread() OVERRIDE {
277 WizardControllerTest::SetUpOnMainThread();
279 // Make sure that OOBE is run as an "official" build.
280 WizardController::default_controller()->is_official_build_ = true;
282 // Clear portal list (as it is by default in OOBE).
283 NetworkHandler::Get()->network_state_handler()->SetCheckPortalList("");
285 // Set up the mocks for all screens.
286 MOCK(mock_network_screen_, network_screen_,
287 MockNetworkScreen, MockNetworkScreenActor);
288 MOCK(mock_update_screen_, update_screen_,
289 MockUpdateScreen, MockUpdateScreenActor);
290 MOCK(mock_eula_screen_, eula_screen_, MockEulaScreen, MockEulaScreenActor);
291 MOCK(mock_enrollment_screen_, enrollment_screen_,
292 MockEnrollmentScreen, MockEnrollmentScreenActor);
294 // Switch to the initial screen.
295 EXPECT_EQ(NULL, WizardController::default_controller()->current_screen());
296 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
297 WizardController::default_controller()->AdvanceToScreen(
298 WizardController::kNetworkScreenName);
301 void OnExit(ScreenObserver::ExitCodes exit_code) {
302 WizardController::default_controller()->OnExit(exit_code);
305 MockOutShowHide<MockNetworkScreen, MockNetworkScreenActor>*
306 mock_network_screen_;
307 MockOutShowHide<MockUpdateScreen, MockUpdateScreenActor>* mock_update_screen_;
308 MockOutShowHide<MockEulaScreen, MockEulaScreenActor>* mock_eula_screen_;
309 MockOutShowHide<MockEnrollmentScreen,
310 MockEnrollmentScreenActor>* mock_enrollment_screen_;
313 DISALLOW_COPY_AND_ASSIGN(WizardControllerFlowTest);
316 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
317 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
318 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
319 WizardController::default_controller()->current_screen());
320 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
321 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
322 OnExit(ScreenObserver::NETWORK_CONNECTED);
324 EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
325 WizardController::default_controller()->current_screen());
326 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
327 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
328 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
329 OnExit(ScreenObserver::EULA_ACCEPTED);
330 // Let update screen smooth time process (time = 0ms).
331 content::RunAllPendingInMessageLoop();
333 EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
334 WizardController::default_controller()->current_screen());
335 EXPECT_CALL(*mock_update_screen_, Hide()).Times(0);
336 EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
337 OnExit(ScreenObserver::UPDATE_INSTALLED);
339 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
340 EXPECT_EQ("ethernet,wifi,cellular",
341 NetworkHandler::Get()->network_state_handler()
342 ->GetCheckPortalListForTest());
345 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
346 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
347 WizardController::default_controller()->current_screen());
348 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
349 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
350 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
351 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
352 OnExit(ScreenObserver::NETWORK_CONNECTED);
354 EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
355 WizardController::default_controller()->current_screen());
356 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
357 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
358 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
359 OnExit(ScreenObserver::EULA_ACCEPTED);
360 // Let update screen smooth time process (time = 0ms).
361 content::RunAllPendingInMessageLoop();
363 EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
364 WizardController::default_controller()->current_screen());
365 EXPECT_CALL(*mock_update_screen_, Hide()).Times(0);
366 EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
367 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(0); // last transition
368 OnExit(ScreenObserver::UPDATE_ERROR_UPDATING);
370 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
373 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowSkipUpdateEnroll) {
374 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
375 WizardController::default_controller()->current_screen());
376 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
377 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
378 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
379 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
380 OnExit(ScreenObserver::NETWORK_CONNECTED);
382 EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
383 WizardController::default_controller()->current_screen());
384 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
385 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
386 EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
387 WizardController::default_controller()->SkipUpdateEnrollAfterEula();
388 EXPECT_CALL(*mock_enrollment_screen_->actor(),
389 SetParameters(mock_enrollment_screen_,
390 EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
393 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
394 EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(0);
395 OnExit(ScreenObserver::EULA_ACCEPTED);
396 content::RunAllPendingInMessageLoop();
398 EXPECT_EQ(WizardController::default_controller()->GetEnrollmentScreen(),
399 WizardController::default_controller()->current_screen());
400 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
401 EXPECT_EQ("ethernet,wifi,cellular",
402 NetworkHandler::Get()->network_state_handler()
403 ->GetCheckPortalListForTest());
406 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) {
407 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
408 WizardController::default_controller()->current_screen());
409 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
410 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
411 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
412 OnExit(ScreenObserver::NETWORK_CONNECTED);
414 EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
415 WizardController::default_controller()->current_screen());
416 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
417 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
418 EXPECT_CALL(*mock_network_screen_, Hide()).Times(0); // last transition
419 OnExit(ScreenObserver::EULA_BACK);
421 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
422 WizardController::default_controller()->current_screen());
425 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
426 ControlFlowEnrollmentCompleted) {
427 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
428 WizardController::default_controller()->current_screen());
429 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
430 EXPECT_CALL(*mock_enrollment_screen_->actor(),
431 SetParameters(mock_enrollment_screen_,
432 EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL,
435 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
436 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
438 WizardController::default_controller()->AdvanceToScreen(
439 WizardController::kEnrollmentScreenName);
440 EnrollmentScreen* screen =
441 WizardController::default_controller()->GetEnrollmentScreen();
442 EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
443 OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
445 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
448 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
449 ControlFlowAutoEnrollmentCompleted) {
450 WizardController::default_controller()->SkipPostLoginScreensForTesting();
451 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
452 WizardController::default_controller()->current_screen());
453 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
455 LoginUtils::Set(new TestLoginUtils(kUsername, kPassword));
456 MockConsumer mock_consumer;
458 // Must have a pending signin to resume after auto-enrollment:
459 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
460 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
461 ExistingUserController::current_controller()->DoAutoEnrollment();
462 ExistingUserController::current_controller()->set_login_status_consumer(
464 // This calls StartWizard, destroying the current controller() and its mocks;
465 // don't set expectations on those objects.
466 ExistingUserController::current_controller()->CompleteLogin(
467 UserContext(kUsername, kPassword, ""));
468 // Run the tasks posted to complete the login:
469 base::MessageLoop::current()->RunUntilIdle();
471 EnrollmentScreen* screen =
472 WizardController::default_controller()->GetEnrollmentScreen();
473 EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
474 // This is the main expectation: after auto-enrollment, login is resumed.
475 EXPECT_CALL(mock_consumer, OnLoginSuccess(_)).Times(1);
476 OnExit(ScreenObserver::ENTERPRISE_AUTO_MAGIC_ENROLLMENT_COMPLETED);
477 // Prevent browser launch when the profile is prepared:
478 browser_shutdown::SetTryingToQuit(true);
479 // Run the tasks posted to complete the login:
480 base::MessageLoop::current()->RunUntilIdle();
483 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowResetScreen) {
484 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
485 WizardController::default_controller()->current_screen());
487 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
488 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
489 ExistingUserController::current_controller()->OnStartDeviceReset();
491 ResetScreen* screen =
492 WizardController::default_controller()->GetResetScreen();
493 EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
495 // After reset screen is canceled, it returns to sign-in screen.
496 // And this destroys WizardController.
497 OnExit(ScreenObserver::RESET_CANCELED);
498 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
501 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
502 ControlFlowWrongHWIDScreenFromLogin) {
503 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
504 WizardController::default_controller()->current_screen());
506 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
507 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
508 ExistingUserController::current_controller()->ShowWrongHWIDScreen();
510 WrongHWIDScreen* screen =
511 WizardController::default_controller()->GetWrongHWIDScreen();
512 EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
514 // After warning is skipped, user returns to sign-in screen.
515 // And this destroys WizardController.
516 OnExit(ScreenObserver::WRONG_HWID_WARNING_SKIPPED);
517 EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
520 class WizardControllerEnrollmentFlowTest : public WizardControllerFlowTest {
522 WizardControllerEnrollmentFlowTest() {}
524 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
525 WizardControllerFlowTest::SetUpCommandLine(command_line);
527 command_line->AppendSwitchASCII(
528 switches::kEnterpriseEnableForcedReEnrollment,
529 chromeos::AutoEnrollmentController::kForcedReEnrollmentAlways);
530 command_line->AppendSwitchASCII(
531 switches::kEnterpriseEnrollmentInitialModulus, "1");
532 command_line->AppendSwitchASCII(
533 switches::kEnterpriseEnrollmentModulusLimit, "2");
536 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
537 WizardControllerFlowTest::SetUpInProcessBrowserTestFixture();
538 system::StatisticsProvider::SetTestProvider(&statistics_provider_);
539 EXPECT_CALL(statistics_provider_, StartLoadingMachineStatistics(_, _));
540 EXPECT_CALL(statistics_provider_, GetMachineStatistic(_, _)).WillRepeatedly(
541 Invoke(this, &WizardControllerEnrollmentFlowTest::GetMachineStatistic));
542 EXPECT_CALL(statistics_provider_, GetMachineFlag(_, _)).WillRepeatedly(
544 EXPECT_CALL(statistics_provider_, Shutdown());
547 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
548 system::StatisticsProvider::SetTestProvider(NULL);
549 WizardControllerFlowTest::TearDownInProcessBrowserTestFixture();
552 bool GetMachineStatistic(const std::string& name, std::string* result) {
553 if (name == system::kDiskSerialNumber) {
554 *result = "fake-disk-serial-number";
556 } else if (name == "serial_number") {
557 *result = "fake-machine-serial-number";
565 system::MockStatisticsProvider statistics_provider_;
567 DISALLOW_COPY_AND_ASSIGN(WizardControllerEnrollmentFlowTest);
570 IN_PROC_BROWSER_TEST_F(WizardControllerEnrollmentFlowTest,
571 ControlFlowForcedReEnrollment) {
572 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
573 WizardController::default_controller()->current_screen());
574 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
575 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
576 OnExit(ScreenObserver::NETWORK_CONNECTED);
578 EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
579 WizardController::default_controller()->current_screen());
580 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
581 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
582 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
583 OnExit(ScreenObserver::EULA_ACCEPTED);
584 // Let update screen smooth time process (time = 0ms).
585 content::RunAllPendingInMessageLoop();
587 EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
588 WizardController::default_controller()->current_screen());
589 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
590 OnExit(ScreenObserver::UPDATE_INSTALLED);
592 // Wait for auto-enrollment controller to encounter the connection error.
593 WaitForAutoEnrollmentState(policy::AUTO_ENROLLMENT_STATE_CONNECTION_ERROR);
595 // The error screen shows up if there's no auto-enrollment decision.
596 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
597 EXPECT_EQ(GetErrorScreen(),
598 WizardController::default_controller()->current_screen());
599 base::DictionaryValue device_state;
600 device_state.SetString(policy::kDeviceStateRestoreMode,
601 policy::kDeviceStateRestoreModeReEnrollmentEnforced);
602 g_browser_process->local_state()->Set(prefs::kServerBackedDeviceState,
604 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
605 EXPECT_CALL(*mock_enrollment_screen_->actor(),
606 SetParameters(mock_enrollment_screen_,
607 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
609 OnExit(ScreenObserver::ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED);
611 // Make sure enterprise enrollment page shows up.
612 EXPECT_EQ(WizardController::default_controller()->GetEnrollmentScreen(),
613 WizardController::default_controller()->current_screen());
614 OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
616 EXPECT_TRUE(StartupUtils::IsOobeCompleted());
619 class WizardControllerBrokenLocalStateTest : public WizardControllerTest {
621 WizardControllerBrokenLocalStateTest()
622 : fake_session_manager_client_(NULL) {
625 virtual ~WizardControllerBrokenLocalStateTest() {}
627 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
628 WizardControllerTest::SetUpInProcessBrowserTestFixture();
630 FakeDBusThreadManager* fake_dbus_thread_manager =
631 new FakeDBusThreadManager();
632 fake_dbus_thread_manager->SetFakeClients();
633 fake_session_manager_client_ = new FakeSessionManagerClient;
634 fake_dbus_thread_manager->SetSessionManagerClient(
635 scoped_ptr<SessionManagerClient>(fake_session_manager_client_));
636 DBusThreadManager::SetInstanceForTesting(fake_dbus_thread_manager);
639 virtual void SetUpOnMainThread() OVERRIDE {
640 base::PrefServiceFactory factory;
641 factory.set_user_prefs(make_scoped_refptr(new PrefStoreStub()));
642 local_state_ = factory.Create(new PrefRegistrySimple()).Pass();
643 WizardController::set_local_state_for_testing(local_state_.get());
645 WizardControllerTest::SetUpOnMainThread();
647 // Make sure that OOBE is run as an "official" build.
648 WizardController::default_controller()->is_official_build_ = true;
651 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
652 WizardControllerTest::TearDownInProcessBrowserTestFixture();
655 content::WebContents* GetWebContents() {
656 LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
657 LoginDisplayHostImpl::default_host());
660 WebUILoginView* webui_login_view = host->GetWebUILoginView();
661 if (!webui_login_view)
663 return webui_login_view->GetWebContents();
666 void WaitUntilJSIsReady() {
667 LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(
668 LoginDisplayHostImpl::default_host());
671 chromeos::OobeUI* oobe_ui = host->GetOobeUI();
674 base::RunLoop run_loop;
675 const bool oobe_ui_ready = oobe_ui->IsJSReady(run_loop.QuitClosure());
680 bool JSExecuteBooleanExpression(const std::string& expression) {
682 EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
684 "window.domAutomationController.send(!!(" + expression + "));",
689 FakeSessionManagerClient* fake_session_manager_client() const {
690 return fake_session_manager_client_;
694 scoped_ptr<PrefService> local_state_;
695 FakeSessionManagerClient* fake_session_manager_client_;
697 DISALLOW_COPY_AND_ASSIGN(WizardControllerBrokenLocalStateTest);
700 IN_PROC_BROWSER_TEST_F(WizardControllerBrokenLocalStateTest,
701 LocalStateCorrupted) {
702 // Checks that after wizard controller initialization error screen
703 // in the proper state is displayed.
704 ASSERT_EQ(GetErrorScreen(),
705 WizardController::default_controller()->current_screen());
706 ASSERT_EQ(ErrorScreen::UI_STATE_LOCAL_STATE_ERROR,
707 GetErrorScreen()->GetUIState());
709 WaitUntilJSIsReady();
711 // Checks visibility of the error message and powerwash button.
712 ASSERT_FALSE(JSExecuteBooleanExpression("$('error-message').hidden"));
713 ASSERT_TRUE(JSExecuteBooleanExpression(
714 "$('error-message').classList.contains('ui-state-local-state-error')"));
715 ASSERT_TRUE(JSExecuteBooleanExpression("$('progress-dots').hidden"));
716 ASSERT_TRUE(JSExecuteBooleanExpression("$('login-header-bar').hidden"));
718 // Emulates user click on the "Restart and Powerwash" button.
719 ASSERT_EQ(0, fake_session_manager_client()->start_device_wipe_call_count());
720 ASSERT_TRUE(content::ExecuteScript(
722 "$('error-message-restart-and-powerwash-button').click();"));
723 ASSERT_EQ(1, fake_session_manager_client()->start_device_wipe_call_count());
726 class WizardControllerProxyAuthOnSigninTest : public WizardControllerTest {
728 WizardControllerProxyAuthOnSigninTest()
729 : proxy_server_(net::SpawnedTestServer::TYPE_BASIC_AUTH_PROXY,
730 net::SpawnedTestServer::kLocalhost,
733 virtual ~WizardControllerProxyAuthOnSigninTest() {}
735 // Overridden from WizardControllerTest:
736 virtual void SetUp() OVERRIDE {
737 ASSERT_TRUE(proxy_server_.Start());
738 WizardControllerTest::SetUp();
741 virtual void SetUpOnMainThread() OVERRIDE {
742 WizardControllerTest::SetUpOnMainThread();
743 WizardController::default_controller()->AdvanceToScreen(
744 WizardController::kNetworkScreenName);
747 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
748 command_line->AppendSwitchASCII(::switches::kProxyServer,
749 proxy_server_.host_port_pair().ToString());
752 net::SpawnedTestServer& proxy_server() { return proxy_server_; }
755 net::SpawnedTestServer proxy_server_;
757 DISALLOW_COPY_AND_ASSIGN(WizardControllerProxyAuthOnSigninTest);
760 IN_PROC_BROWSER_TEST_F(WizardControllerProxyAuthOnSigninTest,
761 ProxyAuthDialogOnSigninScreen) {
762 content::WindowedNotificationObserver auth_needed_waiter(
763 chrome::NOTIFICATION_AUTH_NEEDED,
764 content::NotificationService::AllSources());
766 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
767 WizardController::default_controller()->current_screen());
769 LoginDisplayHostImpl::default_host()->StartSignInScreen(LoginScreenContext());
770 auth_needed_waiter.Wait();
773 class WizardControllerKioskFlowTest : public WizardControllerFlowTest {
775 WizardControllerKioskFlowTest() {}
777 // Overridden from InProcessBrowserTest:
778 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
779 base::FilePath test_data_dir;
780 ASSERT_TRUE(chromeos::test_utils::GetTestDataPath(
781 "app_mode", "kiosk_manifest", &test_data_dir));
782 command_line->AppendSwitchPath(
783 switches::kAppOemManifestFile,
784 test_data_dir.AppendASCII("kiosk_manifest.json"));
788 DISALLOW_COPY_AND_ASSIGN(WizardControllerKioskFlowTest);
791 IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
792 ControlFlowKioskForcedEnrollment) {
793 EXPECT_CALL(*mock_enrollment_screen_->actor(),
794 SetParameters(mock_enrollment_screen_,
795 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
799 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
800 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
801 WizardController::default_controller()->current_screen());
802 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
803 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
804 OnExit(ScreenObserver::NETWORK_CONNECTED);
806 EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
807 WizardController::default_controller()->current_screen());
808 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
809 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
810 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
811 OnExit(ScreenObserver::EULA_ACCEPTED);
812 // Let update screen smooth time process (time = 0ms).
813 content::RunAllPendingInMessageLoop();
815 EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
816 WizardController::default_controller()->current_screen());
817 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
818 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
819 OnExit(ScreenObserver::UPDATE_INSTALLED);
821 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
823 // Make sure enterprise enrollment page shows up right after update screen.
824 EnrollmentScreen* screen =
825 WizardController::default_controller()->GetEnrollmentScreen();
826 EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
827 OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED);
829 EXPECT_TRUE(StartupUtils::IsOobeCompleted());
833 IN_PROC_BROWSER_TEST_F(WizardControllerKioskFlowTest,
834 ControlFlowEnrollmentBack) {
836 EXPECT_CALL(*mock_enrollment_screen_->actor(),
837 SetParameters(mock_enrollment_screen_,
838 EnrollmentScreenActor::ENROLLMENT_MODE_FORCED,
842 EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
843 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
844 WizardController::default_controller()->current_screen());
845 EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
846 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
847 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
848 OnExit(ScreenObserver::NETWORK_CONNECTED);
850 EXPECT_EQ(WizardController::default_controller()->GetEulaScreen(),
851 WizardController::default_controller()->current_screen());
852 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
853 EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
854 EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
855 OnExit(ScreenObserver::EULA_ACCEPTED);
856 // Let update screen smooth time process (time = 0ms).
857 content::RunAllPendingInMessageLoop();
859 EXPECT_EQ(WizardController::default_controller()->GetUpdateScreen(),
860 WizardController::default_controller()->current_screen());
861 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
862 EXPECT_CALL(*mock_enrollment_screen_, Show()).Times(1);
863 EXPECT_CALL(*mock_enrollment_screen_, Hide()).Times(1);
864 OnExit(ScreenObserver::UPDATE_INSTALLED);
866 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
868 // Make sure enterprise enrollment page shows up right after update screen.
869 EnrollmentScreen* screen =
870 WizardController::default_controller()->GetEnrollmentScreen();
871 EXPECT_EQ(screen, WizardController::default_controller()->current_screen());
872 OnExit(ScreenObserver::ENTERPRISE_ENROLLMENT_BACK);
874 EXPECT_EQ(WizardController::default_controller()->GetNetworkScreen(),
875 WizardController::default_controller()->current_screen());
876 EXPECT_FALSE(StartupUtils::IsOobeCompleted());
879 // TODO(dzhioev): Add test emaulating device with wrong HWID.
881 // TODO(nkostylev): Add test for WebUI accelerators http://crosbug.com/22571
883 COMPILE_ASSERT(ScreenObserver::EXIT_CODES_COUNT == 20,
884 add_tests_for_new_control_flow_you_just_introduced);
886 } // namespace chromeos