1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/utf_string_conversions.h" 6 #include "chrome/browser/browser_process.h" 7 #include "chrome/browser/chromeos/login/account_screen.h" 8 #include "chrome/browser/chromeos/login/enterprise_enrollment_screen.h" 9 #include "chrome/browser/chromeos/login/eula_view.h" 10 #include "chrome/browser/chromeos/login/existing_user_controller.h" 11 #include "chrome/browser/chromeos/login/language_switch_menu.h" 12 #include "chrome/browser/chromeos/login/mock_update_screen.h" 13 #include "chrome/browser/chromeos/login/network_screen.h" 14 #include "chrome/browser/chromeos/login/network_selection_view.h" 15 #include "chrome/browser/chromeos/login/user_image_screen.h" 16 #include "chrome/browser/chromeos/login/wizard_controller.h" 17 #include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h" 18 #include "chrome/test/ui_test_utils.h" 19 #include "grit/generated_resources.h" 20 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "ui/base/l10n/l10n_util.h" 23 #include "unicode/locid.h" 24 #include "views/accelerator.h" 25 26 namespace { 27 28 template <class T> 29 class MockOutShowHide : public T { 30 public: 31 template <class P> MockOutShowHide(P p) : T(p) {} 32 template <class P1, class P2> MockOutShowHide(P1 p1, P2 p2) : T(p1, p2) {} 33 MOCK_METHOD0(Show, void()); 34 MOCK_METHOD0(Hide, void()); 35 }; 36 37 template <class T> 38 struct CreateMockWizardScreenHelper { 39 static MockOutShowHide<T>* Create(WizardController* wizard); 40 }; 41 42 template <class T> MockOutShowHide<T>* 43 CreateMockWizardScreenHelper<T>::Create(WizardController* wizard) { 44 return new MockOutShowHide<T>(wizard); 45 } 46 47 template <> MockOutShowHide<chromeos::NetworkScreen>* 48 CreateMockWizardScreenHelper<chromeos::NetworkScreen>::Create( 49 WizardController* wizard) { 50 return new MockOutShowHide<chromeos::NetworkScreen>(wizard); 51 } 52 53 #define MOCK(mock_var, screen_name, mocked_class) \ 54 mock_var = CreateMockWizardScreenHelper<mocked_class>::Create(controller()); \ 55 controller()->screen_name.reset(mock_var); \ 56 EXPECT_CALL(*mock_var, Show()).Times(0); \ 57 EXPECT_CALL(*mock_var, Hide()).Times(0); 58 59 } // namespace 60 61 using chromeos::ExistingUserController; 62 63 class WizardControllerTest : public chromeos::WizardInProcessBrowserTest { 64 protected: 65 WizardControllerTest() : chromeos::WizardInProcessBrowserTest( 66 WizardController::kTestNoScreenName) {} 67 virtual ~WizardControllerTest() {} 68 69 private: 70 DISALLOW_COPY_AND_ASSIGN(WizardControllerTest); 71 }; 72 73 IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) { 74 WizardController* const wizard = controller(); 75 ASSERT_TRUE(wizard != NULL); 76 wizard->ShowFirstScreen(WizardController::kNetworkScreenName); 77 views::View* current_screen = wizard->contents(); 78 ASSERT_TRUE(current_screen != NULL); 79 80 // Checking the default locale. Provided that the profile is cleared in SetUp. 81 EXPECT_EQ("en-US", g_browser_process->GetApplicationLocale()); 82 EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 83 EXPECT_FALSE(base::i18n::IsRTL()); 84 const std::wstring en_str = 85 UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE)); 86 87 chromeos::LanguageSwitchMenu::SwitchLanguage("fr"); 88 EXPECT_EQ("fr", g_browser_process->GetApplicationLocale()); 89 EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage()); 90 EXPECT_FALSE(base::i18n::IsRTL()); 91 const std::wstring fr_str = 92 UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE)); 93 94 EXPECT_NE(en_str, fr_str); 95 96 chromeos::LanguageSwitchMenu::SwitchLanguage("ar"); 97 EXPECT_EQ("ar", g_browser_process->GetApplicationLocale()); 98 EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage()); 99 EXPECT_TRUE(base::i18n::IsRTL()); 100 const std::wstring ar_str = 101 UTF16ToWide(l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE)); 102 103 EXPECT_NE(fr_str, ar_str); 104 } 105 106 class WizardControllerFlowTest : public WizardControllerTest { 107 protected: 108 WizardControllerFlowTest() {} 109 // Overriden from InProcessBrowserTest: 110 virtual Browser* CreateBrowser(Profile* profile) { 111 Browser* ret = WizardControllerTest::CreateBrowser(profile); 112 113 // Make sure that OOBE is run as an "official" build. 114 WizardController::default_controller()->is_official_build_ = true; 115 116 // Set up the mocks for all screens. 117 MOCK(mock_account_screen_, account_screen_, chromeos::AccountScreen); 118 MOCK(mock_network_screen_, network_screen_, chromeos::NetworkScreen); 119 MOCK(mock_update_screen_, update_screen_, MockUpdateScreen); 120 MOCK(mock_eula_screen_, eula_screen_, chromeos::EulaScreen); 121 MOCK(mock_enterprise_enrollment_screen_, 122 enterprise_enrollment_screen_, 123 chromeos::EnterpriseEnrollmentScreen); 124 125 // Switch to the initial screen. 126 EXPECT_EQ(NULL, controller()->current_screen()); 127 EXPECT_CALL(*mock_network_screen_, Show()).Times(1); 128 controller()->ShowFirstScreen(WizardController::kNetworkScreenName); 129 130 return ret; 131 } 132 133 void OnExit(chromeos::ScreenObserver::ExitCodes exit_code) { 134 controller()->OnExit(exit_code); 135 } 136 137 MockOutShowHide<chromeos::AccountScreen>* mock_account_screen_; 138 MockOutShowHide<chromeos::NetworkScreen>* mock_network_screen_; 139 MockOutShowHide<MockUpdateScreen>* mock_update_screen_; 140 MockOutShowHide<chromeos::EulaScreen>* mock_eula_screen_; 141 MockOutShowHide<chromeos::EnterpriseEnrollmentScreen>* 142 mock_enterprise_enrollment_screen_; 143 144 private: 145 DISALLOW_COPY_AND_ASSIGN(WizardControllerFlowTest); 146 }; 147 148 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) { 149 EXPECT_TRUE(ExistingUserController::current_controller() == NULL); 150 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 151 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); 152 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1); 153 OnExit(chromeos::ScreenObserver::NETWORK_CONNECTED); 154 155 EXPECT_EQ(controller()->GetEulaScreen(), controller()->current_screen()); 156 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1); 157 EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(1); 158 EXPECT_CALL(*mock_update_screen_, Show()).Times(1); 159 OnExit(chromeos::ScreenObserver::EULA_ACCEPTED); 160 // Let update screen smooth time process (time = 0ms). 161 ui_test_utils::RunAllPendingInMessageLoop(); 162 163 EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen()); 164 EXPECT_CALL(*mock_update_screen_, Hide()).Times(0); 165 EXPECT_CALL(*mock_eula_screen_, Show()).Times(0); 166 OnExit(chromeos::ScreenObserver::UPDATE_INSTALLED); 167 168 EXPECT_FALSE(ExistingUserController::current_controller() == NULL); 169 set_controller(NULL); 170 } 171 172 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) { 173 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 174 EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(0); 175 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1); 176 EXPECT_CALL(*mock_update_screen_, Show()).Times(0); 177 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); 178 OnExit(chromeos::ScreenObserver::NETWORK_CONNECTED); 179 180 EXPECT_EQ(controller()->GetEulaScreen(), controller()->current_screen()); 181 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1); 182 EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(1); 183 EXPECT_CALL(*mock_update_screen_, Show()).Times(1); 184 OnExit(chromeos::ScreenObserver::EULA_ACCEPTED); 185 // Let update screen smooth time process (time = 0ms). 186 ui_test_utils::RunAllPendingInMessageLoop(); 187 188 EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen()); 189 EXPECT_CALL(*mock_update_screen_, Hide()).Times(0); 190 EXPECT_CALL(*mock_eula_screen_, Show()).Times(0); 191 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(0); // last transition 192 OnExit(chromeos::ScreenObserver::UPDATE_ERROR_UPDATING); 193 194 EXPECT_FALSE(ExistingUserController::current_controller() == NULL); 195 set_controller(NULL); 196 } 197 198 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) { 199 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 200 EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(0); 201 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1); 202 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); 203 OnExit(chromeos::ScreenObserver::NETWORK_CONNECTED); 204 205 EXPECT_EQ(controller()->GetEulaScreen(), controller()->current_screen()); 206 EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1); 207 EXPECT_CALL(*mock_network_screen_, Show()).Times(1); 208 EXPECT_CALL(*mock_network_screen_, Hide()).Times(0); // last transition 209 OnExit(chromeos::ScreenObserver::EULA_BACK); 210 211 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 212 } 213 214 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorNetwork) { 215 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 216 OnExit(chromeos::ScreenObserver::NETWORK_OFFLINE); 217 218 EXPECT_FALSE(ExistingUserController::current_controller() == NULL); 219 set_controller(NULL); 220 } 221 222 #if !defined(OFFICIAL_BUILD) 223 // TODO(mnissler): These tests are not yet enabled for official builds. Remove 224 // the guards once we enable the enrollment feature for official builds. 225 226 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, 227 ControlFlowEnterpriseEnrollmentCompleted) { 228 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 229 EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(0); 230 EXPECT_CALL(*mock_enterprise_enrollment_screen_, Show()).Times(1); 231 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); 232 EXPECT_TRUE(controller()->contents()->GetFocusManager()->ProcessAccelerator( 233 views::Accelerator(ui::VKEY_P, false, true, true))); 234 235 EXPECT_EQ(controller()->GetEnterpriseEnrollmentScreen(), 236 controller()->current_screen()); 237 OnExit(chromeos::ScreenObserver::ENTERPRISE_ENROLLMENT_COMPLETED); 238 239 EXPECT_FALSE(ExistingUserController::current_controller() == NULL); 240 set_controller(NULL); 241 } 242 243 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, 244 ControlFlowEnterpriseEnrollmentCancelled) { 245 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 246 EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(0); 247 EXPECT_CALL(*mock_enterprise_enrollment_screen_, Show()).Times(1); 248 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); 249 EXPECT_TRUE(controller()->contents()->GetFocusManager()->ProcessAccelerator( 250 views::Accelerator(ui::VKEY_P, false, true, true))); 251 252 EXPECT_EQ(controller()->GetEnterpriseEnrollmentScreen(), 253 controller()->current_screen()); 254 OnExit(chromeos::ScreenObserver::ENTERPRISE_ENROLLMENT_CANCELLED); 255 256 EXPECT_FALSE(ExistingUserController::current_controller() == NULL); 257 set_controller(NULL); 258 } 259 #endif 260 261 #if defined(OFFICIAL_BUILD) 262 // This test is supposed to fail on official build. 263 #define MAYBE_Accelerators DISABLED_Accelerators 264 #else 265 #define MAYBE_Accelerators Accelerators 266 #endif 267 268 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) { 269 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 270 271 views::FocusManager* focus_manager = NULL; 272 views::Accelerator accel_account_screen(ui::VKEY_A, false, true, true); 273 views::Accelerator accel_network_screen(ui::VKEY_N, false, true, true); 274 views::Accelerator accel_update_screen(ui::VKEY_U, false, true, true); 275 views::Accelerator accel_image_screen(ui::VKEY_I, false, true, true); 276 views::Accelerator accel_eula_screen(ui::VKEY_E, false, true, true); 277 views::Accelerator accel_enterprise_enrollment_screen( 278 ui::VKEY_P, false, true, true); 279 280 focus_manager = controller()->contents()->GetFocusManager(); 281 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); 282 EXPECT_CALL(*mock_enterprise_enrollment_screen_, Show()).Times(1); 283 EXPECT_TRUE( 284 focus_manager->ProcessAccelerator(accel_enterprise_enrollment_screen)); 285 EXPECT_EQ(controller()->GetEnterpriseEnrollmentScreen(), 286 controller()->current_screen()); 287 288 focus_manager = controller()->contents()->GetFocusManager(); 289 EXPECT_CALL(*mock_enterprise_enrollment_screen_, Hide()).Times(1); 290 EXPECT_CALL(*mock_account_screen_, Show()).Times(1); 291 EXPECT_TRUE(focus_manager->ProcessAccelerator(accel_account_screen)); 292 EXPECT_EQ(controller()->GetAccountScreen(), controller()->current_screen()); 293 294 focus_manager = controller()->contents()->GetFocusManager(); 295 EXPECT_CALL(*mock_account_screen_, Hide()).Times(1); 296 EXPECT_CALL(*mock_network_screen_, Show()).Times(1); 297 EXPECT_TRUE(focus_manager->ProcessAccelerator(accel_network_screen)); 298 EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); 299 300 focus_manager = controller()->contents()->GetFocusManager(); 301 EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); 302 EXPECT_CALL(*mock_update_screen_, Show()).Times(1); 303 EXPECT_TRUE(focus_manager->ProcessAccelerator(accel_update_screen)); 304 EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen()); 305 306 focus_manager = controller()->contents()->GetFocusManager(); 307 EXPECT_CALL(*mock_update_screen_, Hide()).Times(1); 308 EXPECT_TRUE(focus_manager->ProcessAccelerator(accel_image_screen)); 309 EXPECT_EQ(controller()->GetUserImageScreen(), controller()->current_screen()); 310 311 focus_manager = controller()->contents()->GetFocusManager(); 312 EXPECT_CALL(*mock_eula_screen_, Show()).Times(1); 313 EXPECT_TRUE(focus_manager->ProcessAccelerator(accel_eula_screen)); 314 EXPECT_EQ(controller()->GetEulaScreen(), controller()->current_screen()); 315 } 316 317 COMPILE_ASSERT(chromeos::ScreenObserver::EXIT_CODES_COUNT == 17, 318 add_tests_for_new_control_flow_you_just_introduced); 319