1# Copyright 2016 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import time 6import common 7from autotest_lib.client.common_lib import error 8from autotest_lib.server import test 9 10# Process to kill for log-generation purposes. 11TARGET_PROCESS = '/system/bin/mediaserver' 12# Number of seconds to wait for host.run commands to timeout. 13COMMAND_TIMEOUT_SECONDS = 10 14# Number of times to try to kill the process. 15KILL_RETRIES = 10 16# Number of times to retry the command the find command to find logs. 17LOG_FIND_RETRIES = 5 18 19class android_CrashLogging(test.test): 20 """Confirm that crash logs are generated for native crashes.""" 21 version = 1 22 23 24 def run_once(self, host=None): 25 """Confirm that crash logs are generated for crashes. 26 27 @param host: host object representing the device under test. 28 """ 29 if host is None: 30 raise error.TestFail('android_Crashlogging test executed without ' 31 'a host') 32 self.host = host 33 34 # Remove any pre-existing tombstones. 35 self.host.run('rm /data/tombstones/tombstone_*', 36 timeout=COMMAND_TIMEOUT_SECONDS, ignore_status=True) 37 38 # Find and kill a process. 39 result = self.host.run('pgrep %s' % TARGET_PROCESS, 40 timeout=COMMAND_TIMEOUT_SECONDS, 41 ignore_status=True) 42 pid = result.stdout.strip() 43 if result.exit_status != 0 or not len(pid): 44 raise error.TestFail('No %s process found to kill' % TARGET_PROCESS) 45 for _ in xrange(KILL_RETRIES): 46 status = self.host.run('kill -SIGSEGV %s' % pid, 47 timeout=COMMAND_TIMEOUT_SECONDS, 48 ignore_status=True).exit_status 49 if status != 0: 50 break 51 52 logs = None 53 for _ in xrange(LOG_FIND_RETRIES): 54 try: 55 logs = self.host.run_output( 56 'find /data/tombstones -maxdepth 1 -type f', 57 timeout=COMMAND_TIMEOUT_SECONDS).split() 58 except (error.GenericHostRunError, error.AutoservSSHTimeout, 59 error.CmdTimeoutError): 60 raise error.TestFail('No crash logs were created because of a ' 61 'host error or because the directory ' 62 'where crash logs are written to does not ' 63 'exist on the DUT.') 64 if logs: 65 break 66 time.sleep(1) 67 68 if not logs: 69 raise error.TestFail('No crash logs were created.') 70