Index: build/android/pylib/local/device/local_device_monkey_test_run.py |
diff --git a/build/android/pylib/local/device/local_device_monkey_test_run.py b/build/android/pylib/local/device/local_device_monkey_test_run.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8f293c6892101bb1cf7f4ff55929fb5275416571 |
--- /dev/null |
+++ b/build/android/pylib/local/device/local_device_monkey_test_run.py |
@@ -0,0 +1,126 @@ |
+# Copyright 2016 The Chromium 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 |
+ |
+from devil.android import device_errors |
+from devil.android.sdk import intent |
+from pylib import constants |
+from pylib.base import base_test_result |
+from pylib.local.device import local_device_test_run |
+ |
+ |
+_CHROME_PACKAGE = constants.PACKAGE_INFO['chrome'].package |
+ |
+class LocalDeviceMonkeyTestRun(local_device_test_run.LocalDeviceTestRun): |
+ def __init__(self, env, test_instance): |
+ super(LocalDeviceMonkeyTestRun, self).__init__(env, test_instance) |
+ |
+ def TestPackage(self): |
+ return 'monkey' |
+ |
+ #override |
+ def SetUp(self): |
+ pass |
+ |
+ #override |
+ def _RunTest(self, device, test): |
+ device.ClearApplicationState(self._test_instance.package) |
+ |
+ # Chrome crashes are not always caught by Monkey test runner. |
+ # Launch Chrome and verify Chrome has the same PID before and after |
+ # the test. |
+ device.StartActivity( |
+ intent.Intent(package=self._test_instance.package, |
+ activity=self._test_instance.activity, |
+ action='android.intent.action.MAIN'), |
+ blocking=True, force_stop=True) |
+ before_pids = device.GetPids(self._test_instance.package) |
+ |
+ output = '' |
+ if before_pids: |
+ if len(before_pids.get(self._test_instance.package, [])) > 1: |
+ raise Exception( |
+ 'At most one instance of process %s expected but found pids: ' |
+ '%s' % (self._test_instance.package, before_pids)) |
+ output = '\n'.join(self._LaunchMonkeyTest(device)) |
+ after_pids = device.GetPids(self._test_instance.package) |
+ |
+ crashed = True |
+ if not self._test_instance.package in before_pids: |
+ logging.error('Failed to start the process.') |
+ elif not self._test_instance.package in after_pids: |
+ logging.error('Process %s has died.', |
+ before_pids[self._test_instance.package]) |
+ elif (before_pids[self._test_instance.package] != |
+ after_pids[self._test_instance.package]): |
+ logging.error('Detected process restart %s -> %s', |
+ before_pids[self._test_instance.package], |
+ after_pids[self._test_instance.package]) |
+ else: |
+ crashed = False |
+ |
+ success_pattern = 'Events injected: %d' % self._test_instance.event_count |
+ if success_pattern in output and not crashed: |
+ result = base_test_result.BaseTestResult( |
+ test, base_test_result.ResultType.PASS, log=output) |
+ else: |
+ result = base_test_result.BaseTestResult( |
+ test, base_test_result.ResultType.FAIL, log=output) |
+ if 'chrome' in self._test_instance.package: |
+ logging.warning('Starting MinidumpUploadService...') |
+ # TODO(jbudorick): Update this after upstreaming. |
jbudorick
2016/11/16 00:14:02
Well, this is awkward.
mikecase (-- gone --)
2016/11/16 22:48:57
lol
|
+ minidump_intent = intent.Intent( |
+ action='%s.crash.ACTION_FIND_ALL' % _CHROME_PACKAGE, |
+ package=self._test_instance.package, |
+ activity='%s.crash.MinidumpUploadService' % _CHROME_PACKAGE) |
+ try: |
+ device.RunShellCommand( |
+ ['am', 'startservice'] + minidump_intent.am_args, |
+ as_root=True, check_return=True) |
+ except device_errors.CommandFailedError: |
+ logging.exception('Failed to start MinidumpUploadService') |
+ |
+ return result |
+ |
+ #override |
+ def TearDown(self): |
+ pass |
+ |
+ #override |
+ def _CreateShards(self, tests): |
+ return tests |
+ |
+ #override |
+ def _ShouldShard(self): |
+ # TODO(mikecase): Run Monkey test concurrently on each attached device. |
+ return False |
+ |
+ #override |
+ def _GetTests(self): |
+ return ['MonkeyTest'] |
+ |
+ def _LaunchMonkeyTest(self, device): |
+ try: |
+ cmd = ['monkey', |
+ '-p', self._test_instance.package, |
+ '--throttle', str(self._test_instance.throttle), |
+ '-s', str(self._test_instance.seed), |
+ '--monitor-native-crashes', |
+ '--kill-process-after-error'] |
+ for category in self._test_instance.categories: |
+ cmd.extend(['-c', category]) |
+ for _ in range(self._test_instance.verbose_count): |
+ cmd.append('-v') |
+ cmd.append(str(self._test_instance.event_count)) |
+ return device.RunShellCommand( |
+ cmd, timeout=self._test_instance.timeout) |
jbudorick
2016/11/16 00:14:03
This should be using check_return=True, though I'm
mikecase (-- gone --)
2016/11/16 22:48:57
ack
|
+ finally: |
+ try: |
+ # Kill the monkey test process on the device. If you manually |
+ # interupt the test run, this will prevent the monkey test from |
+ # continuing to run. |
+ device.KillAll('com.android.commands.monkey') |
+ except device_errors.CommandFailedError: |
+ pass |