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 |