Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(625)

Side by Side Diff: client/bin/site_crash_test.py

Issue 4185011: autotest: Make crash tests resilient to builds with high ambient crash rates (Closed) Base URL: http://git.chromium.org/git/autotest.git
Patch Set: Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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)()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698