blob: d3679049090d61f95ba25c052c0f6cc6197fd29c [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.")
Brett Chabot59b47782009-10-21 17:23:01 -0700156 parser.add_option("-x", "--path", dest="test_path",
157 help="Run test(s) at given file system path")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700158 parser.add_option("-t", "--all-tests", dest="all_tests",
159 default=False, action="store_true",
160 help="Run all defined tests")
161 parser.add_option("--continuous", dest="continuous_tests",
162 default=False, action="store_true",
163 help="Run all tests defined as part of the continuous "
164 "test set")
Wei-Ta Chen97752d42009-05-21 16:24:04 -0700165 parser.add_option("--timeout", dest="timeout",
166 default=300, help="Set a timeout limit (in sec) for "
167 "running native tests on a device (default: 300 secs)")
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800168 parser.add_option("--suite", dest="suite",
Brett Chabot49b77112009-06-02 11:46:04 -0700169 help="Run all tests defined as part of the "
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800170 "the given test suite")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700171 group = optparse.OptionGroup(
172 parser, "Targets", "Use these options to direct tests to a specific "
173 "Android target")
174 group.add_option("-e", "--emulator", dest="emulator", default=False,
175 action="store_true", help="use emulator")
176 group.add_option("-d", "--device", dest="device", default=False,
177 action="store_true", help="use device")
178 group.add_option("-s", "--serial", dest="serial",
179 help="use specific serial")
180 parser.add_option_group(group)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700181 self._options, self._test_args = parser.parse_args()
182
Brett Chabot49b77112009-06-02 11:46:04 -0700183 if (not self._options.only_list_tests
184 and not self._options.all_tests
185 and not self._options.continuous_tests
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800186 and not self._options.suite
Brett Chabot59b47782009-10-21 17:23:01 -0700187 and not self._options.test_path
Brett Chabot49b77112009-06-02 11:46:04 -0700188 and len(self._test_args) < 1):
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700189 parser.print_help()
190 logger.SilentLog("at least one test name must be specified")
191 raise errors.AbortError
192
193 self._adb = adb_interface.AdbInterface()
194 if self._options.emulator:
195 self._adb.SetEmulatorTarget()
196 elif self._options.device:
197 self._adb.SetDeviceTarget()
198 elif self._options.serial is not None:
199 self._adb.SetTargetSerial(self._options.serial)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700200 if self._options.verbose:
201 logger.SetVerbose(True)
202
Brett Chabot8ac51182012-09-19 07:35:35 -0700203 if self._options.coverage_target_path:
204 self._options.coverage = True
205
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700206 self._known_tests = self._ReadTests()
207
Brett Chabot764d3fa2009-06-25 17:57:31 -0700208 self._options.host_lib_path = android_build.GetHostLibraryPath()
209 self._options.test_data_path = android_build.GetTestAppPath()
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700210
211 def _ReadTests(self):
212 """Parses the set of test definition data.
213
214 Returns:
215 A TestDefinitions object that contains the set of parsed tests.
216 Raises:
217 AbortError: If a fatal error occurred when parsing the tests.
218 """
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700219 try:
220 known_tests = test_defs.TestDefinitions()
Brett Chabot3c9cefc2011-06-06 20:53:56 -0700221 # only read tests when not in path mode
222 if not self._options.test_path:
223 core_test_path = os.path.join(self._root_path, self._CORE_TEST_PATH)
224 if os.path.isfile(core_test_path):
225 known_tests.Parse(core_test_path)
226 # read all <android root>/vendor/*/tests/testinfo/test_defs.xml paths
227 vendor_tests_pattern = os.path.join(self._root_path,
228 self._VENDOR_TEST_PATH)
229 test_file_paths = glob.glob(vendor_tests_pattern)
230 for test_file_path in test_file_paths:
231 known_tests.Parse(test_file_path)
232 if os.path.isfile(self._options.user_tests_file):
233 known_tests.Parse(self._options.user_tests_file)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700234 return known_tests
235 except errors.ParseError:
236 raise errors.AbortError
237
238 def _DumpTests(self):
239 """Prints out set of defined tests."""
Brett Chabotbe659c02009-09-21 17:48:26 -0700240 print "The following tests are currently defined:\n"
241 print "%-25s %-40s %s" % ("name", "build path", "description")
242 print "-" * 80
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700243 for test in self._known_tests:
Brett Chabotbe659c02009-09-21 17:48:26 -0700244 print "%-25s %-40s %s" % (test.GetName(), test.GetBuildPath(),
245 test.GetDescription())
246 print "\nSee %s for more information" % self._TEST_FILE_NAME
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700247
248 def _DoBuild(self):
249 logger.SilentLog("Building tests...")
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700250
251 tests = self._GetTestsToRun()
Brett Chabotb1eb5d22010-06-15 11:18:42 -0700252 # turn off dalvik verifier if necessary
Brett Chabot8b538bd2014-04-22 11:46:00 -0700253 # TODO: skip turning off verifier for now, since it puts device in bad
254 # state b/14088982
255 #self._TurnOffVerifier(tests)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700256 self._DoFullBuild(tests)
257
Brett Chabot8ac51182012-09-19 07:35:35 -0700258 target_tree = make_tree.MakeTree()
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800259
260 extra_args_set = []
Brett Chabot2477b382009-09-23 18:05:28 -0700261 for test_suite in tests:
Brett Chabot8ac51182012-09-19 07:35:35 -0700262 self._AddBuildTarget(test_suite, target_tree, extra_args_set)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700263
Brett Chabotccae47d2010-06-14 15:19:25 -0700264 if not self._options.preview:
265 self._adb.EnableAdbRoot()
266 else:
267 logger.Log("adb root")
Brett Chabot8ac51182012-09-19 07:35:35 -0700268
269 if not target_tree.IsEmpty():
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700270 if self._options.coverage:
Brett Chabot764d3fa2009-06-25 17:57:31 -0700271 coverage.EnableCoverageBuild()
Brett Chabot8ac51182012-09-19 07:35:35 -0700272 target_tree.AddPath("external/emma")
Brett Chabot2477b382009-09-23 18:05:28 -0700273
Brett Chabot8ac51182012-09-19 07:35:35 -0700274 target_list = target_tree.GetPrunedMakeList()
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800275 target_dir_list = [re.sub(r'Android[.]mk$', r'', i) for i in target_list]
Brett Chabot8ac51182012-09-19 07:35:35 -0700276 target_build_string = " ".join(target_list)
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800277 target_dir_build_string = " ".join(target_dir_list)
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800278 extra_args_string = " ".join(extra_args_set)
Brett Chabotb1eb5d22010-06-15 11:18:42 -0700279
Brett Chabot764d3fa2009-06-25 17:57:31 -0700280 # mmm cannot be used from python, so perform a similar operation using
Brett Chabot2b6643b2009-04-07 18:35:27 -0700281 # ONE_SHOT_MAKEFILE
Brett Chabot5f5928c2013-08-20 17:06:03 -0700282 cmd = 'ONE_SHOT_MAKEFILE="%s" make -j%s -C "%s" GET-INSTALL-PATH all_modules %s' % (
Brett Chabot2477b382009-09-23 18:05:28 -0700283 target_build_string, self._options.make_jobs, self._root_path,
284 extra_args_string)
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800285 # mmma equivalent, used when regular mmm fails
286 alt_cmd = 'make -j%s -C "%s" -f build/core/main.mk %s all_modules BUILD_MODULES_IN_PATHS="%s"' % (
287 self._options.make_jobs, self._root_path, extra_args_string, target_dir_build_string)
288
Brett Chabot764d3fa2009-06-25 17:57:31 -0700289 logger.Log(cmd)
Brett Chabot74541712012-08-31 18:39:00 -0700290 if not self._options.preview:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800291 run_command.SetAbortOnError()
292 try:
293 output = run_command.RunCommand(cmd, return_output=True, timeout_time=600)
294 ## Chances are this failed because it didn't build the dependencies
295 except errors.AbortError:
296 logger.Log("make failed. Trying to rebuild all dependencies.")
297 logger.Log("mmma -j%s %s" %(self._options.make_jobs, target_dir_build_string))
298 # Try again with mma equivalent, which will build the dependencies
299 run_command.RunCommand(alt_cmd, return_output=False, timeout_time=600)
300 # Run mmm again to get the install paths only
301 output = run_command.RunCommand(cmd, return_output=True, timeout_time=600)
302 run_command.SetAbortOnError(False)
Brett Chabot5f5928c2013-08-20 17:06:03 -0700303 logger.SilentLog(output)
Brett Chabot74541712012-08-31 18:39:00 -0700304 self._DoInstall(output)
Niko Cataniaa6dc2ab2009-04-03 14:12:46 -0700305
Brett Chabot74541712012-08-31 18:39:00 -0700306 def _DoInstall(self, make_output):
307 """Install artifacts from build onto device.
308
309 Looks for 'install:' text from make output to find artifacts to install.
310
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800311 Files with the .apk extension get 'adb install'ed, all other files
312 get 'adb push'ed onto the device.
313
Brett Chabot74541712012-08-31 18:39:00 -0700314 Args:
315 make_output: stdout from make command
316 """
317 for line in make_output.split("\n"):
318 m = self._RE_MAKE_INSTALL.match(line)
319 if m:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800320 # strip the 'INSTALL: <name>' from the left hand side
321 # the remaining string is a space-separated list of build-generated files
322 install_paths = m.group(2)
323 for install_path in re.split(r'\s+', install_paths):
324 if install_path.endswith(".apk"):
325 abs_install_path = os.path.join(self._root_path, install_path)
326 logger.Log("adb install -r %s" % abs_install_path)
327 logger.Log(self._adb.Install(abs_install_path))
328 else:
329 self._PushInstallFileToDevice(install_path)
Brett Chabot74541712012-08-31 18:39:00 -0700330
331 def _PushInstallFileToDevice(self, install_path):
JP Abgrallf38107c2013-07-11 17:39:16 -0700332 m = self._re_make_install_path.match(install_path)
Brett Chabot74541712012-08-31 18:39:00 -0700333 if m:
334 remote_path = m.group(1)
Brett Chabote607d3a2013-05-16 23:00:43 -0700335 remote_dir = os.path.dirname(remote_path)
336 logger.Log("adb shell mkdir -p %s" % remote_dir)
337 self._adb.SendShellCommand("mkdir -p %s" % remote_dir)
Brett Chabot74541712012-08-31 18:39:00 -0700338 abs_install_path = os.path.join(self._root_path, install_path)
Brett Chabot81c475e2012-09-11 12:57:31 -0700339 logger.Log("adb push %s %s" % (abs_install_path, remote_path))
Brett Chabot74541712012-08-31 18:39:00 -0700340 self._adb.Push(abs_install_path, remote_path)
341 else:
342 logger.Log("Error: Failed to recognize path of file to install %s" % install_path)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700343
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700344 def _DoFullBuild(self, tests):
345 """If necessary, run a full 'make' command for the tests that need it."""
346 extra_args_set = Set()
347
348 # hack to build cts dependencies
349 # TODO: remove this when cts dependencies are removed
Brett Chabot5f5928c2013-08-20 17:06:03 -0700350 is_cts = self._IsCtsTests(tests)
351 if is_cts:
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700352 # need to use make since these fail building with ONE_SHOT_MAKEFILE
353 extra_args_set.add('CtsTestStubs')
354 extra_args_set.add('android.core.tests.runner')
355 for test in tests:
356 if test.IsFullMake():
357 if test.GetExtraBuildArgs():
358 # extra args contains the args to pass to 'make'
359 extra_args_set.add(test.GetExtraBuildArgs())
360 else:
361 logger.Log("Warning: test %s needs a full build but does not specify"
362 " extra_build_args" % test.GetName())
363
364 # check if there is actually any tests that required a full build
365 if extra_args_set:
366 cmd = ('make -j%s %s' % (self._options.make_jobs,
367 ' '.join(list(extra_args_set))))
368 logger.Log(cmd)
369 if not self._options.preview:
370 old_dir = os.getcwd()
371 os.chdir(self._root_path)
Brett Chabotb0b8c782012-09-19 08:32:56 -0700372 output = run_command.RunCommand(cmd, return_output=True)
Brett Chabot5f5928c2013-08-20 17:06:03 -0700373 logger.SilentLog(output)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700374 os.chdir(old_dir)
Brett Chabot74541712012-08-31 18:39:00 -0700375 self._DoInstall(output)
Brett Chabot5f5928c2013-08-20 17:06:03 -0700376 if is_cts:
377 # hack! hardcode install of CtsTestStubs
378 out = android_build.GetTestAppPath()
379 abs_install_path = os.path.join(out, "CtsTestStubs.apk")
380 logger.Log("adb install -r %s" % abs_install_path)
381 logger.Log(self._adb.Install(abs_install_path))
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700382
Brett Chabot8ac51182012-09-19 07:35:35 -0700383 def _AddBuildTarget(self, test_suite, target_tree, extra_args_set):
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700384 if not test_suite.IsFullMake():
385 build_dir = test_suite.GetBuildPath()
Brett Chabot8ac51182012-09-19 07:35:35 -0700386 if self._AddBuildTargetPath(build_dir, target_tree):
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800387 extra_args_set.append(test_suite.GetExtraBuildArgs())
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700388 for path in test_suite.GetBuildDependencies(self._options):
Brett Chabot8ac51182012-09-19 07:35:35 -0700389 self._AddBuildTargetPath(path, target_tree)
Brett Chabot2b6643b2009-04-07 18:35:27 -0700390
Brett Chabot8ac51182012-09-19 07:35:35 -0700391 def _AddBuildTargetPath(self, build_dir, target_tree):
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700392 if build_dir is not None:
Brett Chabot8ac51182012-09-19 07:35:35 -0700393 target_tree.AddPath(build_dir)
394 return True
Brett Chabot2b6643b2009-04-07 18:35:27 -0700395 return False
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700396
397 def _GetTestsToRun(self):
398 """Get a list of TestSuite objects to run, based on command line args."""
Brett Chabot59b47782009-10-21 17:23:01 -0700399 if self._tests_to_run:
400 return self._tests_to_run
401
402 self._tests_to_run = []
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700403 if self._options.all_tests:
Brett Chabot59b47782009-10-21 17:23:01 -0700404 self._tests_to_run = self._known_tests.GetTests()
Brett Chabot49b77112009-06-02 11:46:04 -0700405 elif self._options.continuous_tests:
Brett Chabot59b47782009-10-21 17:23:01 -0700406 self._tests_to_run = self._known_tests.GetContinuousTests()
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800407 elif self._options.suite:
408 self._tests_to_run = \
409 self._known_tests.GetTestsInSuite(self._options.suite)
Brett Chabot59b47782009-10-21 17:23:01 -0700410 elif self._options.test_path:
411 walker = test_walker.TestWalker()
412 self._tests_to_run = walker.FindTests(self._options.test_path)
413
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700414 for name in self._test_args:
415 test = self._known_tests.GetTest(name)
416 if test is None:
417 logger.Log("Error: Could not find test %s" % name)
418 self._DumpTests()
419 raise errors.AbortError
Brett Chabot59b47782009-10-21 17:23:01 -0700420 self._tests_to_run.append(test)
421 return self._tests_to_run
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700422
Brett Chabot2477b382009-09-23 18:05:28 -0700423 def _IsCtsTests(self, test_list):
424 """Check if any cts tests are included in given list of tests to run."""
425 for test in test_list:
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800426 if test.GetSuite() == 'cts':
Brett Chabot2477b382009-09-23 18:05:28 -0700427 return True
428 return False
429
Brett Chabotccae47d2010-06-14 15:19:25 -0700430 def _TurnOffVerifier(self, test_list):
431 """Turn off the dalvik verifier if needed by given tests.
432
433 If one or more tests needs dalvik verifier off, and it is not already off,
434 turns off verifier and reboots device to allow change to take effect.
435 """
Brett Chabot74541712012-08-31 18:39:00 -0700436 # hack to check if these are frameworks/base tests. If so, turn off verifier
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800437 # to allow framework tests to access private/protected/package-private framework api
Brett Chabotccae47d2010-06-14 15:19:25 -0700438 framework_test = False
439 for test in test_list:
440 if os.path.commonprefix([test.GetBuildPath(), "frameworks/base"]):
441 framework_test = True
442 if framework_test:
443 # check if verifier is off already - to avoid the reboot if not
444 # necessary
445 output = self._adb.SendShellCommand("cat /data/local.prop")
446 if not self._DALVIK_VERIFIER_OFF_PROP in output:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800447
448 # Read the existing dalvik verifier flags.
449 old_prop_value = self._adb.SendShellCommand("getprop %s" \
450 %(self._DALVIK_VERIFIER_PROP))
451 old_prop_value = old_prop_value.strip() if old_prop_value else ""
452
453 # Append our verifier flags to existing flags
454 new_prop_value = "%s %s" %(self._DALVIK_VERIFIER_OFF_VALUE, old_prop_value)
455
456 # Update property now, as /data/local.prop is not read until reboot
457 logger.Log("adb shell setprop %s '%s'" \
458 %(self._DALVIK_VERIFIER_PROP, new_prop_value))
459 if not self._options.preview:
460 self._adb.SendShellCommand("setprop %s '%s'" \
461 %(self._DALVIK_VERIFIER_PROP, new_prop_value))
462
463 # Write prop to /data/local.prop
464 # Every time device is booted, it will pick up this value
465 new_prop_assignment = "%s = %s" %(self._DALVIK_VERIFIER_PROP, new_prop_value)
Brett Chabotccae47d2010-06-14 15:19:25 -0700466 if self._options.preview:
467 logger.Log("adb shell \"echo %s >> /data/local.prop\""
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800468 % new_prop_assignment)
Brett Chabot25dfd792012-02-16 15:51:43 -0800469 logger.Log("adb shell chmod 644 /data/local.prop")
Brett Chabotccae47d2010-06-14 15:19:25 -0700470 else:
471 logger.Log("Turning off dalvik verifier and rebooting")
472 self._adb.SendShellCommand("\"echo %s >> /data/local.prop\""
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800473 % new_prop_assignment)
Brett Chabot25dfd792012-02-16 15:51:43 -0800474
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800475 # Reset runtime so that dalvik picks up new verifier flags from prop
476 self._ChmodRuntimeReset()
Brett Chabot25dfd792012-02-16 15:51:43 -0800477 elif not self._options.preview:
478 # check the permissions on the file
479 permout = self._adb.SendShellCommand("ls -l /data/local.prop")
480 if not "-rw-r--r--" in permout:
481 logger.Log("Fixing permissions on /data/local.prop and rebooting")
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800482 self._ChmodRuntimeReset()
Brett Chabot25dfd792012-02-16 15:51:43 -0800483
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800484 def _ChmodRuntimeReset(self):
485 """Perform a chmod of /data/local.prop and reset the runtime.
Brett Chabot25dfd792012-02-16 15:51:43 -0800486 """
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800487 logger.Log("adb shell chmod 644 /data/local.prop ## u+w,a+r")
488 if not self._options.preview:
489 self._adb.SendShellCommand("chmod 644 /data/local.prop")
490
491 self._adb.RuntimeReset(preview_only=self._options.preview)
492
493 if not self._options.preview:
494 self._adb.EnableAdbRoot()
Brett Chabot25dfd792012-02-16 15:51:43 -0800495
Brett Chabotccae47d2010-06-14 15:19:25 -0700496
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700497 def RunTests(self):
498 """Main entry method - executes the tests according to command line args."""
499 try:
500 run_command.SetAbortOnError()
501 self._ProcessOptions()
502 if self._options.only_list_tests:
503 self._DumpTests()
504 return
505
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700506 if not self._options.skip_build:
507 self._DoBuild()
508
Igor Murashkin8d703532014-01-23 16:13:29 -0800509 if self._options.build_install_only:
510 logger.Log("Skipping test execution (due to --build-install-only flag)")
511 return
512
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700513 for test_suite in self._GetTestsToRun():
Brett Chabot920e9fe2010-01-21 17:30:47 -0800514 try:
515 test_suite.Run(self._options, self._adb)
516 except errors.WaitForResponseTimedOutError:
517 logger.Log("Timed out waiting for response")
Brett Chabot764d3fa2009-06-25 17:57:31 -0700518
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700519 except KeyboardInterrupt:
520 logger.Log("Exiting...")
Brett Chabot3ae5f8a2009-06-28 12:00:47 -0700521 except errors.AbortError, error:
522 logger.Log(error.msg)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700523 logger.SilentLog("Exiting due to AbortError...")
524 except errors.WaitForResponseTimedOutError:
525 logger.Log("Timed out waiting for response")
526
527
528def RunTests():
529 runner = TestRunner()
530 runner.RunTests()
531
532if __name__ == "__main__":
533 RunTests()