blob: ba09d9766ddb2bb7627e8eba051c7dd9454abaeb [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
Brett Chabotccae47d2010-06-14 15:19:25 -070076 _DALVIK_VERIFIER_OFF_PROP = "dalvik.vm.dexopt-flags = v=n"
77
Brett Chabot74541712012-08-31 18:39:00 -070078 # regular expression to match install: statements in make output
79 _RE_MAKE_INSTALL = re.compile(r'Install:\s(.+)')
80
81 # regular expression to find remote device path from a file path relative
82 # to build root
83 _RE_MAKE_INSTALL_PATH = re.compile(r'out\/target\/product\/\w+\/(.+)$')
84
Brett Chabot72731f32009-03-31 11:14:05 -070085 def __init__(self):
86 # disable logging of timestamp
Niko Catania2e990b92009-04-02 16:52:26 -070087 self._root_path = android_build.GetTop()
Nicolas Catania97b24c42009-04-22 11:08:32 -070088 logger.SetTimestampLogging(False)
Brett Chabot3ae5f8a2009-06-28 12:00:47 -070089 self._adb = None
90 self._known_tests = None
91 self._options = None
92 self._test_args = None
Brett Chabot59b47782009-10-21 17:23:01 -070093 self._tests_to_run = None
Brett Chabot72731f32009-03-31 11:14:05 -070094
The Android Open Source Project6ffae012009-03-18 17:39:43 -070095 def _ProcessOptions(self):
96 """Processes command-line options."""
97 # TODO error messages on once-only or mutually-exclusive options.
98 user_test_default = os.path.join(os.environ.get("HOME"), ".android",
Brett Chabotf61f43e2009-04-02 11:52:48 -070099 self._TEST_FILE_NAME)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700100
101 parser = optparse.OptionParser(usage=self._RUNTEST_USAGE)
102
103 parser.add_option("-l", "--list-tests", dest="only_list_tests",
104 default=False, action="store_true",
105 help="To view the list of tests")
106 parser.add_option("-b", "--skip-build", dest="skip_build", default=False,
107 action="store_true", help="Skip build - just launch")
Brett Chabot2477b382009-09-23 18:05:28 -0700108 parser.add_option("-j", "--jobs", dest="make_jobs",
109 metavar="X", default=self._DEFAULT_JOBS,
110 help="Number of make jobs to use when building")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700111 parser.add_option("-n", "--skip_execute", dest="preview", default=False,
112 action="store_true",
113 help="Do not execute, just preview commands")
114 parser.add_option("-r", "--raw-mode", dest="raw_mode", default=False,
115 action="store_true",
116 help="Raw mode (for output to other tools)")
117 parser.add_option("-a", "--suite-assign", dest="suite_assign_mode",
118 default=False, action="store_true",
119 help="Suite assignment (for details & usage see "
120 "InstrumentationTestRunner)")
121 parser.add_option("-v", "--verbose", dest="verbose", default=False,
122 action="store_true",
123 help="Increase verbosity of %s" % sys.argv[0])
124 parser.add_option("-w", "--wait-for-debugger", dest="wait_for_debugger",
125 default=False, action="store_true",
126 help="Wait for debugger before launching tests")
127 parser.add_option("-c", "--test-class", dest="test_class",
128 help="Restrict test to a specific class")
129 parser.add_option("-m", "--test-method", dest="test_method",
130 help="Restrict test to a specific method")
Brett Chabot8a101cb2009-05-05 12:56:39 -0700131 parser.add_option("-p", "--test-package", dest="test_package",
132 help="Restrict test to a specific java package")
133 parser.add_option("-z", "--size", dest="test_size",
134 help="Restrict test to a specific test size")
Brett Chabotc0611542010-02-20 20:09:58 -0800135 parser.add_option("--annotation", dest="test_annotation",
136 help="Include only those tests tagged with a specific"
137 " annotation")
138 parser.add_option("--not-annotation", dest="test_not_annotation",
Brett Chabot2e16fbc2010-02-23 12:28:27 -0800139 help="Exclude any tests tagged with a specific"
Brett Chabotc0611542010-02-20 20:09:58 -0800140 " annotation")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700141 parser.add_option("-u", "--user-tests-file", dest="user_tests_file",
142 metavar="FILE", default=user_test_default,
143 help="Alternate source of user test definitions")
144 parser.add_option("-o", "--coverage", dest="coverage",
145 default=False, action="store_true",
146 help="Generate code coverage metrics for test(s)")
Brett Chabot8ac51182012-09-19 07:35:35 -0700147 parser.add_option("--coverage-target", dest="coverage_target_path",
148 default=None,
149 help="Path to app to collect code coverage target data for.")
Brett Chabot59b47782009-10-21 17:23:01 -0700150 parser.add_option("-x", "--path", dest="test_path",
151 help="Run test(s) at given file system path")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700152 parser.add_option("-t", "--all-tests", dest="all_tests",
153 default=False, action="store_true",
154 help="Run all defined tests")
155 parser.add_option("--continuous", dest="continuous_tests",
156 default=False, action="store_true",
157 help="Run all tests defined as part of the continuous "
158 "test set")
Wei-Ta Chen97752d42009-05-21 16:24:04 -0700159 parser.add_option("--timeout", dest="timeout",
160 default=300, help="Set a timeout limit (in sec) for "
161 "running native tests on a device (default: 300 secs)")
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800162 parser.add_option("--suite", dest="suite",
Brett Chabot49b77112009-06-02 11:46:04 -0700163 help="Run all tests defined as part of the "
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800164 "the given test suite")
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700165 group = optparse.OptionGroup(
166 parser, "Targets", "Use these options to direct tests to a specific "
167 "Android target")
168 group.add_option("-e", "--emulator", dest="emulator", default=False,
169 action="store_true", help="use emulator")
170 group.add_option("-d", "--device", dest="device", default=False,
171 action="store_true", help="use device")
172 group.add_option("-s", "--serial", dest="serial",
173 help="use specific serial")
174 parser.add_option_group(group)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700175 self._options, self._test_args = parser.parse_args()
176
Brett Chabot49b77112009-06-02 11:46:04 -0700177 if (not self._options.only_list_tests
178 and not self._options.all_tests
179 and not self._options.continuous_tests
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800180 and not self._options.suite
Brett Chabot59b47782009-10-21 17:23:01 -0700181 and not self._options.test_path
Brett Chabot49b77112009-06-02 11:46:04 -0700182 and len(self._test_args) < 1):
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700183 parser.print_help()
184 logger.SilentLog("at least one test name must be specified")
185 raise errors.AbortError
186
187 self._adb = adb_interface.AdbInterface()
188 if self._options.emulator:
189 self._adb.SetEmulatorTarget()
190 elif self._options.device:
191 self._adb.SetDeviceTarget()
192 elif self._options.serial is not None:
193 self._adb.SetTargetSerial(self._options.serial)
194
195 if self._options.verbose:
196 logger.SetVerbose(True)
197
Brett Chabot8ac51182012-09-19 07:35:35 -0700198 if self._options.coverage_target_path:
199 self._options.coverage = True
200
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700201 self._known_tests = self._ReadTests()
202
Brett Chabot764d3fa2009-06-25 17:57:31 -0700203 self._options.host_lib_path = android_build.GetHostLibraryPath()
204 self._options.test_data_path = android_build.GetTestAppPath()
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700205
206 def _ReadTests(self):
207 """Parses the set of test definition data.
208
209 Returns:
210 A TestDefinitions object that contains the set of parsed tests.
211 Raises:
212 AbortError: If a fatal error occurred when parsing the tests.
213 """
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700214 try:
215 known_tests = test_defs.TestDefinitions()
Brett Chabot3c9cefc2011-06-06 20:53:56 -0700216 # only read tests when not in path mode
217 if not self._options.test_path:
218 core_test_path = os.path.join(self._root_path, self._CORE_TEST_PATH)
219 if os.path.isfile(core_test_path):
220 known_tests.Parse(core_test_path)
221 # read all <android root>/vendor/*/tests/testinfo/test_defs.xml paths
222 vendor_tests_pattern = os.path.join(self._root_path,
223 self._VENDOR_TEST_PATH)
224 test_file_paths = glob.glob(vendor_tests_pattern)
225 for test_file_path in test_file_paths:
226 known_tests.Parse(test_file_path)
227 if os.path.isfile(self._options.user_tests_file):
228 known_tests.Parse(self._options.user_tests_file)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700229 return known_tests
230 except errors.ParseError:
231 raise errors.AbortError
232
233 def _DumpTests(self):
234 """Prints out set of defined tests."""
Brett Chabotbe659c02009-09-21 17:48:26 -0700235 print "The following tests are currently defined:\n"
236 print "%-25s %-40s %s" % ("name", "build path", "description")
237 print "-" * 80
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700238 for test in self._known_tests:
Brett Chabotbe659c02009-09-21 17:48:26 -0700239 print "%-25s %-40s %s" % (test.GetName(), test.GetBuildPath(),
240 test.GetDescription())
241 print "\nSee %s for more information" % self._TEST_FILE_NAME
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700242
243 def _DoBuild(self):
244 logger.SilentLog("Building tests...")
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700245
246 tests = self._GetTestsToRun()
Brett Chabotb1eb5d22010-06-15 11:18:42 -0700247 # turn off dalvik verifier if necessary
248 self._TurnOffVerifier(tests)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700249 self._DoFullBuild(tests)
250
Brett Chabot8ac51182012-09-19 07:35:35 -0700251 target_tree = make_tree.MakeTree()
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800252
253 extra_args_set = []
Brett Chabot2477b382009-09-23 18:05:28 -0700254 for test_suite in tests:
Brett Chabot8ac51182012-09-19 07:35:35 -0700255 self._AddBuildTarget(test_suite, target_tree, extra_args_set)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700256
Brett Chabotccae47d2010-06-14 15:19:25 -0700257 if not self._options.preview:
258 self._adb.EnableAdbRoot()
259 else:
260 logger.Log("adb root")
Brett Chabot8ac51182012-09-19 07:35:35 -0700261
262 if not target_tree.IsEmpty():
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700263 if self._options.coverage:
Brett Chabot764d3fa2009-06-25 17:57:31 -0700264 coverage.EnableCoverageBuild()
Brett Chabot8ac51182012-09-19 07:35:35 -0700265 target_tree.AddPath("external/emma")
Brett Chabot2477b382009-09-23 18:05:28 -0700266
Brett Chabot8ac51182012-09-19 07:35:35 -0700267 target_list = target_tree.GetPrunedMakeList()
268 target_build_string = " ".join(target_list)
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800269 extra_args_string = " ".join(extra_args_set)
Brett Chabotb1eb5d22010-06-15 11:18:42 -0700270
Brett Chabot764d3fa2009-06-25 17:57:31 -0700271 # mmm cannot be used from python, so perform a similar operation using
Brett Chabot2b6643b2009-04-07 18:35:27 -0700272 # ONE_SHOT_MAKEFILE
Brett Chabot546a3282011-06-07 19:19:30 -0700273 cmd = 'ONE_SHOT_MAKEFILE="%s" make -j%s -C "%s" all_modules %s' % (
Brett Chabot2477b382009-09-23 18:05:28 -0700274 target_build_string, self._options.make_jobs, self._root_path,
275 extra_args_string)
Brett Chabot764d3fa2009-06-25 17:57:31 -0700276 logger.Log(cmd)
Brett Chabot74541712012-08-31 18:39:00 -0700277 if not self._options.preview:
278 output = run_command.RunCommand(cmd, return_output=True, timeout_time=600)
279 self._DoInstall(output)
Niko Cataniaa6dc2ab2009-04-03 14:12:46 -0700280
Brett Chabot74541712012-08-31 18:39:00 -0700281 def _DoInstall(self, make_output):
282 """Install artifacts from build onto device.
283
284 Looks for 'install:' text from make output to find artifacts to install.
285
286 Args:
287 make_output: stdout from make command
288 """
289 for line in make_output.split("\n"):
290 m = self._RE_MAKE_INSTALL.match(line)
291 if m:
292 install_path = m.group(1)
293 if install_path.endswith(".apk"):
294 abs_install_path = os.path.join(self._root_path, install_path)
295 logger.Log("adb install -r %s" % abs_install_path)
296 logger.Log(self._adb.Install(abs_install_path))
297 else:
298 self._PushInstallFileToDevice(install_path)
299
300 def _PushInstallFileToDevice(self, install_path):
301 m = self._RE_MAKE_INSTALL_PATH.match(install_path)
302 if m:
303 remote_path = m.group(1)
Brett Chabote607d3a2013-05-16 23:00:43 -0700304 remote_dir = os.path.dirname(remote_path)
305 logger.Log("adb shell mkdir -p %s" % remote_dir)
306 self._adb.SendShellCommand("mkdir -p %s" % remote_dir)
Brett Chabot74541712012-08-31 18:39:00 -0700307 abs_install_path = os.path.join(self._root_path, install_path)
Brett Chabot81c475e2012-09-11 12:57:31 -0700308 logger.Log("adb push %s %s" % (abs_install_path, remote_path))
Brett Chabot74541712012-08-31 18:39:00 -0700309 self._adb.Push(abs_install_path, remote_path)
310 else:
311 logger.Log("Error: Failed to recognize path of file to install %s" % install_path)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700312
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700313 def _DoFullBuild(self, tests):
314 """If necessary, run a full 'make' command for the tests that need it."""
315 extra_args_set = Set()
316
317 # hack to build cts dependencies
318 # TODO: remove this when cts dependencies are removed
319 if self._IsCtsTests(tests):
320 # need to use make since these fail building with ONE_SHOT_MAKEFILE
321 extra_args_set.add('CtsTestStubs')
322 extra_args_set.add('android.core.tests.runner')
323 for test in tests:
324 if test.IsFullMake():
325 if test.GetExtraBuildArgs():
326 # extra args contains the args to pass to 'make'
327 extra_args_set.add(test.GetExtraBuildArgs())
328 else:
329 logger.Log("Warning: test %s needs a full build but does not specify"
330 " extra_build_args" % test.GetName())
331
332 # check if there is actually any tests that required a full build
333 if extra_args_set:
334 cmd = ('make -j%s %s' % (self._options.make_jobs,
335 ' '.join(list(extra_args_set))))
336 logger.Log(cmd)
337 if not self._options.preview:
338 old_dir = os.getcwd()
339 os.chdir(self._root_path)
Brett Chabotb0b8c782012-09-19 08:32:56 -0700340 output = run_command.RunCommand(cmd, return_output=True)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700341 os.chdir(old_dir)
Brett Chabot74541712012-08-31 18:39:00 -0700342 self._DoInstall(output)
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700343
Brett Chabot8ac51182012-09-19 07:35:35 -0700344 def _AddBuildTarget(self, test_suite, target_tree, extra_args_set):
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700345 if not test_suite.IsFullMake():
346 build_dir = test_suite.GetBuildPath()
Brett Chabot8ac51182012-09-19 07:35:35 -0700347 if self._AddBuildTargetPath(build_dir, target_tree):
Brian Muramatsu95cbc9e2012-01-10 12:06:12 -0800348 extra_args_set.append(test_suite.GetExtraBuildArgs())
Brett Chabot8dc9eb82010-04-15 15:43:04 -0700349 for path in test_suite.GetBuildDependencies(self._options):
Brett Chabot8ac51182012-09-19 07:35:35 -0700350 self._AddBuildTargetPath(path, target_tree)
Brett Chabot2b6643b2009-04-07 18:35:27 -0700351
Brett Chabot8ac51182012-09-19 07:35:35 -0700352 def _AddBuildTargetPath(self, build_dir, target_tree):
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700353 if build_dir is not None:
Brett Chabot8ac51182012-09-19 07:35:35 -0700354 target_tree.AddPath(build_dir)
355 return True
Brett Chabot2b6643b2009-04-07 18:35:27 -0700356 return False
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700357
358 def _GetTestsToRun(self):
359 """Get a list of TestSuite objects to run, based on command line args."""
Brett Chabot59b47782009-10-21 17:23:01 -0700360 if self._tests_to_run:
361 return self._tests_to_run
362
363 self._tests_to_run = []
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700364 if self._options.all_tests:
Brett Chabot59b47782009-10-21 17:23:01 -0700365 self._tests_to_run = self._known_tests.GetTests()
Brett Chabot49b77112009-06-02 11:46:04 -0700366 elif self._options.continuous_tests:
Brett Chabot59b47782009-10-21 17:23:01 -0700367 self._tests_to_run = self._known_tests.GetContinuousTests()
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800368 elif self._options.suite:
369 self._tests_to_run = \
370 self._known_tests.GetTestsInSuite(self._options.suite)
Brett Chabot59b47782009-10-21 17:23:01 -0700371 elif self._options.test_path:
372 walker = test_walker.TestWalker()
373 self._tests_to_run = walker.FindTests(self._options.test_path)
374
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700375 for name in self._test_args:
376 test = self._known_tests.GetTest(name)
377 if test is None:
378 logger.Log("Error: Could not find test %s" % name)
379 self._DumpTests()
380 raise errors.AbortError
Brett Chabot59b47782009-10-21 17:23:01 -0700381 self._tests_to_run.append(test)
382 return self._tests_to_run
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700383
Brett Chabot2477b382009-09-23 18:05:28 -0700384 def _IsCtsTests(self, test_list):
385 """Check if any cts tests are included in given list of tests to run."""
386 for test in test_list:
Brett Chabot4a5d9f12010-02-18 20:01:11 -0800387 if test.GetSuite() == 'cts':
Brett Chabot2477b382009-09-23 18:05:28 -0700388 return True
389 return False
390
Brett Chabotccae47d2010-06-14 15:19:25 -0700391 def _TurnOffVerifier(self, test_list):
392 """Turn off the dalvik verifier if needed by given tests.
393
394 If one or more tests needs dalvik verifier off, and it is not already off,
395 turns off verifier and reboots device to allow change to take effect.
396 """
Brett Chabot74541712012-08-31 18:39:00 -0700397 # hack to check if these are frameworks/base tests. If so, turn off verifier
Brett Chabotccae47d2010-06-14 15:19:25 -0700398 # to allow framework tests to access package-private framework api
399 framework_test = False
400 for test in test_list:
401 if os.path.commonprefix([test.GetBuildPath(), "frameworks/base"]):
402 framework_test = True
403 if framework_test:
404 # check if verifier is off already - to avoid the reboot if not
405 # necessary
406 output = self._adb.SendShellCommand("cat /data/local.prop")
407 if not self._DALVIK_VERIFIER_OFF_PROP in output:
408 if self._options.preview:
409 logger.Log("adb shell \"echo %s >> /data/local.prop\""
410 % self._DALVIK_VERIFIER_OFF_PROP)
Brett Chabot25dfd792012-02-16 15:51:43 -0800411 logger.Log("adb shell chmod 644 /data/local.prop")
Brett Chabotccae47d2010-06-14 15:19:25 -0700412 logger.Log("adb reboot")
413 logger.Log("adb wait-for-device")
414 else:
415 logger.Log("Turning off dalvik verifier and rebooting")
416 self._adb.SendShellCommand("\"echo %s >> /data/local.prop\""
417 % self._DALVIK_VERIFIER_OFF_PROP)
Brett Chabot25dfd792012-02-16 15:51:43 -0800418
419 self._ChmodReboot()
420 elif not self._options.preview:
421 # check the permissions on the file
422 permout = self._adb.SendShellCommand("ls -l /data/local.prop")
423 if not "-rw-r--r--" in permout:
424 logger.Log("Fixing permissions on /data/local.prop and rebooting")
425 self._ChmodReboot()
426
427 def _ChmodReboot(self):
428 """Perform a chmod of /data/local.prop and reboot.
429 """
430 self._adb.SendShellCommand("chmod 644 /data/local.prop")
431 self._adb.SendCommand("reboot")
432 # wait for device to go offline
433 time.sleep(10)
434 self._adb.SendCommand("wait-for-device", timeout_time=60,
435 retry_count=3)
436 self._adb.EnableAdbRoot()
437
Brett Chabotccae47d2010-06-14 15:19:25 -0700438
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700439 def RunTests(self):
440 """Main entry method - executes the tests according to command line args."""
441 try:
442 run_command.SetAbortOnError()
443 self._ProcessOptions()
444 if self._options.only_list_tests:
445 self._DumpTests()
446 return
447
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700448 if not self._options.skip_build:
449 self._DoBuild()
450
451 for test_suite in self._GetTestsToRun():
Brett Chabot920e9fe2010-01-21 17:30:47 -0800452 try:
453 test_suite.Run(self._options, self._adb)
454 except errors.WaitForResponseTimedOutError:
455 logger.Log("Timed out waiting for response")
Brett Chabot764d3fa2009-06-25 17:57:31 -0700456
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700457 except KeyboardInterrupt:
458 logger.Log("Exiting...")
Brett Chabot3ae5f8a2009-06-28 12:00:47 -0700459 except errors.AbortError, error:
460 logger.Log(error.msg)
The Android Open Source Project6ffae012009-03-18 17:39:43 -0700461 logger.SilentLog("Exiting due to AbortError...")
462 except errors.WaitForResponseTimedOutError:
463 logger.Log("Timed out waiting for response")
464
465
466def RunTests():
467 runner = TestRunner()
468 runner.RunTests()
469
470if __name__ == "__main__":
471 RunTests()