1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved. 2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch# Use of this source code is governed by a BSD-style license that can be 3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch# found in the LICENSE file. 4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch"""Runs a monkey test on a single device.""" 6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import logging 8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochimport random 9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)from pylib import constants 11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochfrom pylib.base import base_test_result 12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochfrom pylib.base import base_test_runner 13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 15bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass TestRunner(base_test_runner.BaseTestRunner): 16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch """A TestRunner instance runs a monkey test on a single device.""" 17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) def __init__(self, test_options, device, _): 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) super(TestRunner, self).__init__(device, None) 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) self._options = test_options 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) self._package = constants.PACKAGE_INFO[self._options.package].package 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) self._activity = constants.PACKAGE_INFO[self._options.package].activity 23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch def _LaunchMonkeyTest(self): 25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch """Runs monkey test for a given package. 26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Returns: 28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Output from the monkey command on the device. 29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch """ 30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) timeout_ms = self._options.event_count * self._options.throttle * 1.5 32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch cmd = ['monkey', 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) '-p %s' % self._package, 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ' '.join(['-c %s' % c for c in self._options.category]), 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) '--throttle %d' % self._options.throttle, 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) '-s %d' % (self._options.seed or random.randint(1, 100)), 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) '-v ' * self._options.verbose_count, 39bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch '--monitor-native-crashes', 40bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch '--kill-process-after-error', 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) self._options.extra_args, 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) '%d' % self._options.event_count] 43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return self.adb.RunShellCommand(' '.join(cmd), timeout_time=timeout_ms) 44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch def RunTest(self, test_name): 46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch """Run a Monkey test on the device. 47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 48bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Args: 49bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch test_name: String to use for logging the test result. 50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Returns: 52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch A tuple of (TestRunResults, retry). 53bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch """ 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) self.adb.StartActivity(self._package, 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) self._activity, 56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch wait_for_completion=True, 57bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch action='android.intent.action.MAIN', 58bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch force_stop=True) 59bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 60bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch # Chrome crashes are not always caught by Monkey test runner. 61bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch # Verify Chrome has the same PID before and after the test. 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) before_pids = self.adb.ExtractPid(self._package) 63bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 64bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch # Run the test. 65bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch output = '' 66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if before_pids: 67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch output = '\n'.join(self._LaunchMonkeyTest()) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) after_pids = self.adb.ExtractPid(self._package) 69bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) crashed = True 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if not before_pids: 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) logging.error('Failed to start the process.') 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) elif not after_pids: 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) logging.error('Process %s has died.', before_pids[0]) 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) elif before_pids[0] != after_pids[0]: 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) logging.error('Detected process restart %s -> %s', 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) before_pids[0], after_pids[0]) 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else: 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) crashed = False 80bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 81bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch results = base_test_result.TestRunResults() 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) success_pattern = 'Events injected: %d' % self._options.event_count 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if success_pattern in output and not crashed: 84bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch result = base_test_result.BaseTestResult( 85bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch test_name, base_test_result.ResultType.PASS, log=output) 86bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch else: 87bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch result = base_test_result.BaseTestResult( 88bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch test_name, base_test_result.ResultType.FAIL, log=output) 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if 'chrome' in self._options.package: 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) logging.warning('Starting MinidumpUploadService...') 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) try: 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.adb.StartCrashUploadService(self._package) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) except AssertionError as e: 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) logging.error('Failed to start MinidumpUploadService: %s', e) 95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch results.AddResult(result) 96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return results, False 97