77 lines
3.0 KiB
Python
77 lines
3.0 KiB
Python
|
|
# 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.
|
||
|
|
|
||
|
|
from autotest_lib.client.bin import utils
|
||
|
|
from autotest_lib.client.common_lib import error
|
||
|
|
from autotest_lib.client.cros import cros_ui, upstart
|
||
|
|
from autotest_lib.client.cros.crash import user_crash_test
|
||
|
|
|
||
|
|
|
||
|
|
_CRASH_REPORTER_ENABLED_PATH = '/var/lib/crash_reporter/crash-handling-enabled'
|
||
|
|
|
||
|
|
|
||
|
|
class logging_UserCrash(user_crash_test.UserCrashTest):
|
||
|
|
"""Verifies crash reporting for user processes."""
|
||
|
|
version = 1
|
||
|
|
|
||
|
|
|
||
|
|
def _get_uptime(self):
|
||
|
|
with open('/proc/uptime', 'r') as f:
|
||
|
|
uptime_seconds = float(f.readline().split()[0])
|
||
|
|
|
||
|
|
return uptime_seconds
|
||
|
|
|
||
|
|
|
||
|
|
# This test has a tast counterpart, but the tast version only performs a
|
||
|
|
# slightly different function. Specifically, the tast variant does not
|
||
|
|
# verify that crash reporter state is valid before any tests run and
|
||
|
|
# re-initialize crash reporter.
|
||
|
|
# TODO(https://crbug.com/1085194): Write a tast test to verify that crash
|
||
|
|
# reporter's state is good on a "clean" system.
|
||
|
|
def _test_reporter_startup(self):
|
||
|
|
"""Test that the core_pattern is set up by crash reporter."""
|
||
|
|
# Turn off crash filtering so we see the original setting.
|
||
|
|
self.disable_crash_filtering()
|
||
|
|
output = utils.read_file(self._CORE_PATTERN).rstrip()
|
||
|
|
expected_core_pattern = ('|%s --user=%%P:%%s:%%u:%%g:%%f' %
|
||
|
|
self._CRASH_REPORTER_PATH)
|
||
|
|
if output != expected_core_pattern:
|
||
|
|
raise error.TestFail('core pattern should have been %s, not %s' %
|
||
|
|
(expected_core_pattern, output))
|
||
|
|
|
||
|
|
|
||
|
|
# This test has a critical tast counterpart, but we leave it here because
|
||
|
|
# it verifies that the in_progress_integration_test variable will be set in
|
||
|
|
# autotests.
|
||
|
|
def _test_chronos_crasher(self):
|
||
|
|
"""Test a user space crash when running as chronos is handled."""
|
||
|
|
self._check_crashing_process(
|
||
|
|
'chronos',
|
||
|
|
extra_meta_contents='upload_var_in_progress_integration_test='
|
||
|
|
'logging_UserCrash')
|
||
|
|
|
||
|
|
|
||
|
|
def initialize(self):
|
||
|
|
user_crash_test.UserCrashTest.initialize(self)
|
||
|
|
|
||
|
|
# If the device has a GUI, return the device to the sign-in screen, as
|
||
|
|
# some tests will fail inside a user session.
|
||
|
|
if upstart.has_service('ui'):
|
||
|
|
cros_ui.restart()
|
||
|
|
|
||
|
|
|
||
|
|
def run_once(self):
|
||
|
|
""" Run all tests once """
|
||
|
|
self._prepare_crasher()
|
||
|
|
self._populate_symbols()
|
||
|
|
|
||
|
|
# Run the test once without re-initializing
|
||
|
|
# to catch problems with the default crash reporting setup
|
||
|
|
self.run_crash_tests(['reporter_startup'],
|
||
|
|
initialize_crash_reporter=False,
|
||
|
|
must_run_all=False)
|
||
|
|
|
||
|
|
self.run_crash_tests(['reporter_startup', 'chronos_crasher'],
|
||
|
|
initialize_crash_reporter=True)
|