Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import errno, logging, os, re, signal, subprocess, time | 5 import errno, logging, os, re, signal, subprocess, time |
| 6 import common | 6 import common |
| 7 import constants as chromeos_constants, cryptohome, ui | 7 import constants as chromeos_constants, cryptohome, log_reader, ui |
| 8 from autotest_lib.client.bin import test, utils, site_log_reader | 8 from autotest_lib.client.bin import utils |
| 9 from autotest_lib.client.common_lib import error | 9 from autotest_lib.client.common_lib import error |
| 10 | 10 |
| 11 | 11 |
| 12 _DEFAULT_TIMEOUT = 30 | 12 _DEFAULT_TIMEOUT = 30 |
| 13 | 13 |
| 14 | 14 |
| 15 class TimeoutError(error.TestError): | 15 class TimeoutError(error.TestError): |
| 16 """Error raised when we time out while waiting on a condition.""" | 16 """Error raised when we time out while waiting on a condition.""" |
| 17 pass | 17 pass |
| 18 | 18 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 83 | 83 |
| 84 return False | 84 return False |
| 85 | 85 |
| 86 | 86 |
| 87 def logged_in(): | 87 def logged_in(): |
| 88 # this file is created when the session_manager emits start-user-session | 88 # this file is created when the session_manager emits start-user-session |
| 89 # and removed when the session_manager emits stop-user-session | 89 # and removed when the session_manager emits stop-user-session |
| 90 return os.path.exists(chromeos_constants.LOGGED_IN_MAGIC_FILE) | 90 return os.path.exists(chromeos_constants.LOGGED_IN_MAGIC_FILE) |
| 91 | 91 |
| 92 | 92 |
| 93 def process_crashed(process, log_reader): | 93 def process_crashed(process, logreader): |
|
kmixter1
2010/12/16 03:12:57
suggest renaming class and using the standard _ se
ericli
2010/12/17 21:48:39
With the new naming, now it makes more sense.
Done
| |
| 94 """Checks the log watched by |log_reader| to see if a crash was reported | 94 """Checks the log watched by |logreader| to see if a crash was reported |
| 95 for |process|. | 95 for |process|. |
| 96 | 96 |
| 97 Returns True if so, False if not. | 97 Returns True if so, False if not. |
| 98 """ | 98 """ |
| 99 return log_reader.can_find('Received crash notification for %s' % process) | 99 return logreader.can_find('Received crash notification for %s' % process) |
| 100 | 100 |
| 101 | 101 |
| 102 def wait_for_condition(condition, timeout_msg, timeout, process, log_reader, | 102 def wait_for_condition(condition, timeout_msg, timeout, process, logreader, |
| 103 crash_msg): | 103 crash_msg): |
| 104 try: | 104 try: |
| 105 utils.poll_for_condition( | 105 utils.poll_for_condition( |
| 106 condition, | 106 condition, |
| 107 TimeoutError(timeout_msg), | 107 TimeoutError(timeout_msg), |
| 108 timeout=timeout) | 108 timeout=timeout) |
| 109 except TimeoutError, e: | 109 except TimeoutError, e: |
| 110 # We could fail faster if necessary, but it'd be more complicated. | 110 # We could fail faster if necessary, but it'd be more complicated. |
| 111 if process_crashed(process, log_reader): | 111 if process_crashed(process, logreader): |
| 112 raise CrashError(crash_msg) | 112 raise CrashError(crash_msg) |
| 113 else: | 113 else: |
| 114 raise e | 114 raise e |
| 115 | 115 |
| 116 | 116 |
| 117 def attempt_login(username, password, timeout=_DEFAULT_TIMEOUT): | 117 def attempt_login(username, password, timeout=_DEFAULT_TIMEOUT): |
| 118 """Attempt to log in. | 118 """Attempt to log in. |
| 119 | 119 |
| 120 Args: | 120 Args: |
| 121 username: str username for login | 121 username: str username for login |
| 122 password: str password for login | 122 password: str password for login |
| 123 timeout: float number of seconds to wait | 123 timeout: float number of seconds to wait |
| 124 | 124 |
| 125 Raises: | 125 Raises: |
| 126 TimeoutError: login didn't complete before timeout | 126 TimeoutError: login didn't complete before timeout |
| 127 UnexpectedCondition: login manager is not running, or user is already | 127 UnexpectedCondition: login manager is not running, or user is already |
| 128 logged in. | 128 logged in. |
| 129 """ | 129 """ |
| 130 logging.info("Attempting to login using autox.py and (%s, %s)" % | 130 logging.info("Attempting to login using autox.py and (%s, %s)" % |
| 131 (username, password)) | 131 (username, password)) |
| 132 | 132 |
| 133 if not __get_session_manager_pid(): | 133 if not __get_session_manager_pid(): |
| 134 raise UnexpectedCondition("Session manager is not running") | 134 raise UnexpectedCondition("Session manager is not running") |
| 135 | 135 |
| 136 if logged_in(): | 136 if logged_in(): |
| 137 raise UnexpectedCondition("Already logged in") | 137 raise UnexpectedCondition("Already logged in") |
| 138 | 138 |
| 139 # Mark /var/log/messages now; we'll run through all subsequent log messages | 139 # Mark /var/log/messages now; we'll run through all subsequent log messages |
| 140 # if we couldn't log in to see if the browser crashed. | 140 # if we couldn't log in to see if the browser crashed. |
| 141 log_reader = site_log_reader.LogReader() | 141 my_log_reader = log_reader.LogReader() |
| 142 log_reader.set_start_by_current() | 142 my_log_reader.set_start_by_current() |
| 143 | 143 |
| 144 ax = ui.get_autox() | 144 ax = ui.get_autox() |
| 145 # navigate to login screen | 145 # navigate to login screen |
| 146 ax.send_hotkey("Ctrl+Alt+L") | 146 ax.send_hotkey("Ctrl+Alt+L") |
| 147 # escape out of any login screen menus (e.g., the network selection menu) | 147 # escape out of any login screen menus (e.g., the network selection menu) |
| 148 ax.send_hotkey("Escape") | 148 ax.send_hotkey("Escape") |
| 149 time.sleep(0.5) | 149 time.sleep(0.5) |
| 150 if (username): | 150 if (username): |
| 151 # focus username | 151 # focus username |
| 152 ax.send_hotkey("Alt+U") | 152 ax.send_hotkey("Alt+U") |
| 153 ax.send_text(username) | 153 ax.send_text(username) |
| 154 # TODO(rginda): remove Tab after http://codereview.chromium.org/1390003 | 154 # TODO(rginda): remove Tab after http://codereview.chromium.org/1390003 |
| 155 ax.send_hotkey("Tab") | 155 ax.send_hotkey("Tab") |
| 156 # focus password | 156 # focus password |
| 157 ax.send_hotkey("Alt+P") | 157 ax.send_hotkey("Alt+P") |
| 158 ax.send_text(password) | 158 ax.send_text(password) |
| 159 ax.send_hotkey("Return") | 159 ax.send_hotkey("Return") |
| 160 else: | 160 else: |
| 161 ax.send_hotkey("Alt+B") # Browse without signing-in | 161 ax.send_hotkey("Alt+B") # Browse without signing-in |
| 162 | 162 |
| 163 wait_for_condition(condition=logged_in, | 163 wait_for_condition(condition=logged_in, |
| 164 timeout_msg='Timed out waiting for login', | 164 timeout_msg='Timed out waiting for login', |
| 165 timeout=timeout, | 165 timeout=timeout, |
| 166 process='chrome', | 166 process='chrome', |
| 167 log_reader=log_reader, | 167 logreader=my_log_reader, |
| 168 crash_msg='Chrome crashed during login') | 168 crash_msg='Chrome crashed during login') |
| 169 | 169 |
| 170 | 170 |
| 171 def attempt_logout(timeout=_DEFAULT_TIMEOUT): | 171 def attempt_logout(timeout=_DEFAULT_TIMEOUT): |
| 172 """Attempt to log out by killing Chrome. | 172 """Attempt to log out by killing Chrome. |
| 173 | 173 |
| 174 Args: | 174 Args: |
| 175 timeout: float number of seconds to wait | 175 timeout: float number of seconds to wait |
| 176 | 176 |
| 177 Raises: | 177 Raises: |
| 178 TimeoutError: logout didn't complete before timeout | 178 TimeoutError: logout didn't complete before timeout |
| 179 UnexpectedCondition: user is not logged in | 179 UnexpectedCondition: user is not logged in |
| 180 """ | 180 """ |
| 181 if not logged_in(): | 181 if not logged_in(): |
| 182 raise UnexpectedCondition('Already logged out') | 182 raise UnexpectedCondition('Already logged out') |
| 183 | 183 |
| 184 oldpid = __get_session_manager_pid() | 184 oldpid = __get_session_manager_pid() |
| 185 | 185 |
| 186 # Mark /var/log/messages now; we'll run through all subsequent log messages | 186 # Mark /var/log/messages now; we'll run through all subsequent log messages |
| 187 # if we couldn't TERM and restart the session manager. | 187 # if we couldn't TERM and restart the session manager. |
| 188 log_reader = site_log_reader.LogReader() | 188 my_log_reader = log_reader.LogReader() |
| 189 log_reader.set_start_by_current() | 189 my_log_reader.set_start_by_current() |
| 190 | 190 |
| 191 # Gracefully exiting the session manager causes the user's session to end. | 191 # Gracefully exiting the session manager causes the user's session to end. |
| 192 utils.system('pkill -TERM -o ^%s$' % chromeos_constants.SESSION_MANAGER) | 192 utils.system('pkill -TERM -o ^%s$' % chromeos_constants.SESSION_MANAGER) |
| 193 | 193 |
| 194 wait_for_condition( | 194 wait_for_condition( |
| 195 condition=lambda: __session_manager_restarted(oldpid), | 195 condition=lambda: __session_manager_restarted(oldpid), |
| 196 timeout_msg='Timed out waiting for logout', | 196 timeout_msg='Timed out waiting for logout', |
| 197 timeout=timeout, | 197 timeout=timeout, |
| 198 process='session_manager', | 198 process='session_manager', |
| 199 log_reader=log_reader, | 199 logreader=my_log_reader, |
| 200 crash_msg='session_manager crashed while shutting down.') | 200 crash_msg='session_manager crashed while shutting down.') |
| 201 | 201 |
| 202 | 202 |
| 203 def wait_for_browser(timeout=_DEFAULT_TIMEOUT): | 203 def wait_for_browser(timeout=_DEFAULT_TIMEOUT): |
| 204 """Wait until a Chrome process is running. | 204 """Wait until a Chrome process is running. |
| 205 | 205 |
| 206 Args: | 206 Args: |
| 207 timeout: float number of seconds to wait | 207 timeout: float number of seconds to wait |
| 208 | 208 |
| 209 Raises: | 209 Raises: |
| 210 TimeoutError: Chrome didn't start before timeout | 210 TimeoutError: Chrome didn't start before timeout |
| 211 """ | 211 """ |
| 212 # Mark /var/log/messages now; we'll run through all subsequent log messages | 212 # Mark /var/log/messages now; we'll run through all subsequent log messages |
| 213 # if we couldn't start chrome to see if the browser crashed. | 213 # if we couldn't start chrome to see if the browser crashed. |
| 214 log_reader = site_log_reader.LogReader() | 214 my_log_reader = log_reader.LogReader() |
| 215 log_reader.set_start_by_current() | 215 my_log_reader.set_start_by_current() |
| 216 wait_for_condition( | 216 wait_for_condition( |
| 217 lambda: os.system('pgrep ^%s$' % chromeos_constants.BROWSER) == 0, | 217 lambda: os.system('pgrep ^%s$' % chromeos_constants.BROWSER) == 0, |
| 218 timeout_msg='Timed out waiting for Chrome to start', | 218 timeout_msg='Timed out waiting for Chrome to start', |
| 219 timeout=timeout, | 219 timeout=timeout, |
| 220 process='chrome', | 220 process='chrome', |
| 221 log_reader=log_reader, | 221 logreader=my_log_reader, |
| 222 crash_msg='Chrome crashed while starting up.') | 222 crash_msg='Chrome crashed while starting up.') |
| 223 | 223 |
| 224 | 224 |
| 225 def wait_for_cryptohome(timeout=_DEFAULT_TIMEOUT): | 225 def wait_for_cryptohome(timeout=_DEFAULT_TIMEOUT): |
| 226 """Wait until cryptohome is mounted. | 226 """Wait until cryptohome is mounted. |
| 227 | 227 |
| 228 Args: | 228 Args: |
| 229 timeout: float number of seconds to wait | 229 timeout: float number of seconds to wait |
| 230 | 230 |
| 231 Raises: | 231 Raises: |
| 232 TimeoutError: cryptohome wasn't mounted before timeout | 232 TimeoutError: cryptohome wasn't mounted before timeout |
| 233 """ | 233 """ |
| 234 # Mark /var/log/messages now; we'll run through all subsequent log messages | 234 # Mark /var/log/messages now; we'll run through all subsequent log messages |
| 235 # if we couldn't get the browser up to see if the browser crashed. | 235 # if we couldn't get the browser up to see if the browser crashed. |
| 236 log_reader = site_log_reader.LogReader() | 236 my_log_reader = log_reader.LogReader() |
| 237 log_reader.set_start_by_current() | 237 my_log_reader.set_start_by_current() |
| 238 wait_for_condition( | 238 wait_for_condition( |
| 239 condition=lambda: cryptohome.is_mounted(), | 239 condition=lambda: cryptohome.is_mounted(), |
| 240 timeout_msg='Timed out waiting for cryptohome to be mounted', | 240 timeout_msg='Timed out waiting for cryptohome to be mounted', |
| 241 timeout=timeout, | 241 timeout=timeout, |
| 242 process='cryptohomed', | 242 process='cryptohomed', |
| 243 log_reader=log_reader, | 243 logreader=my_log_reader, |
| 244 crash_msg='cryptohomed crashed during mount attempt') | 244 crash_msg='cryptohomed crashed during mount attempt') |
| 245 | 245 |
| 246 | 246 |
| 247 def wait_for_login_prompt(timeout=_DEFAULT_TIMEOUT): | 247 def wait_for_login_prompt(timeout=_DEFAULT_TIMEOUT): |
| 248 """Wait the login prompt is on screen and ready | 248 """Wait the login prompt is on screen and ready |
| 249 | 249 |
| 250 Args: | 250 Args: |
| 251 timeout: float number of seconds to wait | 251 timeout: float number of seconds to wait |
| 252 | 252 |
| 253 Raises: | 253 Raises: |
| 254 TimeoutError: Login prompt didn't get up before timeout | 254 TimeoutError: Login prompt didn't get up before timeout |
| 255 """ | 255 """ |
| 256 # Mark /var/log/messages now; we'll run through all subsequent log messages | 256 # Mark /var/log/messages now; we'll run through all subsequent log messages |
| 257 # if we couldn't get the browser up to see if the browser crashed. | 257 # if we couldn't get the browser up to see if the browser crashed. |
| 258 log_reader = site_log_reader.LogReader() | 258 my_log_reader = log_reader.LogReader() |
| 259 log_reader.set_start_by_current() | 259 my_log_reader.set_start_by_current() |
| 260 wait_for_condition( | 260 wait_for_condition( |
| 261 condition=lambda: os.access( | 261 condition=lambda: os.access( |
| 262 chromeos_constants.LOGIN_PROMPT_READY_MAGIC_FILE, os.F_OK), | 262 chromeos_constants.LOGIN_PROMPT_READY_MAGIC_FILE, os.F_OK), |
| 263 timeout_msg='Timed out waiting for login prompt', | 263 timeout_msg='Timed out waiting for login prompt', |
| 264 timeout=timeout, | 264 timeout=timeout, |
| 265 process='chrome', | 265 process='chrome', |
| 266 log_reader=log_reader, | 266 logreader=my_log_reader, |
| 267 crash_msg='Chrome crashed before the login prompt.') | 267 crash_msg='Chrome crashed before the login prompt.') |
| 268 | 268 |
| 269 | 269 |
| 270 def wait_for_window_manager(timeout=_DEFAULT_TIMEOUT): | 270 def wait_for_window_manager(timeout=_DEFAULT_TIMEOUT): |
| 271 """Wait until the window manager is running. | 271 """Wait until the window manager is running. |
| 272 | 272 |
| 273 Args: | 273 Args: |
| 274 timeout: float number of seconds to wait | 274 timeout: float number of seconds to wait |
| 275 | 275 |
| 276 Raises: | 276 Raises: |
| 277 TimeoutError: window manager didn't start before timeout | 277 TimeoutError: window manager didn't start before timeout |
| 278 """ | 278 """ |
| 279 utils.poll_for_condition( | 279 utils.poll_for_condition( |
| 280 lambda: not os.system('pgrep ^%s$' % chromeos_constants.WINDOW_MANAGER), | 280 lambda: not os.system('pgrep ^%s$' % chromeos_constants.WINDOW_MANAGER), |
| 281 TimeoutError('Timed out waiting for window manager to start'), | 281 TimeoutError('Timed out waiting for window manager to start'), |
| 282 timeout=timeout) | 282 timeout=timeout) |
| 283 | 283 |
| 284 | 284 |
| 285 def wait_for_initial_chrome_window(timeout=_DEFAULT_TIMEOUT): | 285 def wait_for_initial_chrome_window(timeout=_DEFAULT_TIMEOUT): |
| 286 """Wait until the initial Chrome window is mapped. | 286 """Wait until the initial Chrome window is mapped. |
| 287 | 287 |
| 288 Args: | 288 Args: |
| 289 timeout: float number of seconds to wait | 289 timeout: float number of seconds to wait |
| 290 | 290 |
| 291 Raises: | 291 Raises: |
| 292 TimeoutError: Chrome window wasn't mapped before timeout | 292 TimeoutError: Chrome window wasn't mapped before timeout |
| 293 """ | 293 """ |
| 294 # Mark /var/log/messages now; we'll run through all subsequent log messages | 294 # Mark /var/log/messages now; we'll run through all subsequent log messages |
| 295 # if we couldn't get the browser up to see if the browser crashed. | 295 # if we couldn't get the browser up to see if the browser crashed. |
| 296 log_reader = site_log_reader.LogReader() | 296 my_log_reader = log_reader.LogReader() |
| 297 log_reader.set_start_by_current() | 297 my_log_reader.set_start_by_current() |
| 298 wait_for_condition( | 298 wait_for_condition( |
| 299 lambda: os.access( | 299 lambda: os.access( |
| 300 chromeos_constants.CHROME_WINDOW_MAPPED_MAGIC_FILE, os.F_OK), | 300 chromeos_constants.CHROME_WINDOW_MAPPED_MAGIC_FILE, os.F_OK), |
| 301 'Timed out waiting for initial Chrome window', | 301 'Timed out waiting for initial Chrome window', |
| 302 timeout=timeout, | 302 timeout=timeout, |
| 303 process='chrome', | 303 process='chrome', |
| 304 log_reader=log_reader, | 304 logreader=my_log_reader, |
| 305 crash_msg='Chrome crashed before first tab rendered.') | 305 crash_msg='Chrome crashed before first tab rendered.') |
| 306 | 306 |
| 307 | 307 |
| 308 def nuke_login_manager(): | 308 def nuke_login_manager(): |
| 309 nuke_process_by_name('session_manager') | 309 nuke_process_by_name('session_manager') |
| 310 wait_for_browser() | 310 wait_for_browser() |
| 311 | 311 |
| 312 | 312 |
| 313 def nuke_process_by_name(name, with_prejudice=False): | 313 def nuke_process_by_name(name, with_prejudice=False): |
| 314 pid = int(utils.system_output('pgrep -o ^%s$' % name).split()[0]) | 314 pid = int(utils.system_output('pgrep -o ^%s$' % name).split()[0]) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 367 except (IOError, OSError) as error: | 367 except (IOError, OSError) as error: |
| 368 logging.error(error) | 368 logging.error(error) |
| 369 | 369 |
| 370 # Restart the UI. | 370 # Restart the UI. |
| 371 nuke_login_manager() | 371 nuke_login_manager() |
| 372 utils.poll_for_condition( | 372 utils.poll_for_condition( |
| 373 lambda: __session_manager_restarted(oldpid), | 373 lambda: __session_manager_restarted(oldpid), |
| 374 TimeoutError('Timed out waiting for logout'), | 374 TimeoutError('Timed out waiting for logout'), |
| 375 timeout) | 375 timeout) |
| 376 wait_for_login_prompt() | 376 wait_for_login_prompt() |
| OLD | NEW |