| # Copyright (c) 2012 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, os.path, signal, time |
| from autotest_lib.client.bin import utils |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.cros import constants as chromeos_constants, login |
| from autotest_lib.client.cros import crash_test |
| |
| class logging_CrashServices(crash_test.CrashTest): |
| version = 1 |
| |
| process_list = ["/usr/sbin/acpid", |
| "/sbin/agetty", |
| "/opt/google/chrome/chrome", |
| "/usr/bin/chromeos-wm", |
| "/usr/sbin/console-kit-daemon", |
| "/usr/sbin/cryptohomed", |
| "/usr/libexec/devkit-daemon", |
| "/usr/libexec/devkit-disks-daemon", |
| "/usr/libexec/devkit-power-daemon", |
| "/sbin/dhcpcd", |
| "/usr/sbin/flimflamd", |
| "/usr/bin/metrics_daemon", |
| "/usr/sbin/pkcsslotd", |
| "/usr/bin/powerd", |
| "/usr/bin/pulseaudio", |
| "/usr/sbin/rsyslogd", |
| "/usr/sbin/tcsd", |
| #"/sbin/udevd", # ignores all signals except INT, TERM, KILL |
| "/usr/sbin/update_engine", |
| "/sbin/wpa_supplicant", |
| "/usr/bin/X", |
| # this will log out, so it's last |
| "/sbin/session_manager"] |
| |
| |
| def _kill_processes(self, name): |
| return utils.system("killall -w -s SEGV %s" % name, ignore_status=True) |
| |
| |
| def _find_core(self): |
| return self._find_file_in_path(self._SYSTEM_CRASH_DIR, ".core") \ |
| or self._find_file_in_path(self._USER_CRASH_DIR, ".core") |
| |
| |
| def _find_dmp(self): |
| return self._find_file_in_path(self._SYSTEM_CRASH_DIR, ".dmp") \ |
| or self._find_file_in_path(self._USER_CRASH_DIR, ".dmp") |
| |
| |
| def _find_file_in_path(self, path, filetype): |
| try: |
| entries = os.listdir(path) |
| except OSError: |
| return None |
| |
| for entry in entries: |
| (_, ext) = os.path.splitext(entry) |
| if ext == filetype: |
| return entry |
| return None |
| |
| |
| def _test_process(self, process_path): |
| if self._kill_processes(process_path): |
| raise error.TestFail("Failed to kill process %s" % process_path) |
| |
| # wait for .core and .dmp files to appear in a crash directory |
| utils.poll_for_condition( |
| condition=lambda: self._find_core(), |
| desc="Waiting for .core for %s" % process_path) |
| utils.poll_for_condition( |
| condition=lambda: self._find_dmp(), |
| desc="Waiting for .dmp for %s" % process_path) |
| |
| # run crash_sender and watch for successful send in logs |
| result = self._call_sender_one_crash(report=self._find_dmp()) |
| if not result["send_success"]: |
| raise error.TestFail("Crash sending unsuccessful") |
| if self._find_dmp(): |
| raise error.TestFail(".dmp files were not removed") |
| |
| |
| def initialize(self): |
| crash_test.CrashTest.initialize(self) |
| self._reset_rate_limiting() |
| self._clear_spooled_crashes() |
| self._push_consent() |
| self._set_consent(True) |
| |
| |
| def cleanup(self): |
| crash_test.CrashTest.cleanup(self) |
| |
| |
| def run_once(self, process_path=None): |
| if process_path: |
| self._test_process(process_path) |
| return |
| |
| # log in |
| (username, password) = chromeos_constants.CREDENTIALS["$default"] |
| login.attempt_login(username, password) |
| |
| # test processes |
| for process_path in self.process_list: |
| self.job.run_test("logging_CrashServices", |
| process_path=process_path, |
| tag=os.path.basename(process_path)) |
| |
| # killing session manager logs out, so this will probably fail |
| try: |
| login.attempt_logout() |
| except login.UnexpectedCondition: |
| pass |