OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
3 # Use of this source code is governed by a BSD-style license that can be | |
4 # found in the LICENSE file. | |
5 | |
6 import os | |
7 import subprocess | |
8 import sys | |
9 | |
10 import pyauto_functional # Must be imported before pyauto | |
11 import pyauto | |
12 import pyauto_errors | |
13 import test_utils | |
14 | |
15 | |
16 sys.path.append('/usr/local') # To make autotest libs importable. | |
17 from autotest.cros import cros_ui | |
18 from autotest.cros import cryptohome | |
19 | |
20 | |
21 class ChromeosLogin(pyauto.PyUITest): | |
22 """TestCases for Logging into ChromeOS.""" | |
23 | |
24 assert os.geteuid() == 0, 'Need to run this test as root' | |
25 | |
26 def ShouldAutoLogin(self): | |
27 return False | |
28 | |
29 def setUp(self): | |
30 # We want a clean session_manager instance for every run, | |
31 # so restart ui now. | |
32 cros_ui.stop(allow_fail=True) | |
33 cryptohome.remove_all_vaults() | |
34 cros_ui.start(wait_for_login_prompt=False) | |
35 pyauto.PyUITest.setUp(self) | |
36 | |
37 def _ValidCredentials(self, account_type='test_google_account'): | |
38 """Obtains a valid username and password from a data file. | |
39 | |
40 Returns: | |
41 A dictionary with the keys 'username' and 'password' | |
42 """ | |
43 return self.GetPrivateInfo()[account_type] | |
44 | |
45 def testExecuteJavascriptInOOBEWebUI(self): | |
46 """Test that javascript can be executed at the login page.""" | |
47 msg = 'test success' | |
48 ret = self.ExecuteJavascriptInOOBEWebUI( | |
49 'window.domAutomationController.send("%s");' % msg) | |
50 self.assertEqual(ret, msg) | |
51 | |
52 def testGoodLogin(self): | |
53 """Test that login is successful with valid credentials.""" | |
54 credentials = self._ValidCredentials() | |
55 self.Login(credentials['username'], credentials['password']) | |
56 login_info = self.GetLoginInfo() | |
57 self.assertTrue(login_info['is_logged_in'], msg='Login failed.') | |
58 | |
59 def testBadUsername(self): | |
60 """Test that login fails when passed an invalid username.""" | |
61 self.assertRaises( | |
62 pyauto_errors.JSONInterfaceError, | |
63 lambda: self.Login('doesnotexist@fakedomain.org', 'badpassword')) | |
64 login_info = self.GetLoginInfo() | |
65 self.assertFalse(login_info['is_logged_in'], | |
66 msg='Login succeeded, with bad credentials.') | |
67 | |
68 def testBadPassword(self): | |
69 """Test that login fails when passed an invalid password.""" | |
70 credentials = self._ValidCredentials() | |
71 self.assertRaises( | |
72 pyauto_errors.JSONInterfaceError, | |
73 lambda: self.Login(credentials['username'], 'badpassword')) | |
74 login_info = self.GetLoginInfo() | |
75 self.assertFalse(login_info['is_logged_in'], | |
76 msg='Login succeeded, with bad credentials.') | |
77 | |
78 def testLoginAsGuest(self): | |
79 """Test we can login with guest mode.""" | |
80 self.LoginAsGuest() | |
81 login_info = self.GetLoginInfo() | |
82 self.assertTrue(login_info['is_logged_in'], msg='Not logged in at all.') | |
83 self.assertTrue(login_info['is_guest'], msg='Not logged in as guest.') | |
84 | |
85 def testLockScreenAfterLogin(self): | |
86 """Test after logging in that the screen can be locked.""" | |
87 self.testGoodLogin() | |
88 self.assertFalse(self.GetLoginInfo()['is_screen_locked'], | |
89 msg='Screen is locked, but the screen was not locked.') | |
90 self.LockScreen() | |
91 login_info = self.GetLoginInfo() | |
92 self.assertTrue(login_info['is_screen_locked'], msg='The screen is not ' | |
93 'locked after attempting to lock the screen.') | |
94 | |
95 def testLockAndUnlockScreenAfterLogin(self): | |
96 """Test locking and unlocking the screen after logging in.""" | |
97 self.testLockScreenAfterLogin() | |
98 self.UnlockScreen(self._ValidCredentials()['password']) | |
99 login_info = self.GetLoginInfo() | |
100 self.assertFalse(login_info['is_screen_locked'], | |
101 msg='Screen is locked, but it should have been unlocked.') | |
102 | |
103 def testLockAndUnlockScreenAfterLoginWithBadPassword(self): | |
104 """Test locking and unlocking the screen with the wrong password.""" | |
105 self.testLockScreenAfterLogin() | |
106 self.UnlockScreen('not_the_right_password') | |
107 login_info = self.GetLoginInfo() | |
108 self.assertTrue(login_info['is_screen_locked'], | |
109 msg='Screen is unlock, but it should have been unlocked ' | |
110 'since we attempted to unlock with a bad password') | |
111 | |
112 def testLoginToCreateNewAccount(self): | |
113 """Test we can login as a guest and create a new account.""" | |
114 self.ShowCreateAccountUI() | |
115 # The login hook does not wait for the first tab to load, so we wait here. | |
116 self.assertTrue( | |
117 self.WaitUntil(self.GetActiveTabTitle, expect_retval='Google Accounts'), | |
118 msg='Could not verify that the Accounts tab was opened.') | |
119 login_info = self.GetLoginInfo() | |
120 self.assertTrue(login_info['is_guest'], msg='Not logged in as guest.') | |
121 | |
122 def testGoodLoginForTransitionedDomainAccount(self): | |
123 """Test that login is successful with valid credentials for a domain. | |
124 | |
125 ChromeOS only allows GA+ accounts to login, there are also known as | |
126 transitioned accounts. | |
127 | |
128 """ | |
129 credentials = self._ValidCredentials(account_type='test_domain_account') | |
130 self.Login(credentials['username'], credentials['password']) | |
131 login_info = self.GetLoginInfo() | |
132 self.assertTrue(login_info['is_logged_in'], msg='Login failed.') | |
133 | |
134 def testNavigateAfterLogin(self): | |
135 """Test that page navigation is successful after logging in.""" | |
136 self.testGoodLogin() | |
137 self.NavigateToURL("http://www.google.com") | |
138 self.assertEqual(self.GetActiveTabTitle(), 'Google', | |
139 msg='Unable to navigate to Google and verify tab title.') | |
140 | |
141 def testSigningOutFromLockedScreen(self): | |
142 """Test logout can be performed from the lock screen.""" | |
143 self.testLockScreenAfterLogin() | |
144 self.SignoutInScreenLocker() | |
145 self.assertFalse(self.GetLoginInfo()['is_logged_in'], | |
146 msg='Still logged in when we should be logged out.') | |
147 | |
148 def testLoginSequenceSanity(self): | |
149 """Test that the interface can maintain a connection after multiple logins. | |
150 | |
151 This test is to verify the stability of the automation interface. | |
152 | |
153 """ | |
154 self.testGoodLogin() | |
155 self.Logout() | |
156 self.testBadPassword() | |
157 self.testLoginAsGuest() | |
158 self.Logout() | |
159 self.testLoginToCreateNewAccount() | |
160 | |
161 def testLogoutWithNoWindows(self): | |
162 """Verify logout when no browser windows are present.""" | |
163 self.testGoodLogin() | |
164 for i in range(5): | |
165 self.OpenNewBrowserWindow(True) | |
166 for _ in range(self.GetBrowserWindowCount()): | |
167 self.CloseBrowserWindow(0) | |
168 self.assertEqual(0, self.GetBrowserWindowCount(), | |
169 msg='Could not close all browser windows') | |
170 self.Logout() | |
171 self.testGoodLogin() | |
172 | |
173 def testInitialLoginState(self): | |
174 """Verify basic state of browser windows at initial login.""" | |
175 self.testGoodLogin() | |
176 # Should have 1 browser window with 1 tab. | |
177 info = self.GetBrowserInfo() | |
178 self.assertEqual(1, len(info['windows'])) | |
179 self.assertFalse(info['windows'][0]['incognito'], | |
180 msg='Did not expect incognito window after login') | |
181 self.assertEqual(1, len(info['windows'][0]['tabs'])) | |
182 | |
183 self.OpenNewBrowserWindow(True) | |
184 # Should have 2 regular browser windows. | |
185 info = self.GetBrowserInfo() | |
186 self.assertEqual(2, len(info['windows'])) | |
187 self.assertFalse(info['windows'][0]['incognito']) | |
188 self.assertFalse(info['windows'][1]['incognito'], | |
189 msg='Expected a regular new window.') | |
190 | |
191 def testProfilePreservedBetweenLogins(self): | |
192 """Verify that profile is preserved between two login sessions. | |
193 | |
194 Also verify Local State. | |
195 """ | |
196 self.testGoodLogin() | |
197 | |
198 # Build up some history and setup state in "Local State". | |
199 url = self.GetHttpURLForDataPath('title2.html') | |
200 self.NavigateToURL(url) | |
201 # chromeos often takes a while to register URLs into history. | |
202 self.assertTrue(self.WaitUntil(lambda: self.GetHistoryInfo().History()), | |
203 msg='Could not open %s successfully' % url) | |
204 open('/home/chronos/__magic__', 'w').close() | |
205 open('/home/chronos/user/__magic__', 'w').close() | |
206 | |
207 def _VerifyProfile(): | |
208 history = self.GetHistoryInfo().History() | |
209 self.assertEqual(1, len(history)) | |
210 self.assertEqual(url, history[0]['url']) | |
211 self.assertTrue(os.path.exists('/home/chronos/__magic__'), | |
212 msg='/home/chronos/__magic__ did not persist across login sessions') | |
213 self.assertTrue(os.path.exists('/home/chronos/user/__magic__'), | |
214 msg='/home/chronos/user/__magic__ did not persist across ' | |
215 'login sessions') | |
216 | |
217 _VerifyProfile() | |
218 self.Logout() | |
219 self.testGoodLogin() # Re-login with same account. | |
220 _VerifyProfile() | |
221 | |
222 def testGuestCrosh(self): | |
223 """Verify we can use crosh in guest mode.""" | |
224 self.LoginAsGuest() | |
225 login_info = self.GetLoginInfo() | |
226 self.assertTrue(login_info['is_logged_in'], msg='Not logged in at all.') | |
227 self.assertTrue(login_info['is_guest'], msg='Not logged in as guest.') | |
228 for _ in range(self.GetBrowserWindowCount()): | |
229 self.CloseBrowserWindow(0) | |
230 test_utils.OpenCroshVerification(self) | |
231 | |
232 # Verify crosh prompt. | |
233 self.WaitForHtermText(text='crosh> ', | |
234 msg='Could not find "crosh> " prompt') | |
235 self.assertTrue( | |
236 self.GetHtermRowsText(start=0, end=2).endswith('crosh> '), | |
237 msg='Could not find "crosh> " prompt') | |
238 | |
239 # Run a crosh command. | |
240 self.SendKeysToHterm('help\\n') | |
241 self.WaitForHtermText(text='help_advanced', | |
242 msg='Could not find "help_advanced" in help output.') | |
243 | |
244 # Exit crosh and close tab. | |
245 self.SendKeysToHterm('exit\\n') | |
246 self.WaitForHtermText(text='command crosh completed with exit code 0', | |
247 msg='Could not exit crosh.') | |
248 | |
249 def testCroshPreservedBetweenLogins(self): | |
250 """Verify user can continue after re-login.""" | |
251 self.testGoodLogin() | |
252 self.CloseBrowserWindow(0) | |
253 test_utils.OpenCroshVerification(self) | |
254 | |
255 # Verify crosh prompt. | |
256 self.WaitForHtermText(text='crosh> ', | |
257 msg='Could not find "crosh> " prompt') | |
258 self.assertTrue( | |
259 self.GetHtermRowsText(start=0, end=2).endswith('crosh> '), | |
260 msg='Could not find "crosh> " prompt') | |
261 | |
262 # Open 2 other tabs. | |
263 self.AppendTab(self.GetHttpURLForDataPath('title2.html')) | |
264 self.assertEqual('Title Of Awesomeness', self.GetActiveTabTitle(), | |
265 msg='Unable to naviage to title2.html and ' | |
266 'verify tab title.') | |
267 self.AppendTab(self.GetHttpURLForDataPath('settings', 'image_page.html')) | |
268 self.assertEqual('Show an image', self.GetActiveTabTitle(), | |
269 msg='Unable to navigate to image_page and ' | |
270 'verify tab title.') | |
271 self.Logout() | |
272 self.testGoodLogin() # Re-Login with same account. | |
273 | |
274 # Verify 3 tabs are still open after re-login. | |
275 self.assertEqual(3, len(self.GetBrowserInfo()['windows'][0]['tabs'])) | |
276 | |
277 | |
278 class ChromeosLoginCachedCredentialsAddUser(pyauto.PyUITest): | |
279 """TestCase for failing to add a user with invalid proxy settings.""" | |
280 assert os.geteuid() == 0, 'Need to run this test as root' | |
281 | |
282 def ShouldAutoLogin(self): | |
283 return False | |
284 | |
285 def setUp(self): | |
286 # We want a clean session_manager instance for every run, | |
287 # so restart ui now. | |
288 cros_ui.stop(allow_fail=True) | |
289 cryptohome.remove_all_vaults() | |
290 cros_ui.start(wait_for_login_prompt=False) | |
291 pyauto.PyUITest.setUp(self) | |
292 | |
293 def tearDown(self): | |
294 self.ResetProxySettingsOnChromeOS() | |
295 pyauto.PyUITest.tearDown(self) | |
296 | |
297 def _ValidCredentials(self, account_type='test_google_account'): | |
298 """Obtains a valid username and password from a data file. | |
299 | |
300 Returns: | |
301 A dictionary with the keys 'username' and 'password' | |
302 """ | |
303 return self.GetPrivateInfo()[account_type] | |
304 | |
305 def testCachedCredentialsAddUser(self): | |
306 self.SetSharedProxies(True) | |
307 proxy_config = { | |
308 'mode': 'fixed_servers', | |
309 'server': '127.0.0.1' | |
310 } | |
311 self.SetProxySettingOnChromeOS(proxy_config); | |
312 | |
313 """Test that login fails.""" | |
314 credentials = self._ValidCredentials() | |
315 self.assertRaises( | |
316 pyauto_errors.JSONInterfaceError, | |
317 lambda: self.Login(credentials['username'], | |
318 credentials['password']) | |
319 ) | |
320 | |
321 class ChromeosLoginCachedCredentialsUserPod(ChromeosLogin): | |
322 """TestCase for Logging into ChromeOS with cached credentials and | |
323 invalid proxy settings. | |
324 """ | |
325 assert os.geteuid() == 0, 'Need to run this test as root' | |
326 | |
327 def ShouldAutoLogin(self): | |
328 return False | |
329 | |
330 def setUp(self): | |
331 # We want a clean session_manager instance for every run, | |
332 # so restart ui now. | |
333 cros_ui.stop(allow_fail=True) | |
334 cryptohome.remove_all_vaults() | |
335 cros_ui.start(wait_for_login_prompt=False) | |
336 pyauto.PyUITest.setUp(self) | |
337 | |
338 def tearDown(self): | |
339 self.ResetProxySettingsOnChromeOS() | |
340 pyauto.PyUITest.tearDown(self) | |
341 | |
342 def _ValidCredentials(self, account_type='test_google_account'): | |
343 """Obtains a valid username and password from a data file. | |
344 | |
345 Returns: | |
346 A dictionary with the keys 'username' and 'password' | |
347 """ | |
348 return self.GetPrivateInfo()[account_type] | |
349 | |
350 def testCachedCredentialsUserPod(self): | |
351 """Test that we can login without connectivity if we have so before. | |
352 | |
353 This test is currently disabled because testGoodLogin tries to | |
354 add a user after setting proxies, which is supposed to fail. To | |
355 make it pass we need a hook that simply calls Login on the delegate | |
356 in webui_login_display.cc ::ShowSigninScreenForCreds. | |
357 """ | |
358 self.testGoodLogin() | |
359 self.Logout() | |
360 self.SetSharedProxies(True) | |
361 proxy_config = { | |
362 'mode': 'fixed_servers', | |
363 'server': '127.0.0.1' | |
364 } | |
365 self.SetProxySettingOnChromeOS(proxy_config); | |
366 self.testGoodLogin() | |
367 self.ResetProxySettingsOnChromeOS() | |
368 | |
369 | |
370 if __name__ == '__main__': | |
371 pyauto_functional.Main() | |
OLD | NEW |