普通文本  |  70行  |  2.7 KB

# Copyright 2016 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 time
import common
from autotest_lib.client.common_lib import error
from autotest_lib.server import test

# Process to kill for log-generation purposes.
TARGET_PROCESS = '/system/bin/mediaserver'
# Number of seconds to wait for host.run commands to timeout.
COMMAND_TIMEOUT_SECONDS = 10
# Number of times to try to kill the process.
KILL_RETRIES = 10
# Number of times to retry the command the find command to find logs.
LOG_FIND_RETRIES = 5

class android_CrashLogging(test.test):
    """Confirm that crash logs are generated for native crashes."""
    version = 1


    def run_once(self, host=None):
        """Confirm that crash logs are generated for crashes.

        @param host: host object representing the device under test.
        """
        if host is None:
            raise error.TestFail('android_Crashlogging test executed without '
                                 'a host')
        self.host = host

        # Remove any pre-existing tombstones.
        self.host.run('rm /data/tombstones/tombstone_*',
                      timeout=COMMAND_TIMEOUT_SECONDS, ignore_status=True)

        # Find and kill a process.
        result = self.host.run('pgrep %s' % TARGET_PROCESS,
                               timeout=COMMAND_TIMEOUT_SECONDS,
                               ignore_status=True)
        pid = result.stdout.strip()
        if result.exit_status != 0 or not len(pid):
            raise error.TestFail('No %s process found to kill' % TARGET_PROCESS)
        for _ in xrange(KILL_RETRIES):
            status = self.host.run('kill -SIGSEGV %s' % pid,
                                   timeout=COMMAND_TIMEOUT_SECONDS,
                                   ignore_status=True).exit_status
            if status != 0:
                break

        logs = None
        for _ in xrange(LOG_FIND_RETRIES):
            try:
                logs = self.host.run_output(
                        'find /data/tombstones -maxdepth 1 -type f',
                        timeout=COMMAND_TIMEOUT_SECONDS).split()
            except (error.GenericHostRunError, error.AutoservSSHTimeout,
                    error.CmdTimeoutError):
                raise error.TestFail('No crash logs were created because of a '
                                     'host error or because the directory '
                                     'where crash logs are written to does not '
                                     'exist on the DUT.')
            if logs:
                break
            time.sleep(1)

        if not logs:
            raise error.TestFail('No crash logs were created.')