Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / build / android / pylib / uiautomator / test_runner.py
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)