Home | History | Annotate | Download | only in uiautomator
      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