1 # Copyright (c) 2013 The Chromium 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 5 """Class for running uiautomator tests on a single device.""" 6 7 from pylib import constants 8 from pylib import flag_changer 9 from pylib.device import intent 10 from pylib.instrumentation import test_options as instr_test_options 11 from pylib.instrumentation import test_runner as instr_test_runner 12 13 14 class TestRunner(instr_test_runner.TestRunner): 15 """Responsible for running a series of tests connected to a single device.""" 16 17 def __init__(self, test_options, device, shard_index, test_pkg): 18 """Create a new TestRunner. 19 20 Args: 21 test_options: A UIAutomatorOptions object. 22 device: Attached android device. 23 shard_index: Shard index. 24 test_pkg: A TestPackage object. 25 """ 26 # Create an InstrumentationOptions object to pass to the super class 27 instrumentation_options = instr_test_options.InstrumentationOptions( 28 test_options.tool, 29 test_options.cleanup_test_files, 30 test_options.push_deps, 31 test_options.annotations, 32 test_options.exclude_annotations, 33 test_options.test_filter, 34 test_options.test_data, 35 test_options.save_perf_json, 36 test_options.screenshot_failures, 37 wait_for_debugger=False, 38 coverage_dir=None, 39 test_apk=None, 40 test_apk_path=None, 41 test_apk_jar_path=None, 42 test_runner=None, 43 test_support_apk_path=None, 44 device_flags=None) 45 super(TestRunner, self).__init__(instrumentation_options, device, 46 shard_index, test_pkg) 47 48 cmdline_file = constants.PACKAGE_INFO[test_options.package].cmdline_file 49 self.flags = None 50 if cmdline_file: 51 self.flags = flag_changer.FlagChanger(self.device, cmdline_file) 52 self._package = constants.PACKAGE_INFO[test_options.package].package 53 self._activity = constants.PACKAGE_INFO[test_options.package].activity 54 55 #override 56 def InstallTestPackage(self): 57 self.test_pkg.Install(self.device) 58 59 #override 60 def PushDataDeps(self): 61 pass 62 63 #override 64 def _RunTest(self, test, timeout): 65 self.device.ClearApplicationState(self._package) 66 if self.flags: 67 if 'Feature:FirstRunExperience' in self.test_pkg.GetTestAnnotations(test): 68 self.flags.RemoveFlags(['--disable-fre']) 69 else: 70 self.flags.AddFlags(['--disable-fre']) 71 self.device.StartActivity( 72 intent.Intent(action='android.intent.action.MAIN', 73 activity=self._activity, 74 package=self._package), 75 blocking=True, 76 force_stop=True) 77 cmd = ['uiautomator', 'runtest', self.test_pkg.GetPackageName(), 78 '-e', 'class', test] 79 return self.device.RunShellCommand(cmd, timeout=timeout, retries=0) 80 81 #override 82 def _GenerateTestResult(self, test, instr_statuses, start_ms, duration_ms): 83 # uiautomator emits its summary status with INSTRUMENTATION_STATUS_CODE, 84 # not INSTRUMENTATION_CODE, so we have to drop if off the list of statuses. 85 return super(TestRunner, self)._GenerateTestResult( 86 test, instr_statuses[:-1], start_ms, duration_ms) 87