blob: 2072cfe0b697048cc539df9521e651bd32658f47 [file] [log] [blame]
Geremy Condra01844b12012-09-11 15:24:25 -07001#!/usr/bin/env python
The Android Open Source Project6ffae012009-03-18 17:39:43 -07002#
3# Copyright 2008, The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
Brett Chabot59b47782009-10-21 17:23:01 -070017"""Command line utility for running Android tests
The Android Open Source Project6ffae012009-03-18 17:39:43 -070018
Brett Chabot59b47782009-10-21 17:23:01 -070019runtest helps automate the instructions for building and running tests
20- It builds the corresponding test package for the code you want to test
21- It pushes the test package to your device or emulator
22- It launches InstrumentationTestRunner (or similar) to run the tests you
23specify.
24
25runtest supports running tests whose attributes have been pre-defined in
26_TEST_FILE_NAME files, (runtest <testname>), or by specifying the file
27system path to the test to run (runtest --path <path>).
28
29Do runtest --help to see full list of options.
The Android Open Source Project6ffae012009-03-18 17:39:43 -070030"""
31
32# Python imports
33import glob
34import optparse
35import os
Brett Chabot74541712012-08-31 18:39:00 -070036import re
The Android Open Source Project6ffae012009-03-18 17:39:43 -070037from sets import Set
38import sys
Brett Chabotcdfaae12011-06-07 10:10:38 -070039import time
The Android Open Source Project6ffae012009-03-18 17:39:43 -070040
41# local imports
42import adb_interface
43import android_build
Brett Chabot8ac51182012-09-19 07:35:35 -070044from coverage import coverage
The Android Open Source Project6ffae012009-03-18 17:39:43 -070045import errors
46import logger
Brett Chabot8ac51182012-09-19 07:35:35 -070047import make_tree
The Android Open Source Project6ffae012009-03-18 17:39:43 -070048import run_command
Brett Chabot764d3fa2009-06-25 17:57:31 -070049from test_defs import test_defs
Brett Chabot59b47782009-10-21 17:23:01 -070050from test_defs import test_walker
The Android Open Source Project6ffae012009-03-18 17:39:43 -070051
52
53class TestRunner(object):
54 """Command line utility class for running pre-defined Android test(s)."""
55
Brett Chabotf61f43e2009-04-02 11:52:48 -070056 _TEST_FILE_NAME = "test_defs.xml"
57
The Android Open Source Project6ffae012009-03-18 17:39:43 -070058 # file path to android core platform tests, relative to android build root
59 # TODO move these test data files to another directory
Nicolas Catania97b24c42009-04-22 11:08:32 -070060 _CORE_TEST_PATH = os.path.join("development", "testrunner",
Brett Chabotf61f43e2009-04-02 11:52:48 -070061 _TEST_FILE_NAME)
The Android Open Source Project6ffae012009-03-18 17:39:43 -070062
63 # vendor glob file path patterns to tests, relative to android
64 # build root
65 _VENDOR_TEST_PATH = os.path.join("vendor", "*", "tests", "testinfo",
Brett Chabotf61f43e2009-04-02 11:52:48 -070066 _TEST_FILE_NAME)
The Android Open Source Project6ffae012009-03-18 17:39:43 -070067
68 _RUNTEST_USAGE = (
69 "usage: runtest.py [options] short-test-name[s]\n\n"
70 "The runtest script works in two ways. You can query it "
71 "for a list of tests, or you can launch one or more tests.")
72
Brett Chabot2477b382009-09-23 18:05:28 -070073 # default value for make -jX
Brett Chabot12db4362012-01-17 16:03:49 -080074 _DEFAULT_JOBS = 16
Brett Chabot2477b382009-09-23 18:05:28 -070075
Igor Murashkina0afc8c2014-01-22 16:22:50 -080076 _DALVIK_VERIFIER_PROP = "dalvik.vm.dexopt-flags"
77 _DALVIK_VERIFIER_OFF_VALUE = "v=n"
78 _DALVIK_VERIFIER_OFF_PROP = "%s = %s" %(_DALVIK_VERIFIER_PROP, _DALVIK_VERIFIER_OFF_VALUE)
Brett Chabotccae47d2010-06-14 15:19:25 -070079
Brett Chabot5f5928c2013-08-20 17:06:03 -070080 # regular expression to match path to artifacts to install in make output
Igor Murashkina0afc8c2014-01-22 16:22:50 -080081 _RE_MAKE_INSTALL = re.compile(r'INSTALL-PATH:\s([^\s]+)\s(.*)$')
Brett Chabot74541712012-08-31 18:39:00 -070082
Brett Chabot72731f32009-03-31 11:14:05 -070083 def __init__(self):
84 # disable logging of timestamp
Niko Catania2e990b92009-04-02 16:52:26 -070085 self._root_path = android_build.GetTop()
JP Abgrallf38107c2013-07-11 17:39:16 -070086 out_base_name = os.path.basename(android_build.GetOutDir())
87 # regular expression to find remote device path from a file path relative
88 # to build root
89 pattern = r'' + out_base_name + r'\/target\/product\/\w+\/(.+)$'
90 self._re_make_install_path = re.compile(pattern)
Nicolas Catania97b24c42009-04-22 11:08:32 -070091 logger.SetTimestampLogging(False)
Brett Chabot3ae5f8a2009-06-28 12:00:47 -070092 self._adb = None
93 self._known_tests = None
94 self._options = None
95 self._test_args = None
Brett Chabot59b47782009-10-21 17:23:01 -070096 self._tests_to_run = None
Brett Chabot72731f32009-03-31 11:14:05 -070097
The Android Open Source Project6ffae012009-03-18 17:39:43 -070098 def _ProcessOptions(self):
99 """Processes command-line options."""
100 # TODO error messages on once-only or mutually-exclusive options.
101 user_test_default = os.path.join(os.environ.get("HOME"), ".android",
Brett Chabotf61f43e2009-04-02 11:52:48 -0700102 self._TEST_FILE_NAME)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700103
104 parser = optparse.OptionParser(usage=self._RUNTEST_USAGE)
105
106 parser.add_option("-l", "--list-tests", dest="only_list_tests",
107 default=False, action="store_true",
108 help="To view the list of tests")
109 parser.add_option("-b", "--skip-build", dest="skip_build", default=False,
110 action="store_true", help="Skip build - just launch")
Brett Chabot2477b382009-09-23 18:05:28 -0700111 parser.add_option("-j", "--jobs", dest="make_jobs",
112 metavar="X", default=self._DEFAULT_JOBS,
113 help="Number of make jobs to use when building")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700114 parser.add_option("-n", "--skip_execute", dest="preview", default=False,
115 action="store_true",
116 help="Do not execute, just preview commands")
Igor Murashkin8d703532014-01-23 16:13:29 -0800117 parser.add_option("-i", "--build-install-only", dest="build_install_only", default=False,
118 action="store_true",
119 help="Do not execute, build tests and install to device only")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700120 parser.add_option("-r", "--raw-mode", dest="raw_mode", default=False,
121 action="store_true",
122 help="Raw mode (for output to other tools)")
123 parser.add_option("-a", "--suite-assign", dest="suite_assign_mode",
124 default=False, action="store_true",
125 help="Suite assignment (for details & usage see "
126 "InstrumentationTestRunner)")
127 parser.add_option("-v", "--verbose", dest="verbose", default=False,
128 action="store_true",
129 help="Increase verbosity of %s" % sys.argv[0])
130 parser.add_option("-w", "--wait-for-debugger", dest="wait_for_debugger",
131 default=False, action="store_true",
132 help="Wait for debugger before launching tests")
133 parser.add_option("-c", "--test-class", dest="test_class",
134 help="Restrict test to a specific class")
135 parser.add_option("-m", "--test-method", dest="test_method",
136 help="Restrict test to a specific method")
Brett Chabot8a101cb2009-05-05 12:56:39 -0700137 parser.add_option("-p", "--test-package", dest="test_package",
138 help="Restrict test to a specific java package")
139 parser.add_option("-z", "--size", dest="test_size",
140 help="Restrict test to a specific test size")
Brett Chabotc0611542010-02-20 20:09:58 -0800141 parser.add_option("--annotation", dest="test_annotation",
142 help="Include only those tests tagged with a specific"
143 " annotation")
144 parser.add_option("--not-annotation", dest="test_not_annotation",
Brett Chabot2e16fbc2010-02-23 12:28:27 -0800145 help="Exclude any tests tagged with a specific"
Brett Chabotc0611542010-02-20 20:09:58 -0800146 " annotation")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700147 parser.add_option("-u", "--user-tests-file", dest="user_tests_file",
148 metavar="FILE", default=user_test_default,
149 help="Alternate source of user test definitions")
150 parser.add_option("-o", "--coverage", dest="coverage",
151 default=False, action="store_true",
152 help="Generate code coverage metrics for test(s)")
Brett Chabot8ac51182012-09-19 07:35:35 -0700153 parser.add_option("--coverage-target", dest="coverage_target_path",
154 default=None,
155 help="Path to app to collect code coverage target data for.")
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700156 parser.add_option("-k", "--skip-permissions", dest="skip_permissions",
157 default=False, action="store_true",
158 help="Do not grant runtime permissions during test package"
159 " installation.")
Brett Chabot59b47782009-10-21 17:23:01 -0700160 parser.add_option("-x", "--path", dest="test_path",
161 help="Run test(s) at given file system path")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700162 parser.add_option("-t", "--all-tests", dest="all_tests",
163 default=False, action="store_true",
164 help="Run all defined tests")
165 parser.add_option("--continuous", dest="continuous_tests",
166 default=False, action="store_true",
167 help="Run all tests defined as part of the continuous "
168 "test set")
Wei-Ta Chen97752d42009-05-21 16:24:04 -0700169 parser.add_option("--timeout", dest="timeout",
170 default=300, help="Set a timeout limit (in sec) for "
171 "running native tests on a device (default: 300 secs)")
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800172 parser.add_option("--suite", dest="suite",
Brett Chabot49b77112009-06-02 11:46:04 -0700173 help="Run all tests defined as part of the "
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800174 "the given test suite")
Xiaohui Chen85586e02015-08-20 09:45:48 -0700175 parser.add_option("--user", dest="user",
176 help="The user that test apks are installing to."
177 " This is the integer user id, e.g. 0 or 10."
178 " If no user is specified, apk will be installed with"
179 " adb's default behavior, which is currently all users.")
Xiaohui Chenfc784a42015-08-21 16:40:35 -0700180 parser.add_option("--install-filter", dest="filter_re",
181 help="Regular expression which generated apks have to"
182 " match to be installed to target device. Default is None"
183 " and will install all packages built. This is"
184 " useful when the test path has a lot of apks but you"
185 " only care about one.")
Remi NGUYEN VAN66862572018-05-31 11:23:39 +0900186 parser.add_option("--no-hidden-api-checks", dest="no_hidden_api_checks",
187 default=False, action="store_true",
188 help="Disable hidden API checks in instrumentation"
189 " tests.")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700190 group = optparse.OptionGroup(
191 parser, "Targets", "Use these options to direct tests to a specific "
192 "Android target")
193 group.add_option("-e", "--emulator", dest="emulator", default=False,
194 action="store_true", help="use emulator")
195 group.add_option("-d", "--device", dest="device", default=False,
196 action="store_true", help="use device")
197 group.add_option("-s", "--serial", dest="serial",
198 help="use specific serial")
199 parser.add_option_group(group)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700200 self._options, self._test_args = parser.parse_args()
201
Brett Chabot49b77112009-06-02 11:46:04 -0700202 if (not self._options.only_list_tests
203 and not self._options.all_tests
204 and not self._options.continuous_tests
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800205 and not self._options.suite
Brett Chabot59b47782009-10-21 17:23:01 -0700206 and not self._options.test_path
Brett Chabot49b77112009-06-02 11:46:04 -0700207 and len(self._test_args) < 1):
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700208 parser.print_help()
209 logger.SilentLog("at least one test name must be specified")
210 raise errors.AbortError
211
212 self._adb = adb_interface.AdbInterface()
213 if self._options.emulator:
214 self._adb.SetEmulatorTarget()
215 elif self._options.device:
216 self._adb.SetDeviceTarget()
217 elif self._options.serial is not None:
218 self._adb.SetTargetSerial(self._options.serial)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700219 if self._options.verbose:
220 logger.SetVerbose(True)
221
Brett Chabot8ac51182012-09-19 07:35:35 -0700222 if self._options.coverage_target_path:
223 self._options.coverage = True
224
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700225 self._known_tests = self._ReadTests()
226
Brett Chabot764d3fa2009-06-25 17:57:31 -0700227 self._options.host_lib_path = android_build.GetHostLibraryPath()
228 self._options.test_data_path = android_build.GetTestAppPath()
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700229
230 def _ReadTests(self):
231 """Parses the set of test definition data.
232
233 Returns:
234 A TestDefinitions object that contains the set of parsed tests.
235 Raises:
236 AbortError: If a fatal error occurred when parsing the tests.
237 """
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700238 try:
239 known_tests = test_defs.TestDefinitions()
Brett Chabot3c9cefc2011-06-06 20:53:56 -0700240 # only read tests when not in path mode
241 if not self._options.test_path:
242 core_test_path = os.path.join(self._root_path, self._CORE_TEST_PATH)
243 if os.path.isfile(core_test_path):
244 known_tests.Parse(core_test_path)
245 # read all <android root>/vendor/*/tests/testinfo/test_defs.xml paths
246 vendor_tests_pattern = os.path.join(self._root_path,
247 self._VENDOR_TEST_PATH)
248 test_file_paths = glob.glob(vendor_tests_pattern)
249 for test_file_path in test_file_paths:
250 known_tests.Parse(test_file_path)
251 if os.path.isfile(self._options.user_tests_file):
252 known_tests.Parse(self._options.user_tests_file)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700253 return known_tests
254 except errors.ParseError:
255 raise errors.AbortError
256
257 def _DumpTests(self):
258 """Prints out set of defined tests."""
Brett Chabotbe659c02009-09-21 17:48:26 -0700259 print "The following tests are currently defined:\n"
260 print "%-25s %-40s %s" % ("name", "build path", "description")
261 print "-" * 80
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700262 for test in self._known_tests:
Brett Chabotbe659c02009-09-21 17:48:26 -0700263 print "%-25s %-40s %s" % (test.GetName(), test.GetBuildPath(),
264 test.GetDescription())
265 print "\nSee %s for more information" % self._TEST_FILE_NAME
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700266
267 def _DoBuild(self):
268 logger.SilentLog("Building tests...")
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700269 tests = self._GetTestsToRun()
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700270
271 # Build and install tests that do not get granted permissions
272 self._DoPermissionAwareBuild(tests, False)
273
274 # Build and install tests that require granted permissions
275 self._DoPermissionAwareBuild(tests, True)
276
277 def _DoPermissionAwareBuild(self, tests, test_requires_permissions):
Brett Chabotb1eb5d22010-06-15 11:18:42 -0700278 # turn off dalvik verifier if necessary
Brett Chabot8b538bd2014-04-22 11:46:00 -0700279 # TODO: skip turning off verifier for now, since it puts device in bad
280 # state b/14088982
281 #self._TurnOffVerifier(tests)
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700282 self._DoFullBuild(tests, test_requires_permissions)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700283
Brett Chabot8ac51182012-09-19 07:35:35 -0700284 target_tree = make_tree.MakeTree()
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800285
286 extra_args_set = []
Brett Chabot2477b382009-09-23 18:05:28 -0700287 for test_suite in tests:
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700288 if test_suite.IsGrantedPermissions() == test_requires_permissions:
289 self._AddBuildTarget(test_suite, target_tree, extra_args_set)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700290
Brett Chabotccae47d2010-06-14 15:19:25 -0700291 if not self._options.preview:
292 self._adb.EnableAdbRoot()
293 else:
294 logger.Log("adb root")
Brett Chabot8ac51182012-09-19 07:35:35 -0700295
296 if not target_tree.IsEmpty():
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700297 if self._options.coverage:
Brett Chabot764d3fa2009-06-25 17:57:31 -0700298 coverage.EnableCoverageBuild()
Brett Chabot8ac51182012-09-19 07:35:35 -0700299 target_tree.AddPath("external/emma")
Brett Chabot2477b382009-09-23 18:05:28 -0700300
Brett Chabot8ac51182012-09-19 07:35:35 -0700301 target_list = target_tree.GetPrunedMakeList()
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800302 target_dir_list = [re.sub(r'Android[.]mk$', r'', i) for i in target_list]
Brett Chabot8ac51182012-09-19 07:35:35 -0700303 target_build_string = " ".join(target_list)
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800304 target_dir_build_string = " ".join(target_dir_list)
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800305 extra_args_string = " ".join(extra_args_set)
Brett Chabotb1eb5d22010-06-15 11:18:42 -0700306
Dan Willemsenc7949962016-08-11 15:03:43 -0700307 install_path_goals = []
Ying Wang1b06fea2015-09-23 16:56:25 -0700308 mmma_goals = []
309 for d in target_dir_list:
310 if d.startswith("./"):
311 d = d[2:]
312 if d.endswith("/"):
313 d = d[:-1]
Dan Willemsenc7949962016-08-11 15:03:43 -0700314 install_path_goals.append("GET-INSTALL-PATH-IN-" + d.replace("/","-"))
Ying Wang21d83c62015-09-24 16:35:36 -0700315 mmma_goals.append("MODULES-IN-" + d.replace("/","-"))
Dan Willemsenc7949962016-08-11 15:03:43 -0700316 # mmm cannot be used from python, so perform a similar operation using
317 # ONE_SHOT_MAKEFILE
318 cmd = 'ONE_SHOT_MAKEFILE="%s" make -j%s -C "%s" %s %s %s' % (
319 target_build_string, self._options.make_jobs, self._root_path,
320 " ".join(install_path_goals), " ".join(mmma_goals), extra_args_string)
321 # mmma cannot be used from python, so perform a similar operation
Ying Wang1b06fea2015-09-23 16:56:25 -0700322 alt_cmd = 'make -j%s -C "%s" -f build/core/main.mk %s %s' % (
323 self._options.make_jobs, self._root_path, extra_args_string, " ".join(mmma_goals))
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800324
Brett Chabot764d3fa2009-06-25 17:57:31 -0700325 logger.Log(cmd)
Brett Chabot74541712012-08-31 18:39:00 -0700326 if not self._options.preview:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800327 run_command.SetAbortOnError()
328 try:
329 output = run_command.RunCommand(cmd, return_output=True, timeout_time=600)
330 ## Chances are this failed because it didn't build the dependencies
331 except errors.AbortError:
332 logger.Log("make failed. Trying to rebuild all dependencies.")
333 logger.Log("mmma -j%s %s" %(self._options.make_jobs, target_dir_build_string))
334 # Try again with mma equivalent, which will build the dependencies
335 run_command.RunCommand(alt_cmd, return_output=False, timeout_time=600)
336 # Run mmm again to get the install paths only
337 output = run_command.RunCommand(cmd, return_output=True, timeout_time=600)
338 run_command.SetAbortOnError(False)
Brett Chabot5f5928c2013-08-20 17:06:03 -0700339 logger.SilentLog(output)
Xiaohui Chenfc784a42015-08-21 16:40:35 -0700340 filter_re = re.compile(self._options.filter_re) if self._options.filter_re else None
Niko Cataniaa6dc2ab2009-04-03 14:12:46 -0700341
Xiaohui Chenfc784a42015-08-21 16:40:35 -0700342 self._DoInstall(output, test_requires_permissions, filter_re=filter_re)
343
344 def _DoInstall(self, make_output, test_requires_permissions, filter_re=None):
Brett Chabot74541712012-08-31 18:39:00 -0700345 """Install artifacts from build onto device.
346
347 Looks for 'install:' text from make output to find artifacts to install.
348
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800349 Files with the .apk extension get 'adb install'ed, all other files
350 get 'adb push'ed onto the device.
351
Brett Chabot74541712012-08-31 18:39:00 -0700352 Args:
353 make_output: stdout from make command
354 """
355 for line in make_output.split("\n"):
356 m = self._RE_MAKE_INSTALL.match(line)
357 if m:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800358 # strip the 'INSTALL: <name>' from the left hand side
359 # the remaining string is a space-separated list of build-generated files
360 install_paths = m.group(2)
361 for install_path in re.split(r'\s+', install_paths):
Xiaohui Chenfc784a42015-08-21 16:40:35 -0700362 if filter_re and not filter_re.match(install_path):
363 continue
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800364 if install_path.endswith(".apk"):
365 abs_install_path = os.path.join(self._root_path, install_path)
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700366 extra_flags = ""
367 if test_requires_permissions and not self._options.skip_permissions:
368 extra_flags = "-g"
Xiaohui Chen85586e02015-08-20 09:45:48 -0700369 if self._options.user:
370 extra_flags += " --user " + self._options.user
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700371 logger.Log("adb install -r %s %s" % (extra_flags, abs_install_path))
372 logger.Log(self._adb.Install(abs_install_path, extra_flags))
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800373 else:
374 self._PushInstallFileToDevice(install_path)
Brett Chabot74541712012-08-31 18:39:00 -0700375
376 def _PushInstallFileToDevice(self, install_path):
JP Abgrallf38107c2013-07-11 17:39:16 -0700377 m = self._re_make_install_path.match(install_path)
Brett Chabot74541712012-08-31 18:39:00 -0700378 if m:
379 remote_path = m.group(1)
Brett Chabote607d3a2013-05-16 23:00:43 -0700380 remote_dir = os.path.dirname(remote_path)
381 logger.Log("adb shell mkdir -p %s" % remote_dir)
382 self._adb.SendShellCommand("mkdir -p %s" % remote_dir)
Brett Chabot74541712012-08-31 18:39:00 -0700383 abs_install_path = os.path.join(self._root_path, install_path)
Brett Chabot81c475e2012-09-11 12:57:31 -0700384 logger.Log("adb push %s %s" % (abs_install_path, remote_path))
Brett Chabot74541712012-08-31 18:39:00 -0700385 self._adb.Push(abs_install_path, remote_path)
386 else:
387 logger.Log("Error: Failed to recognize path of file to install %s" % install_path)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700388
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700389 def _DoFullBuild(self, tests, test_requires_permissions):
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700390 """If necessary, run a full 'make' command for the tests that need it."""
391 extra_args_set = Set()
392
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700393 for test in tests:
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700394 if test.IsFullMake() and test.IsGrantedPermissions() == test_requires_permissions:
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700395 if test.GetExtraBuildArgs():
396 # extra args contains the args to pass to 'make'
397 extra_args_set.add(test.GetExtraBuildArgs())
398 else:
399 logger.Log("Warning: test %s needs a full build but does not specify"
400 " extra_build_args" % test.GetName())
401
402 # check if there is actually any tests that required a full build
403 if extra_args_set:
404 cmd = ('make -j%s %s' % (self._options.make_jobs,
405 ' '.join(list(extra_args_set))))
406 logger.Log(cmd)
407 if not self._options.preview:
408 old_dir = os.getcwd()
409 os.chdir(self._root_path)
Brett Chabotb0b8c782012-09-19 08:32:56 -0700410 output = run_command.RunCommand(cmd, return_output=True)
Brett Chabot5f5928c2013-08-20 17:06:03 -0700411 logger.SilentLog(output)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700412 os.chdir(old_dir)
Santos Cordon4e0ad8f2015-05-21 12:25:05 -0700413 self._DoInstall(output, test_requires_permissions)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700414
Brett Chabot8ac51182012-09-19 07:35:35 -0700415 def _AddBuildTarget(self, test_suite, target_tree, extra_args_set):
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700416 if not test_suite.IsFullMake():
417 build_dir = test_suite.GetBuildPath()
Brett Chabot8ac51182012-09-19 07:35:35 -0700418 if self._AddBuildTargetPath(build_dir, target_tree):
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800419 extra_args_set.append(test_suite.GetExtraBuildArgs())
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700420 for path in test_suite.GetBuildDependencies(self._options):
Brett Chabot8ac51182012-09-19 07:35:35 -0700421 self._AddBuildTargetPath(path, target_tree)
Brett Chabot2b6643b2009-04-07 18:35:27 -0700422
Brett Chabot8ac51182012-09-19 07:35:35 -0700423 def _AddBuildTargetPath(self, build_dir, target_tree):
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700424 if build_dir is not None:
Brett Chabot8ac51182012-09-19 07:35:35 -0700425 target_tree.AddPath(build_dir)
426 return True
Brett Chabot2b6643b2009-04-07 18:35:27 -0700427 return False
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700428
429 def _GetTestsToRun(self):
430 """Get a list of TestSuite objects to run, based on command line args."""
Brett Chabot59b47782009-10-21 17:23:01 -0700431 if self._tests_to_run:
432 return self._tests_to_run
433
434 self._tests_to_run = []
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700435 if self._options.all_tests:
Brett Chabot59b47782009-10-21 17:23:01 -0700436 self._tests_to_run = self._known_tests.GetTests()
Brett Chabot49b77112009-06-02 11:46:04 -0700437 elif self._options.continuous_tests:
Brett Chabot59b47782009-10-21 17:23:01 -0700438 self._tests_to_run = self._known_tests.GetContinuousTests()
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800439 elif self._options.suite:
440 self._tests_to_run = \
441 self._known_tests.GetTestsInSuite(self._options.suite)
Brett Chabot59b47782009-10-21 17:23:01 -0700442 elif self._options.test_path:
443 walker = test_walker.TestWalker()
444 self._tests_to_run = walker.FindTests(self._options.test_path)
445
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700446 for name in self._test_args:
447 test = self._known_tests.GetTest(name)
448 if test is None:
449 logger.Log("Error: Could not find test %s" % name)
450 self._DumpTests()
451 raise errors.AbortError
Brett Chabot59b47782009-10-21 17:23:01 -0700452 self._tests_to_run.append(test)
453 return self._tests_to_run
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700454
Brett Chabotccae47d2010-06-14 15:19:25 -0700455 def _TurnOffVerifier(self, test_list):
456 """Turn off the dalvik verifier if needed by given tests.
457
458 If one or more tests needs dalvik verifier off, and it is not already off,
459 turns off verifier and reboots device to allow change to take effect.
460 """
Brett Chabot74541712012-08-31 18:39:00 -0700461 # hack to check if these are frameworks/base tests. If so, turn off verifier
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800462 # to allow framework tests to access private/protected/package-private framework api
Brett Chabotccae47d2010-06-14 15:19:25 -0700463 framework_test = False
464 for test in test_list:
465 if os.path.commonprefix([test.GetBuildPath(), "frameworks/base"]):
466 framework_test = True
467 if framework_test:
468 # check if verifier is off already - to avoid the reboot if not
469 # necessary
470 output = self._adb.SendShellCommand("cat /data/local.prop")
471 if not self._DALVIK_VERIFIER_OFF_PROP in output:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800472
473 # Read the existing dalvik verifier flags.
474 old_prop_value = self._adb.SendShellCommand("getprop %s" \
475 %(self._DALVIK_VERIFIER_PROP))
476 old_prop_value = old_prop_value.strip() if old_prop_value else ""
477
478 # Append our verifier flags to existing flags
479 new_prop_value = "%s %s" %(self._DALVIK_VERIFIER_OFF_VALUE, old_prop_value)
480
481 # Update property now, as /data/local.prop is not read until reboot
482 logger.Log("adb shell setprop %s '%s'" \
483 %(self._DALVIK_VERIFIER_PROP, new_prop_value))
484 if not self._options.preview:
485 self._adb.SendShellCommand("setprop %s '%s'" \
486 %(self._DALVIK_VERIFIER_PROP, new_prop_value))
487
488 # Write prop to /data/local.prop
489 # Every time device is booted, it will pick up this value
490 new_prop_assignment = "%s = %s" %(self._DALVIK_VERIFIER_PROP, new_prop_value)
Brett Chabotccae47d2010-06-14 15:19:25 -0700491 if self._options.preview:
492 logger.Log("adb shell \"echo %s >> /data/local.prop\""
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800493 % new_prop_assignment)
Brett Chabot25dfd792012-02-16 15:51:43 -0800494 logger.Log("adb shell chmod 644 /data/local.prop")
Brett Chabotccae47d2010-06-14 15:19:25 -0700495 else:
496 logger.Log("Turning off dalvik verifier and rebooting")
497 self._adb.SendShellCommand("\"echo %s >> /data/local.prop\""
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800498 % new_prop_assignment)
Brett Chabot25dfd792012-02-16 15:51:43 -0800499
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800500 # Reset runtime so that dalvik picks up new verifier flags from prop
501 self._ChmodRuntimeReset()
Brett Chabot25dfd792012-02-16 15:51:43 -0800502 elif not self._options.preview:
503 # check the permissions on the file
504 permout = self._adb.SendShellCommand("ls -l /data/local.prop")
505 if not "-rw-r--r--" in permout:
506 logger.Log("Fixing permissions on /data/local.prop and rebooting")
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800507 self._ChmodRuntimeReset()
Brett Chabot25dfd792012-02-16 15:51:43 -0800508
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800509 def _ChmodRuntimeReset(self):
510 """Perform a chmod of /data/local.prop and reset the runtime.
Brett Chabot25dfd792012-02-16 15:51:43 -0800511 """
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800512 logger.Log("adb shell chmod 644 /data/local.prop ## u+w,a+r")
513 if not self._options.preview:
514 self._adb.SendShellCommand("chmod 644 /data/local.prop")
515
516 self._adb.RuntimeReset(preview_only=self._options.preview)
517
518 if not self._options.preview:
519 self._adb.EnableAdbRoot()
Brett Chabot25dfd792012-02-16 15:51:43 -0800520
Brett Chabotccae47d2010-06-14 15:19:25 -0700521
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700522 def RunTests(self):
523 """Main entry method - executes the tests according to command line args."""
524 try:
525 run_command.SetAbortOnError()
526 self._ProcessOptions()
527 if self._options.only_list_tests:
528 self._DumpTests()
529 return
530
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700531 if not self._options.skip_build:
532 self._DoBuild()
533
Igor Murashkin8d703532014-01-23 16:13:29 -0800534 if self._options.build_install_only:
535 logger.Log("Skipping test execution (due to --build-install-only flag)")
536 return
537
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700538 for test_suite in self._GetTestsToRun():
Brett Chabot920e9fe2010-01-21 17:30:47 -0800539 try:
540 test_suite.Run(self._options, self._adb)
541 except errors.WaitForResponseTimedOutError:
542 logger.Log("Timed out waiting for response")
Brett Chabot764d3fa2009-06-25 17:57:31 -0700543
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700544 except KeyboardInterrupt:
545 logger.Log("Exiting...")
Brett Chabot3ae5f8a2009-06-28 12:00:47 -0700546 except errors.AbortError, error:
547 logger.Log(error.msg)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700548 logger.SilentLog("Exiting due to AbortError...")
549 except errors.WaitForResponseTimedOutError:
550 logger.Log("Timed out waiting for response")
551
552
553def RunTests():
554 runner = TestRunner()
555 runner.RunTests()
556
557if __name__ == "__main__":
558 RunTests()