blob: af0e4d8d2ed7ecf9a14ab28af81c6c0f2a237529 [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")
117 parser.add_option("-r", "--raw-mode", dest="raw_mode", default=False,
118 action="store_true",
119 help="Raw mode (for output to other tools)")
120 parser.add_option("-a", "--suite-assign", dest="suite_assign_mode",
121 default=False, action="store_true",
122 help="Suite assignment (for details & usage see "
123 "InstrumentationTestRunner)")
124 parser.add_option("-v", "--verbose", dest="verbose", default=False,
125 action="store_true",
126 help="Increase verbosity of %s" % sys.argv[0])
127 parser.add_option("-w", "--wait-for-debugger", dest="wait_for_debugger",
128 default=False, action="store_true",
129 help="Wait for debugger before launching tests")
130 parser.add_option("-c", "--test-class", dest="test_class",
131 help="Restrict test to a specific class")
132 parser.add_option("-m", "--test-method", dest="test_method",
133 help="Restrict test to a specific method")
Brett Chabot8a101cb2009-05-05 12:56:39 -0700134 parser.add_option("-p", "--test-package", dest="test_package",
135 help="Restrict test to a specific java package")
136 parser.add_option("-z", "--size", dest="test_size",
137 help="Restrict test to a specific test size")
Brett Chabotc0611542010-02-20 20:09:58 -0800138 parser.add_option("--annotation", dest="test_annotation",
139 help="Include only those tests tagged with a specific"
140 " annotation")
141 parser.add_option("--not-annotation", dest="test_not_annotation",
Brett Chabot2e16fbc2010-02-23 12:28:27 -0800142 help="Exclude any tests tagged with a specific"
Brett Chabotc0611542010-02-20 20:09:58 -0800143 " annotation")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700144 parser.add_option("-u", "--user-tests-file", dest="user_tests_file",
145 metavar="FILE", default=user_test_default,
146 help="Alternate source of user test definitions")
147 parser.add_option("-o", "--coverage", dest="coverage",
148 default=False, action="store_true",
149 help="Generate code coverage metrics for test(s)")
Brett Chabot8ac51182012-09-19 07:35:35 -0700150 parser.add_option("--coverage-target", dest="coverage_target_path",
151 default=None,
152 help="Path to app to collect code coverage target data for.")
Brett Chabot59b47782009-10-21 17:23:01 -0700153 parser.add_option("-x", "--path", dest="test_path",
154 help="Run test(s) at given file system path")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700155 parser.add_option("-t", "--all-tests", dest="all_tests",
156 default=False, action="store_true",
157 help="Run all defined tests")
158 parser.add_option("--continuous", dest="continuous_tests",
159 default=False, action="store_true",
160 help="Run all tests defined as part of the continuous "
161 "test set")
Wei-Ta Chen97752d42009-05-21 16:24:04 -0700162 parser.add_option("--timeout", dest="timeout",
163 default=300, help="Set a timeout limit (in sec) for "
164 "running native tests on a device (default: 300 secs)")
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800165 parser.add_option("--suite", dest="suite",
Brett Chabot49b77112009-06-02 11:46:04 -0700166 help="Run all tests defined as part of the "
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800167 "the given test suite")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700168 group = optparse.OptionGroup(
169 parser, "Targets", "Use these options to direct tests to a specific "
170 "Android target")
171 group.add_option("-e", "--emulator", dest="emulator", default=False,
172 action="store_true", help="use emulator")
173 group.add_option("-d", "--device", dest="device", default=False,
174 action="store_true", help="use device")
175 group.add_option("-s", "--serial", dest="serial",
176 help="use specific serial")
177 parser.add_option_group(group)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700178 self._options, self._test_args = parser.parse_args()
179
Brett Chabot49b77112009-06-02 11:46:04 -0700180 if (not self._options.only_list_tests
181 and not self._options.all_tests
182 and not self._options.continuous_tests
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800183 and not self._options.suite
Brett Chabot59b47782009-10-21 17:23:01 -0700184 and not self._options.test_path
Brett Chabot49b77112009-06-02 11:46:04 -0700185 and len(self._test_args) < 1):
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700186 parser.print_help()
187 logger.SilentLog("at least one test name must be specified")
188 raise errors.AbortError
189
190 self._adb = adb_interface.AdbInterface()
191 if self._options.emulator:
192 self._adb.SetEmulatorTarget()
193 elif self._options.device:
194 self._adb.SetDeviceTarget()
195 elif self._options.serial is not None:
196 self._adb.SetTargetSerial(self._options.serial)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700197 if self._options.verbose:
198 logger.SetVerbose(True)
199
Brett Chabot8ac51182012-09-19 07:35:35 -0700200 if self._options.coverage_target_path:
201 self._options.coverage = True
202
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700203 self._known_tests = self._ReadTests()
204
Brett Chabot764d3fa2009-06-25 17:57:31 -0700205 self._options.host_lib_path = android_build.GetHostLibraryPath()
206 self._options.test_data_path = android_build.GetTestAppPath()
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700207
208 def _ReadTests(self):
209 """Parses the set of test definition data.
210
211 Returns:
212 A TestDefinitions object that contains the set of parsed tests.
213 Raises:
214 AbortError: If a fatal error occurred when parsing the tests.
215 """
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700216 try:
217 known_tests = test_defs.TestDefinitions()
Brett Chabot3c9cefc2011-06-06 20:53:56 -0700218 # only read tests when not in path mode
219 if not self._options.test_path:
220 core_test_path = os.path.join(self._root_path, self._CORE_TEST_PATH)
221 if os.path.isfile(core_test_path):
222 known_tests.Parse(core_test_path)
223 # read all <android root>/vendor/*/tests/testinfo/test_defs.xml paths
224 vendor_tests_pattern = os.path.join(self._root_path,
225 self._VENDOR_TEST_PATH)
226 test_file_paths = glob.glob(vendor_tests_pattern)
227 for test_file_path in test_file_paths:
228 known_tests.Parse(test_file_path)
229 if os.path.isfile(self._options.user_tests_file):
230 known_tests.Parse(self._options.user_tests_file)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700231 return known_tests
232 except errors.ParseError:
233 raise errors.AbortError
234
235 def _DumpTests(self):
236 """Prints out set of defined tests."""
Brett Chabotbe659c02009-09-21 17:48:26 -0700237 print "The following tests are currently defined:\n"
238 print "%-25s %-40s %s" % ("name", "build path", "description")
239 print "-" * 80
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700240 for test in self._known_tests:
Brett Chabotbe659c02009-09-21 17:48:26 -0700241 print "%-25s %-40s %s" % (test.GetName(), test.GetBuildPath(),
242 test.GetDescription())
243 print "\nSee %s for more information" % self._TEST_FILE_NAME
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700244
245 def _DoBuild(self):
246 logger.SilentLog("Building tests...")
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700247
248 tests = self._GetTestsToRun()
Brett Chabotb1eb5d22010-06-15 11:18:42 -0700249 # turn off dalvik verifier if necessary
250 self._TurnOffVerifier(tests)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700251 self._DoFullBuild(tests)
252
Brett Chabot8ac51182012-09-19 07:35:35 -0700253 target_tree = make_tree.MakeTree()
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800254
255 extra_args_set = []
Brett Chabot2477b382009-09-23 18:05:28 -0700256 for test_suite in tests:
Brett Chabot8ac51182012-09-19 07:35:35 -0700257 self._AddBuildTarget(test_suite, target_tree, extra_args_set)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700258
Brett Chabotccae47d2010-06-14 15:19:25 -0700259 if not self._options.preview:
260 self._adb.EnableAdbRoot()
261 else:
262 logger.Log("adb root")
Brett Chabot8ac51182012-09-19 07:35:35 -0700263
264 if not target_tree.IsEmpty():
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700265 if self._options.coverage:
Brett Chabot764d3fa2009-06-25 17:57:31 -0700266 coverage.EnableCoverageBuild()
Brett Chabot8ac51182012-09-19 07:35:35 -0700267 target_tree.AddPath("external/emma")
Brett Chabot2477b382009-09-23 18:05:28 -0700268
Brett Chabot8ac51182012-09-19 07:35:35 -0700269 target_list = target_tree.GetPrunedMakeList()
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800270 target_dir_list = [re.sub(r'Android[.]mk$', r'', i) for i in target_list]
Brett Chabot8ac51182012-09-19 07:35:35 -0700271 target_build_string = " ".join(target_list)
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800272 target_dir_build_string = " ".join(target_dir_list)
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800273 extra_args_string = " ".join(extra_args_set)
Brett Chabotb1eb5d22010-06-15 11:18:42 -0700274
Brett Chabot764d3fa2009-06-25 17:57:31 -0700275 # mmm cannot be used from python, so perform a similar operation using
Brett Chabot2b6643b2009-04-07 18:35:27 -0700276 # ONE_SHOT_MAKEFILE
Brett Chabot5f5928c2013-08-20 17:06:03 -0700277 cmd = 'ONE_SHOT_MAKEFILE="%s" make -j%s -C "%s" GET-INSTALL-PATH all_modules %s' % (
Brett Chabot2477b382009-09-23 18:05:28 -0700278 target_build_string, self._options.make_jobs, self._root_path,
279 extra_args_string)
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800280 # mmma equivalent, used when regular mmm fails
281 alt_cmd = 'make -j%s -C "%s" -f build/core/main.mk %s all_modules BUILD_MODULES_IN_PATHS="%s"' % (
282 self._options.make_jobs, self._root_path, extra_args_string, target_dir_build_string)
283
Brett Chabot764d3fa2009-06-25 17:57:31 -0700284 logger.Log(cmd)
Brett Chabot74541712012-08-31 18:39:00 -0700285 if not self._options.preview:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800286 run_command.SetAbortOnError()
287 try:
288 output = run_command.RunCommand(cmd, return_output=True, timeout_time=600)
289 ## Chances are this failed because it didn't build the dependencies
290 except errors.AbortError:
291 logger.Log("make failed. Trying to rebuild all dependencies.")
292 logger.Log("mmma -j%s %s" %(self._options.make_jobs, target_dir_build_string))
293 # Try again with mma equivalent, which will build the dependencies
294 run_command.RunCommand(alt_cmd, return_output=False, timeout_time=600)
295 # Run mmm again to get the install paths only
296 output = run_command.RunCommand(cmd, return_output=True, timeout_time=600)
297 run_command.SetAbortOnError(False)
Brett Chabot5f5928c2013-08-20 17:06:03 -0700298 logger.SilentLog(output)
Brett Chabot74541712012-08-31 18:39:00 -0700299 self._DoInstall(output)
Niko Cataniaa6dc2ab2009-04-03 14:12:46 -0700300
Brett Chabot74541712012-08-31 18:39:00 -0700301 def _DoInstall(self, make_output):
302 """Install artifacts from build onto device.
303
304 Looks for 'install:' text from make output to find artifacts to install.
305
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800306 Files with the .apk extension get 'adb install'ed, all other files
307 get 'adb push'ed onto the device.
308
Brett Chabot74541712012-08-31 18:39:00 -0700309 Args:
310 make_output: stdout from make command
311 """
312 for line in make_output.split("\n"):
313 m = self._RE_MAKE_INSTALL.match(line)
314 if m:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800315 # strip the 'INSTALL: <name>' from the left hand side
316 # the remaining string is a space-separated list of build-generated files
317 install_paths = m.group(2)
318 for install_path in re.split(r'\s+', install_paths):
319 if install_path.endswith(".apk"):
320 abs_install_path = os.path.join(self._root_path, install_path)
321 logger.Log("adb install -r %s" % abs_install_path)
322 logger.Log(self._adb.Install(abs_install_path))
323 else:
324 self._PushInstallFileToDevice(install_path)
Brett Chabot74541712012-08-31 18:39:00 -0700325
326 def _PushInstallFileToDevice(self, install_path):
JP Abgrallf38107c2013-07-11 17:39:16 -0700327 m = self._re_make_install_path.match(install_path)
Brett Chabot74541712012-08-31 18:39:00 -0700328 if m:
329 remote_path = m.group(1)
Brett Chabote607d3a2013-05-16 23:00:43 -0700330 remote_dir = os.path.dirname(remote_path)
331 logger.Log("adb shell mkdir -p %s" % remote_dir)
332 self._adb.SendShellCommand("mkdir -p %s" % remote_dir)
Brett Chabot74541712012-08-31 18:39:00 -0700333 abs_install_path = os.path.join(self._root_path, install_path)
Brett Chabot81c475e2012-09-11 12:57:31 -0700334 logger.Log("adb push %s %s" % (abs_install_path, remote_path))
Brett Chabot74541712012-08-31 18:39:00 -0700335 self._adb.Push(abs_install_path, remote_path)
336 else:
337 logger.Log("Error: Failed to recognize path of file to install %s" % install_path)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700338
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700339 def _DoFullBuild(self, tests):
340 """If necessary, run a full 'make' command for the tests that need it."""
341 extra_args_set = Set()
342
343 # hack to build cts dependencies
344 # TODO: remove this when cts dependencies are removed
Brett Chabot5f5928c2013-08-20 17:06:03 -0700345 is_cts = self._IsCtsTests(tests)
346 if is_cts:
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700347 # need to use make since these fail building with ONE_SHOT_MAKEFILE
348 extra_args_set.add('CtsTestStubs')
349 extra_args_set.add('android.core.tests.runner')
350 for test in tests:
351 if test.IsFullMake():
352 if test.GetExtraBuildArgs():
353 # extra args contains the args to pass to 'make'
354 extra_args_set.add(test.GetExtraBuildArgs())
355 else:
356 logger.Log("Warning: test %s needs a full build but does not specify"
357 " extra_build_args" % test.GetName())
358
359 # check if there is actually any tests that required a full build
360 if extra_args_set:
361 cmd = ('make -j%s %s' % (self._options.make_jobs,
362 ' '.join(list(extra_args_set))))
363 logger.Log(cmd)
364 if not self._options.preview:
365 old_dir = os.getcwd()
366 os.chdir(self._root_path)
Brett Chabotb0b8c782012-09-19 08:32:56 -0700367 output = run_command.RunCommand(cmd, return_output=True)
Brett Chabot5f5928c2013-08-20 17:06:03 -0700368 logger.SilentLog(output)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700369 os.chdir(old_dir)
Brett Chabot74541712012-08-31 18:39:00 -0700370 self._DoInstall(output)
Brett Chabot5f5928c2013-08-20 17:06:03 -0700371 if is_cts:
372 # hack! hardcode install of CtsTestStubs
373 out = android_build.GetTestAppPath()
374 abs_install_path = os.path.join(out, "CtsTestStubs.apk")
375 logger.Log("adb install -r %s" % abs_install_path)
376 logger.Log(self._adb.Install(abs_install_path))
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700377
Brett Chabot8ac51182012-09-19 07:35:35 -0700378 def _AddBuildTarget(self, test_suite, target_tree, extra_args_set):
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700379 if not test_suite.IsFullMake():
380 build_dir = test_suite.GetBuildPath()
Brett Chabot8ac51182012-09-19 07:35:35 -0700381 if self._AddBuildTargetPath(build_dir, target_tree):
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800382 extra_args_set.append(test_suite.GetExtraBuildArgs())
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700383 for path in test_suite.GetBuildDependencies(self._options):
Brett Chabot8ac51182012-09-19 07:35:35 -0700384 self._AddBuildTargetPath(path, target_tree)
Brett Chabot2b6643b2009-04-07 18:35:27 -0700385
Brett Chabot8ac51182012-09-19 07:35:35 -0700386 def _AddBuildTargetPath(self, build_dir, target_tree):
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700387 if build_dir is not None:
Brett Chabot8ac51182012-09-19 07:35:35 -0700388 target_tree.AddPath(build_dir)
389 return True
Brett Chabot2b6643b2009-04-07 18:35:27 -0700390 return False
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700391
392 def _GetTestsToRun(self):
393 """Get a list of TestSuite objects to run, based on command line args."""
Brett Chabot59b47782009-10-21 17:23:01 -0700394 if self._tests_to_run:
395 return self._tests_to_run
396
397 self._tests_to_run = []
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700398 if self._options.all_tests:
Brett Chabot59b47782009-10-21 17:23:01 -0700399 self._tests_to_run = self._known_tests.GetTests()
Brett Chabot49b77112009-06-02 11:46:04 -0700400 elif self._options.continuous_tests:
Brett Chabot59b47782009-10-21 17:23:01 -0700401 self._tests_to_run = self._known_tests.GetContinuousTests()
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800402 elif self._options.suite:
403 self._tests_to_run = \
404 self._known_tests.GetTestsInSuite(self._options.suite)
Brett Chabot59b47782009-10-21 17:23:01 -0700405 elif self._options.test_path:
406 walker = test_walker.TestWalker()
407 self._tests_to_run = walker.FindTests(self._options.test_path)
408
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700409 for name in self._test_args:
410 test = self._known_tests.GetTest(name)
411 if test is None:
412 logger.Log("Error: Could not find test %s" % name)
413 self._DumpTests()
414 raise errors.AbortError
Brett Chabot59b47782009-10-21 17:23:01 -0700415 self._tests_to_run.append(test)
416 return self._tests_to_run
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700417
Brett Chabot2477b382009-09-23 18:05:28 -0700418 def _IsCtsTests(self, test_list):
419 """Check if any cts tests are included in given list of tests to run."""
420 for test in test_list:
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800421 if test.GetSuite() == 'cts':
Brett Chabot2477b382009-09-23 18:05:28 -0700422 return True
423 return False
424
Brett Chabotccae47d2010-06-14 15:19:25 -0700425 def _TurnOffVerifier(self, test_list):
426 """Turn off the dalvik verifier if needed by given tests.
427
428 If one or more tests needs dalvik verifier off, and it is not already off,
429 turns off verifier and reboots device to allow change to take effect.
430 """
Brett Chabot74541712012-08-31 18:39:00 -0700431 # hack to check if these are frameworks/base tests. If so, turn off verifier
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800432 # to allow framework tests to access private/protected/package-private framework api
Brett Chabotccae47d2010-06-14 15:19:25 -0700433 framework_test = False
434 for test in test_list:
435 if os.path.commonprefix([test.GetBuildPath(), "frameworks/base"]):
436 framework_test = True
437 if framework_test:
438 # check if verifier is off already - to avoid the reboot if not
439 # necessary
440 output = self._adb.SendShellCommand("cat /data/local.prop")
441 if not self._DALVIK_VERIFIER_OFF_PROP in output:
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800442
443 # Read the existing dalvik verifier flags.
444 old_prop_value = self._adb.SendShellCommand("getprop %s" \
445 %(self._DALVIK_VERIFIER_PROP))
446 old_prop_value = old_prop_value.strip() if old_prop_value else ""
447
448 # Append our verifier flags to existing flags
449 new_prop_value = "%s %s" %(self._DALVIK_VERIFIER_OFF_VALUE, old_prop_value)
450
451 # Update property now, as /data/local.prop is not read until reboot
452 logger.Log("adb shell setprop %s '%s'" \
453 %(self._DALVIK_VERIFIER_PROP, new_prop_value))
454 if not self._options.preview:
455 self._adb.SendShellCommand("setprop %s '%s'" \
456 %(self._DALVIK_VERIFIER_PROP, new_prop_value))
457
458 # Write prop to /data/local.prop
459 # Every time device is booted, it will pick up this value
460 new_prop_assignment = "%s = %s" %(self._DALVIK_VERIFIER_PROP, new_prop_value)
Brett Chabotccae47d2010-06-14 15:19:25 -0700461 if self._options.preview:
462 logger.Log("adb shell \"echo %s >> /data/local.prop\""
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800463 % new_prop_assignment)
Brett Chabot25dfd792012-02-16 15:51:43 -0800464 logger.Log("adb shell chmod 644 /data/local.prop")
Brett Chabotccae47d2010-06-14 15:19:25 -0700465 else:
466 logger.Log("Turning off dalvik verifier and rebooting")
467 self._adb.SendShellCommand("\"echo %s >> /data/local.prop\""
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800468 % new_prop_assignment)
Brett Chabot25dfd792012-02-16 15:51:43 -0800469
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800470 # Reset runtime so that dalvik picks up new verifier flags from prop
471 self._ChmodRuntimeReset()
Brett Chabot25dfd792012-02-16 15:51:43 -0800472 elif not self._options.preview:
473 # check the permissions on the file
474 permout = self._adb.SendShellCommand("ls -l /data/local.prop")
475 if not "-rw-r--r--" in permout:
476 logger.Log("Fixing permissions on /data/local.prop and rebooting")
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800477 self._ChmodRuntimeReset()
Brett Chabot25dfd792012-02-16 15:51:43 -0800478
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800479 def _ChmodRuntimeReset(self):
480 """Perform a chmod of /data/local.prop and reset the runtime.
Brett Chabot25dfd792012-02-16 15:51:43 -0800481 """
Igor Murashkina0afc8c2014-01-22 16:22:50 -0800482 logger.Log("adb shell chmod 644 /data/local.prop ## u+w,a+r")
483 if not self._options.preview:
484 self._adb.SendShellCommand("chmod 644 /data/local.prop")
485
486 self._adb.RuntimeReset(preview_only=self._options.preview)
487
488 if not self._options.preview:
489 self._adb.EnableAdbRoot()
Brett Chabot25dfd792012-02-16 15:51:43 -0800490
Brett Chabotccae47d2010-06-14 15:19:25 -0700491
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700492 def RunTests(self):
493 """Main entry method - executes the tests according to command line args."""
494 try:
495 run_command.SetAbortOnError()
496 self._ProcessOptions()
497 if self._options.only_list_tests:
498 self._DumpTests()
499 return
500
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700501 if not self._options.skip_build:
502 self._DoBuild()
503
504 for test_suite in self._GetTestsToRun():
Brett Chabot920e9fe2010-01-21 17:30:47 -0800505 try:
506 test_suite.Run(self._options, self._adb)
507 except errors.WaitForResponseTimedOutError:
508 logger.Log("Timed out waiting for response")
Brett Chabot764d3fa2009-06-25 17:57:31 -0700509
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700510 except KeyboardInterrupt:
511 logger.Log("Exiting...")
Brett Chabot3ae5f8a2009-06-28 12:00:47 -0700512 except errors.AbortError, error:
513 logger.Log(error.msg)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700514 logger.SilentLog("Exiting due to AbortError...")
515 except errors.WaitForResponseTimedOutError:
516 logger.Log("Timed out waiting for response")
517
518
519def RunTests():
520 runner = TestRunner()
521 runner.RunTests()
522
523if __name__ == "__main__":
524 RunTests()