OLD | NEW |
| (Empty) |
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.annotations, | |
30 test_options.exclude_annotations, | |
31 test_options.test_filter, | |
32 test_options.test_data, | |
33 test_options.save_perf_json, | |
34 test_options.screenshot_failures, | |
35 wait_for_debugger=False, | |
36 coverage_dir=None, | |
37 test_apk=None, | |
38 test_apk_path=None, | |
39 test_apk_jar_path=None, | |
40 test_runner=None, | |
41 test_support_apk_path=None, | |
42 device_flags=None, | |
43 isolate_file_path=None, | |
44 set_asserts=test_options.set_asserts, | |
45 delete_stale_data=False) | |
46 super(TestRunner, self).__init__(instrumentation_options, device, | |
47 shard_index, test_pkg) | |
48 | |
49 cmdline_file = constants.PACKAGE_INFO[test_options.package].cmdline_file | |
50 self.flags = None | |
51 if cmdline_file: | |
52 self.flags = flag_changer.FlagChanger(self.device, cmdline_file) | |
53 self._package = constants.PACKAGE_INFO[test_options.package].package | |
54 self._activity = constants.PACKAGE_INFO[test_options.package].activity | |
55 | |
56 #override | |
57 def InstallTestPackage(self): | |
58 self.test_pkg.Install(self.device) | |
59 | |
60 #override | |
61 def _RunTest(self, test, timeout): | |
62 self.device.ClearApplicationState(self._package) | |
63 if self.flags: | |
64 annotations = self.test_pkg.GetTestAnnotations(test) | |
65 if 'FirstRunExperience' == annotations.get('Feature', None): | |
66 self.flags.RemoveFlags(['--disable-fre']) | |
67 else: | |
68 self.flags.AddFlags(['--disable-fre']) | |
69 self.device.StartActivity( | |
70 intent.Intent(action='android.intent.action.MAIN', | |
71 activity=self._activity, | |
72 package=self._package), | |
73 blocking=True, | |
74 force_stop=True) | |
75 cmd = ['uiautomator', 'runtest', | |
76 self.test_pkg.UIAUTOMATOR_PATH + self.test_pkg.GetPackageName(), | |
77 '-e', 'class', test, | |
78 '-e', 'test_package', self._package] | |
79 return self.device.RunShellCommand(cmd, timeout=timeout, retries=0) | |
80 | |
81 #override | |
82 def _GenerateTestResult(self, test, _result_code, _result_bundle, statuses, | |
83 start_ms, duration_ms): | |
84 # uiautomator emits its summary status with INSTRUMENTATION_STATUS_CODE, | |
85 # not INSTRUMENTATION_CODE, so we have to drop if off the list of statuses. | |
86 summary_code, summary_bundle = statuses[-1] | |
87 return super(TestRunner, self)._GenerateTestResult( | |
88 test, summary_code, summary_bundle, statuses[:-1], start_ms, | |
89 duration_ms) | |
OLD | NEW |