• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
MockOutShowHide(P p)31   template <class P> MockOutShowHide(P p) : T(p) {}
MockOutShowHide(P1 p1,P2 p2)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>*
Create(WizardController * wizard)43 CreateMockWizardScreenHelper<T>::Create(WizardController* wizard) {
44   return new MockOutShowHide<T>(wizard);
45 }
46 
47 template <> MockOutShowHide<chromeos::NetworkScreen>*
Create(WizardController * wizard)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:
WizardControllerTest()65   WizardControllerTest() : chromeos::WizardInProcessBrowserTest(
66       WizardController::kTestNoScreenName) {}
~WizardControllerTest()67   virtual ~WizardControllerTest() {}
68 
69  private:
70   DISALLOW_COPY_AND_ASSIGN(WizardControllerTest);
71 };
72 
IN_PROC_BROWSER_TEST_F(WizardControllerTest,SwitchLanguage)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:
WizardControllerFlowTest()108   WizardControllerFlowTest() {}
109   // Overriden from InProcessBrowserTest:
CreateBrowser(Profile * profile)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 
OnExit(chromeos::ScreenObserver::ExitCodes exit_code)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 
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,ControlFlowMain)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 
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,ControlFlowErrorUpdate)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 
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,ControlFlowEulaDeclined)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 
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,ControlFlowErrorNetwork)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 
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,ControlFlowEnterpriseEnrollmentCompleted)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 
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,ControlFlowEnterpriseEnrollmentCancelled)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 
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,MAYBE_Accelerators)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