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

Unified Diff: client/site_tests/logging_UserCrash/logging_UserCrash.py

Issue 3454023: autotest: Test new meta files in crash directory (Closed) Base URL: http://git.chromium.org/git/autotest.git
Patch Set: Fix bug Created 10 years, 3 months 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 side-by-side diff with in-line comments
Download patch
Index: client/site_tests/logging_UserCrash/logging_UserCrash.py
diff --git a/client/site_tests/logging_UserCrash/logging_UserCrash.py b/client/site_tests/logging_UserCrash/logging_UserCrash.py
index 38f4defaab0e0b183215114fb090825bb48ba291..3009ad544401965db71086f3635ec6c139847215 100644
--- a/client/site_tests/logging_UserCrash/logging_UserCrash.py
+++ b/client/site_tests/logging_UserCrash/logging_UserCrash.py
@@ -121,7 +121,7 @@ class logging_UserCrash(site_crash_test.CrashTest):
raise error.TestFail('Did not show main on stack')
- def _run_crasher_process(self, username, cause_crash=True):
+ def _run_crasher_process(self, username, cause_crash=True, consent=True):
"""Runs the crasher process.
Args:
@@ -149,6 +149,7 @@ class logging_UserCrash(site_crash_test.CrashTest):
basename = os.path.basename(self._crasher_path)
if not cause_crash:
crasher_command.append('--nocrash')
+ self._set_consent(consent)
crasher = subprocess.Popen(crasher_command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
@@ -164,8 +165,13 @@ class logging_UserCrash(site_crash_test.CrashTest):
output)
pid = int(match.group(1))
- expected_message = ('Received crash notification for '
- '%s[%d] sig 11' % (basename, pid))
+ if consent:
+ handled_string = 'handling'
+ else:
+ handled_string = 'ignoring'
+ expected_message = (
+ 'Received crash notification for %s[%d] sig 11 (%s)' %
+ (basename, pid, handled_string))
# Wait until no crash_reporter is running.
site_utils.poll_for_condition(
@@ -177,10 +183,10 @@ class logging_UserCrash(site_crash_test.CrashTest):
self._log_reader.get_logs()))
logging.debug('crash_reporter_caught message: ' + expected_message)
- crash_reporter_caught = self._log_reader.can_find(expected_message)
+ is_caught = self._log_reader.can_find(expected_message)
result = {'crashed': crasher.returncode == expected_result,
- 'crash_reporter_caught': crash_reporter_caught,
+ 'crash_reporter_caught': is_caught,
'output': output,
'returncode': crasher.returncode}
logging.debug('Crasher process result: %s' % result)
@@ -220,7 +226,7 @@ class logging_UserCrash(site_crash_test.CrashTest):
self._verify_stack(stack, basename, from_crash_reporter)
- def _check_generated_minidump_sending(self, minidump_path,
+ def _check_generated_minidump_sending(self, meta_path, minidump_path,
username, crasher_basename,
will_syslog_give_name):
# Now check that the sending works
@@ -236,14 +242,23 @@ class logging_UserCrash(site_crash_test.CrashTest):
raise error.TestFail('Executable name incorrect')
if result['report_kind'] != 'minidump':
raise error.TestFail('Expected a minidump report')
- if result['report_name'] != minidump_path:
- raise error.TestFail('Sent the wrong minidump report')
+ if result['report_payload'] != minidump_path:
+ raise error.TestFail('Sent the wrong minidump payload')
+ if result['meta_path'] != meta_path:
+ raise error.TestFail('Used the wrong meta file')
+
+ # Check version matches.
+ lsb_release = utils.read_file('/etc/lsb-release')
+ version_match = re.search(r'CHROMEOS_RELEASE_VERSION=(.*)', lsb_release)
+ if not ('Version: %s' % version_match.group(1)) in result['output']:
+ raise error.TestFail('Did not find version %s in log output' %
+ version_match.group(1))
- def _check_crashing_process(self, username):
+ def _check_crashing_process(self, username, consent=True):
self._log_reader.set_start_by_current()
- result = self._run_crasher_process(username)
+ result = self._run_crasher_process(username, consent=consent)
if not result['crashed']:
raise error.TestFail('crasher did not do its job of crashing: %d' %
@@ -255,11 +270,18 @@ class logging_UserCrash(site_crash_test.CrashTest):
raise error.TestFail('Did not find segv message')
crash_dir = self._get_crash_dir(username)
+
+ if not consent:
+ if os.path.exists(crash_dir):
+ raise error.TestFail('Crash directory should not exist')
+ return
+
crash_contents = os.listdir(crash_dir)
basename = os.path.basename(self._crasher_path)
breakpad_minidump = None
crash_reporter_minidump = None
+ crash_reporter_meta = None
self._check_crash_directory_permissions(crash_dir)
@@ -269,12 +291,19 @@ class logging_UserCrash(site_crash_test.CrashTest):
if filename.endswith('.core'):
# Ignore core files. We'll test them later.
pass
- elif filename.startswith(basename):
+ elif (filename.startswith(basename) and
+ filename.endswith('.dmp')):
# This appears to be a minidump created by the crash reporter.
if not crash_reporter_minidump is None:
raise error.TestFail('Crash reporter wrote multiple '
'minidumps')
crash_reporter_minidump = os.path.join(crash_dir, filename)
+ elif (filename.startswith(basename) and
+ filename.endswith('.meta')):
+ if not crash_reporter_meta is None:
+ raise error.TestFail('Crash reported wrote multiple '
+ 'meta files')
+ crash_reporter_meta = os.path.join(crash_dir, filename)
else:
# This appears to be a breakpad created minidump.
if not breakpad_minidump is None:
@@ -287,35 +316,21 @@ class logging_UserCrash(site_crash_test.CrashTest):
if not crash_reporter_minidump:
raise error.TestFail('crash reporter did not generate minidump')
+ if not crash_reporter_meta:
+ raise error.TestFail('crash reporter did not generate meta')
+
if not self._log_reader.can_find('Stored minidump to ' +
crash_reporter_minidump):
raise error.TestFail('crash reporter did not announce minidump')
- # By default test sending the crash_reporter minidump unless there
- # is a breakpad minidump, and then we test sending it instead.
- send_minidump = crash_reporter_minidump
-
if crash_reporter_minidump:
self._check_minidump_stackwalk(crash_reporter_minidump,
basename,
from_crash_reporter=True)
will_syslog_give_name = True
- if breakpad_minidump:
- self._check_minidump_stackwalk(breakpad_minidump,
- basename,
- from_crash_reporter=False)
- send_minidump = breakpad_minidump
- os.unlink(crash_reporter_minidump)
- # If you link against -lcrash, upon sending the syslog will
- # just say exec_name: <very-long-guid>, where that GUID is the
- # GUID generated during breakpad. Since -lcrash is going away,
- # it seems ok to have the syslog be a little more opaque for
- # these crashes. They'll be next to sends for the real crash
- # anyway.
- will_syslog_give_name = False
-
- self._check_generated_minidump_sending(send_minidump,
+ self._check_generated_minidump_sending(crash_reporter_meta,
+ crash_reporter_minidump,
username,
basename,
will_syslog_give_name)
@@ -331,16 +346,26 @@ class logging_UserCrash(site_crash_test.CrashTest):
raise error.TestFail('Normal exit of program with dumper failed')
- def _test_chronos_nobreakpad_crasher(self):
+ def _test_chronos_crasher(self):
"""Test a user space crash when running as chronos is handled."""
self._check_crashing_process('chronos')
- def _test_root_nobreakpad_crasher(self):
+ def _test_chronos_crasher_no_consent(self):
+ """Test that without consent no files are stored."""
+ results = self._check_crashing_process('chronos', consent=False)
+
+
+ def _test_root_crasher(self):
"""Test a user space crash when running as root is handled."""
self._check_crashing_process('root')
+ def _test_root_crasher_no_consent(self):
+ """Test that without consent no files are stored."""
+ results = self._check_crashing_process('root', consent=False)
+
+
def _test_max_enqueued_crashes(self):
"""Test that _MAX_CRASH_DIRECTORY_SIZE is enforced."""
self._log_reader.set_start_by_current()
@@ -450,8 +475,10 @@ class logging_UserCrash(site_crash_test.CrashTest):
self.run_crash_tests(['reporter_startup',
'reporter_shutdown',
'no_crash',
- 'chronos_nobreakpad_crasher',
- 'root_nobreakpad_crasher',
+ 'chronos_crasher',
+ 'chronos_crasher_no_consent',
+ 'root_crasher',
+ 'root_crasher_no_consent',
'max_enqueued_crashes',
'core_file_persists_in_debug',
'core_file_removed_in_production'],

Powered by Google App Engine
This is Rietveld 408576698