| 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 logging, os, re | 5 import logging, os, re |
| 6 from autotest_lib.client.bin import site_log_reader, site_utils, test | 6 from autotest_lib.client.bin import site_log_reader, site_utils, test |
| 7 from autotest_lib.client.common_lib import error, utils | 7 from autotest_lib.client.common_lib import error, utils |
| 8 | 8 |
| 9 | 9 |
| 10 class CrashTest(test.test): | 10 class CrashTest(test.test): |
| 11 | 11 |
| 12 _CONSENT_FILE = '/home/chronos/Consent To Send Stats' | 12 _CONSENT_FILE = '/home/chronos/Consent To Send Stats' |
| 13 _CORE_PATTERN = '/proc/sys/kernel/core_pattern' |
| 13 _CRASH_REPORTER_PATH = '/sbin/crash_reporter' | 14 _CRASH_REPORTER_PATH = '/sbin/crash_reporter' |
| 14 _CRASH_SENDER_PATH = '/sbin/crash_sender' | 15 _CRASH_SENDER_PATH = '/sbin/crash_sender' |
| 15 _CRASH_SENDER_RATE_DIR = '/var/lib/crash_sender' | 16 _CRASH_SENDER_RATE_DIR = '/var/lib/crash_sender' |
| 16 _CRASH_SENDER_RUN_PATH = '/var/run/crash_sender.pid' | 17 _CRASH_SENDER_RUN_PATH = '/var/run/crash_sender.pid' |
| 17 _MOCK_CRASH_SENDING = '/tmp/mock-crash-sending' | 18 _MOCK_CRASH_SENDING = '/tmp/mock-crash-sending' |
| 18 _PAUSE_FILE = '/var/lib/crash_sender_paused' | 19 _PAUSE_FILE = '/var/lib/crash_sender_paused' |
| 19 _SYSTEM_CRASH_DIR = '/var/spool/crash' | 20 _SYSTEM_CRASH_DIR = '/var/spool/crash' |
| 20 _USER_CRASH_DIR = '/home/chronos/user/crash' | 21 _USER_CRASH_DIR = '/home/chronos/user/crash' |
| 21 | 22 |
| 22 def _set_system_sending(self, is_enabled): | 23 def _set_system_sending(self, is_enabled): |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 | 96 |
| 96 def _get_crash_dir(self, username): | 97 def _get_crash_dir(self, username): |
| 97 if username == 'chronos': | 98 if username == 'chronos': |
| 98 return self._USER_CRASH_DIR | 99 return self._USER_CRASH_DIR |
| 99 else: | 100 else: |
| 100 return self._SYSTEM_CRASH_DIR | 101 return self._SYSTEM_CRASH_DIR |
| 101 | 102 |
| 102 | 103 |
| 103 def _initialize_crash_reporter(self): | 104 def _initialize_crash_reporter(self): |
| 104 utils.system('%s --init --nounclean_check' % self._CRASH_REPORTER_PATH) | 105 utils.system('%s --init --nounclean_check' % self._CRASH_REPORTER_PATH) |
| 106 # Completely disable crash_reporter from generating crash dumps |
| 107 # while any tests are running, otherwise a crashy system can make |
| 108 # these tests flaky. |
| 109 self.enable_crash_filtering('none') |
| 105 | 110 |
| 106 | 111 |
| 107 def write_crash_dir_entry(self, name, contents): | 112 def write_crash_dir_entry(self, name, contents): |
| 108 entry = os.path.join(self._SYSTEM_CRASH_DIR, name) | 113 entry = os.path.join(self._SYSTEM_CRASH_DIR, name) |
| 109 if not os.path.exists(self._SYSTEM_CRASH_DIR): | 114 if not os.path.exists(self._SYSTEM_CRASH_DIR): |
| 110 os.makedirs(self._SYSTEM_CRASH_DIR) | 115 os.makedirs(self._SYSTEM_CRASH_DIR) |
| 111 utils.open_write_close(entry, contents) | 116 utils.open_write_close(entry, contents) |
| 112 return entry | 117 return entry |
| 113 | 118 |
| 114 | 119 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 | 276 |
| 272 # Show the result for debugging but remove 'output' key | 277 # Show the result for debugging but remove 'output' key |
| 273 # since it's large and earlier in debug output. | 278 # since it's large and earlier in debug output. |
| 274 debug_result = dict(result) | 279 debug_result = dict(result) |
| 275 del debug_result['output'] | 280 del debug_result['output'] |
| 276 logging.debug('Result of send (besides output): %s' % debug_result) | 281 logging.debug('Result of send (besides output): %s' % debug_result) |
| 277 | 282 |
| 278 return result | 283 return result |
| 279 | 284 |
| 280 | 285 |
| 286 def _replace_crash_reporter_filter_in(self, new_parameter): |
| 287 core_pattern = utils.read_file(self._CORE_PATTERN)[:-1] |
| 288 core_pattern = re.sub('--filter_in=\S*\s*', '', |
| 289 core_pattern).rstrip() |
| 290 if new_parameter: |
| 291 core_pattern += ' ' + new_parameter |
| 292 utils.system('echo "%s" > %s' % (core_pattern, self._CORE_PATTERN)) |
| 293 |
| 294 |
| 295 def enable_crash_filtering(self, name): |
| 296 self._replace_crash_reporter_filter_in('--filter_in=' + name) |
| 297 |
| 298 |
| 299 def disable_crash_filtering(self): |
| 300 self._replace_crash_reporter_filter_in('') |
| 301 |
| 302 |
| 281 def initialize(self): | 303 def initialize(self): |
| 282 test.test.initialize(self) | 304 test.test.initialize(self) |
| 283 self._log_reader = site_log_reader.LogReader() | 305 self._log_reader = site_log_reader.LogReader() |
| 284 self._leave_crash_sending = True | 306 self._leave_crash_sending = True |
| 285 self._automatic_consent_saving = True | 307 self._automatic_consent_saving = True |
| 308 self.enable_crash_filtering('none') |
| 286 | 309 |
| 287 | 310 |
| 288 def cleanup(self): | 311 def cleanup(self): |
| 289 self._reset_rate_limiting() | 312 self._reset_rate_limiting() |
| 290 self._clear_spooled_crashes() | 313 self._clear_spooled_crashes() |
| 291 self._set_system_sending(self._leave_crash_sending) | 314 self._set_system_sending(self._leave_crash_sending) |
| 292 self._set_sending_mock(mock_enabled=False) | 315 self._set_sending_mock(mock_enabled=False) |
| 293 if self._automatic_consent_saving: | 316 if self._automatic_consent_saving: |
| 294 self._pop_consent() | 317 self._pop_consent() |
| 318 self.disable_crash_filtering() |
| 295 test.test.cleanup(self) | 319 test.test.cleanup(self) |
| 296 | 320 |
| 297 | 321 |
| 298 def run_crash_tests(self, | 322 def run_crash_tests(self, |
| 299 test_names, | 323 test_names, |
| 300 initialize_crash_reporter=False, | 324 initialize_crash_reporter=False, |
| 301 clear_spool_first=True, | 325 clear_spool_first=True, |
| 302 must_run_all=True): | 326 must_run_all=True): |
| 303 """Run crash tests defined in this class. | 327 """Run crash tests defined in this class. |
| 304 | 328 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 325 self._initialize_crash_reporter() | 349 self._initialize_crash_reporter() |
| 326 # Disable crash_sender from running, kill off any running ones, but | 350 # Disable crash_sender from running, kill off any running ones, but |
| 327 # set environment so crash_sender may run as a child process. | 351 # set environment so crash_sender may run as a child process. |
| 328 self._set_system_sending(False) | 352 self._set_system_sending(False) |
| 329 self._set_child_sending(True) | 353 self._set_child_sending(True) |
| 330 self._kill_running_sender() | 354 self._kill_running_sender() |
| 331 self._reset_rate_limiting() | 355 self._reset_rate_limiting() |
| 332 if clear_spool_first: | 356 if clear_spool_first: |
| 333 self._clear_spooled_crashes() | 357 self._clear_spooled_crashes() |
| 334 getattr(self, '_test_' + test_name)() | 358 getattr(self, '_test_' + test_name)() |
| OLD | NEW |