| Index: client/site_tests/logging_KernelCrash/logging_KernelCrash.py
|
| diff --git a/client/site_tests/logging_KernelCrash/logging_KernelCrash.py b/client/site_tests/logging_KernelCrash/logging_KernelCrash.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..785dca0562de70ec88aeb2f3883ff31019ecbccd
|
| --- /dev/null
|
| +++ b/client/site_tests/logging_KernelCrash/logging_KernelCrash.py
|
| @@ -0,0 +1,85 @@
|
| +# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import logging, os, re
|
| +from autotest_lib.client.bin import site_crash_test, site_log_reader, \
|
| + site_utils, test
|
| +from autotest_lib.client.common_lib import error, utils
|
| +
|
| +
|
| +_KCRASH_FILE = '/sys/kernel/debug/preserved/kcrash'
|
| +
|
| +
|
| +class logging_KernelCrash(site_crash_test.CrashTest):
|
| + version = 1
|
| +
|
| +
|
| + def _test_reporter_startup(self):
|
| + """Test that the crash_reporter is handling kernel crashes."""
|
| + if not self._log_reader.can_find('Enabling kernel crash handling'):
|
| + if self._log_reader.can_find(
|
| + 'Kernel does not support crash dumping'):
|
| + # TODO(kmixter): Remove this exception once I know it has
|
| + logging.info('Hasnt the kcrash kernel change landed?')
|
| + else:
|
| + raise error.TestFail(
|
| + 'Could not find kernel crash found message')
|
| +
|
| +
|
| + def _get_kcrash_name(self):
|
| + filename_match = re.search(
|
| + r'Collected kernel crash diagnostics into (\S+)',
|
| + self._log_reader.get_logs())
|
| + if not filename_match:
|
| + raise error.TestFail('Could not message with kcrash filename')
|
| + return filename_match.group(1)
|
| +
|
| +
|
| + def _test_reporter_kcrash_storage(self):
|
| + """Test that crash_reporter has properly stored the kcrash report."""
|
| + if not self._log_reader.can_find('Cleared kernel crash diagnostics'):
|
| + raise error.TestFail('Could not find clearing message')
|
| +
|
| + kcrash_report = self._get_kcrash_name()
|
| + if not os.path.exists(kcrash_report):
|
| + raise error.TestFail('Crash report gone')
|
| + report_contents = utils.read_file(kcrash_report)
|
| + if not 'kernel BUG at fs/proc/breakme.c' in report_contents:
|
| + raise error.TestFail('Crash report has unexpected contents')
|
| +
|
| + if not os.path.exists(_KCRASH_FILE):
|
| + raise error.TestFail('Could not find %s' % _KCRASH_FILE)
|
| + kcrash_file_contents = utils.read_file(_KCRASH_FILE)
|
| + if kcrash_file_contents != '':
|
| + raise error.TestFail('%s was not properly cleared' % _KCRASH_FILE)
|
| +
|
| +
|
| + def _test_sender_send_kcrash(self):
|
| + """Test that crash_sender properly sends the crash report."""
|
| + kcrash_report = self._get_kcrash_name()
|
| + if not os.path.exists(kcrash_report):
|
| + raise error.TestFail('Crash report gone')
|
| + self._set_sending(True)
|
| + result = self._call_sender_one_crash(
|
| + report=os.path.basename(kcrash_report))
|
| + if (not result['send_attempt'] or not result['send_success'] or
|
| + result['report_exists']):
|
| + raise error.TestFail('kcrash not sent properly')
|
| + if result['exec_name'] != 'kernel' or result['report_kind'] != 'kcrash':
|
| + raise error.TestFail('kcrash exec name or report kind wrong')
|
| + if result['report_name'] != kcrash_report:
|
| + raise error.TestFail('Sent the wrong kcrash report')
|
| +
|
| +
|
| + def run_once(self, is_before):
|
| + self._log_reader.set_start_by_reboot(-1)
|
| + if is_before:
|
| + self.run_crash_tests(['reporter_startup'], must_run_all=False)
|
| + # Leave crash sending paused for the kernel crash.
|
| + self._leave_crash_sending = False
|
| + else:
|
| + self.run_crash_tests(['reporter_startup',
|
| + 'reporter_kcrash_storage',
|
| + 'sender_send_kcrash'],
|
| + clear_spool_first=False)
|
|
|