Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Unified Diff: build/android/run_tests.py

Issue 10777017: Android: further simplication for test runners. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Nit on comment Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build/android/pylib/single_test_runner.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/android/run_tests.py
diff --git a/build/android/run_tests.py b/build/android/run_tests.py
index d13f7e90540370736133cda026bb2758a1dba5b5..1513aa102f8a8ee3d5e2d03874734d4569838895 100755
--- a/build/android/run_tests.py
+++ b/build/android/run_tests.py
@@ -80,25 +80,38 @@ _TEST_SUITES = ['base_unittests',
]
-def FullyQualifiedTestSuites(exe, test_suites):
- """Return a fully qualified list that represents all known suites.
+def FullyQualifiedTestSuites(exe, option_test_suite):
+ """Return a fully qualified list
Args:
exe: if True, use the executable-based test runner.
- test_suites: the source test suites to process.
+ option_test_suite: the test_suite specified as an option.
"""
# Assume the test suites are in out/Release.
test_suite_dir = os.path.abspath(os.path.join(constants.CHROME_DIR,
'out', 'Release'))
+ if option_test_suite:
+ all_test_suites = [option_test_suite]
+ else:
+ all_test_suites = _TEST_SUITES
+
if exe:
- suites = [os.path.join(test_suite_dir, t) for t in test_suites]
+ qualified_test_suites = [os.path.join(test_suite_dir, t)
+ for t in all_test_suites]
else:
# out/Release/$SUITE_apk/$SUITE-debug.apk
- suites = [os.path.join(test_suite_dir,
- t + '_apk',
- t + '-debug.apk')
- for t in test_suites]
- return suites
+ qualified_test_suites = [os.path.join(test_suite_dir,
+ t + '_apk',
+ t + '-debug.apk')
+ for t in all_test_suites]
+ for t, q in zip(all_test_suites, qualified_test_suites):
+ if not os.path.exists(q):
+ logging.critical('Test suite %s not found in %s.\n'
+ 'Supported test suites:\n %s\n'
+ 'Ensure it has been built.\n',
+ t, q, _TEST_SUITES)
+ return []
+ return qualified_test_suites
class TimeProfile(object):
@@ -175,75 +188,6 @@ def PrintAnnotationForTestResults(test_results):
print 'Step success!' # No annotation needed
-def RunTests(exe, device, test_suite, gtest_filter, test_arguments, rebaseline,
- timeout, performance_test, cleanup_test_files, tool,
- log_dump_name, fast_and_loose):
- """Runs the tests.
-
- Args:
- exe: boolean to state if we are using the exe based test runner
- device: Device to run the tests.
- test_suite: A specific test suite to run, empty to run all.
- gtest_filter: A gtest_filter flag.
- test_arguments: Additional arguments to pass to the test binary.
- rebaseline: Whether or not to run tests in isolation and update the filter.
- timeout: Timeout for each test.
- performance_test: Whether or not performance test(s).
- cleanup_test_files: Whether or not to cleanup test files on device.
- tool: Name of the Valgrind tool.
- log_dump_name: Name of log dump file.
- fast_and_loose: if set, skip copying data files.
-
- Returns:
- A TestResults object.
- """
- results = []
-
- if test_suite:
- if not os.path.exists(test_suite):
- logging.critical('Unrecognized test suite %s, supported: %s',
- test_suite, _TEST_SUITES)
- if test_suite in _TEST_SUITES:
- logging.critical('(Remember to include the path: out/Release/%s)',
- test_suite)
- test_suite_basename = os.path.basename(test_suite)
- if test_suite_basename in _TEST_SUITES:
- logging.critical('Try "make -j15 %s"', test_suite_basename)
- else:
- logging.critical('Unrecognized test suite, supported: %s',
- _TEST_SUITES)
- return TestResults.FromRun([], [BaseTestResult(test_suite, '')],
- False, False)
- fully_qualified_test_suites = [test_suite]
- else:
- fully_qualified_test_suites = FullyQualifiedTestSuites(exe, _TEST_SUITES)
- debug_info_list = []
- print 'Known suites: ' + str(_TEST_SUITES)
- print 'Running these: ' + str(fully_qualified_test_suites)
- for t in fully_qualified_test_suites:
- buildbot_report.PrintNamedStep('Test suite %s' % os.path.basename(t))
- test = SingleTestRunner(device, t, gtest_filter, test_arguments,
- timeout, rebaseline, performance_test,
- cleanup_test_files, tool, 0, not not log_dump_name,
- fast_and_loose)
- test.Run()
-
- results += [test.test_results]
- # Collect debug info.
- debug_info_list += [test.dump_debug_info]
- if rebaseline:
- test.UpdateFilter(test.test_results.failed)
- test.test_results.LogFull('Unit test', os.path.basename(t))
- # Zip all debug info outputs into a file named by log_dump_name.
- debug_info.GTestDebugInfo.ZipAndCleanResults(
- os.path.join(constants.CHROME_DIR, 'out', 'Release', 'debug_info_dumps'),
- log_dump_name, [d for d in debug_info_list if d])
-
- PrintAnnotationForTestResults(test.test_results)
-
- return TestResults.FromTestResults(results)
-
-
class TestSharder(BaseTestSharder):
"""Responsible for sharding the tests on the connected devices."""
@@ -253,7 +197,7 @@ class TestSharder(BaseTestSharder):
BaseTestSharder.__init__(self, attached_devices)
self.test_suite = test_suite
self.test_suite_basename = os.path.basename(test_suite)
- self.gtest_filter = gtest_filter
+ self.gtest_filter = gtest_filter or ''
self.test_arguments = test_arguments
self.timeout = timeout
self.rebaseline = rebaseline
@@ -266,17 +210,20 @@ class TestSharder(BaseTestSharder):
test_arguments, timeout, rebaseline,
performance_test, cleanup_test_files, tool, 0,
not not self.log_dump_name, fast_and_loose)
- # The executable/apk needs to be copied before we can call GetAllTests.
- test.test_package.StripAndCopyExecutable()
- all_tests = test.test_package.GetAllTests()
- if not rebaseline:
- disabled_list = test.GetDisabledTests()
- # Only includes tests that do not have any match in the disabled list.
- all_tests = filter(lambda t:
- not any([fnmatch.fnmatch(t, disabled_pattern)
- for disabled_pattern in disabled_list]),
- all_tests)
- self.tests = all_tests
+ self.tests = []
+ if not self.gtest_filter:
+ # No filter has been specified, let's add all tests then.
+ # The executable/apk needs to be copied before we can call GetAllTests.
+ test.test_package.StripAndCopyExecutable()
+ all_tests = test.test_package.GetAllTests()
+ if not rebaseline:
+ disabled_list = test.GetDisabledTests()
+ # Only includes tests that do not have any match in the disabled list.
+ all_tests = filter(lambda t:
+ not any([fnmatch.fnmatch(t, disabled_pattern)
+ for disabled_pattern in disabled_list]),
+ all_tests)
+ self.tests = all_tests
def CreateShardedTestRunner(self, device, index):
"""Creates a suite-specific test runner.
@@ -291,7 +238,7 @@ class TestSharder(BaseTestSharder):
device_num = len(self.attached_devices)
shard_size = (len(self.tests) + device_num - 1) / device_num
shard_test_list = self.tests[index * shard_size : (index + 1) * shard_size]
- test_filter = ':'.join(shard_test_list)
+ test_filter = ':'.join(shard_test_list) + self.gtest_filter
return SingleTestRunner(device, self.test_suite,
test_filter, self.test_arguments, self.timeout,
self.rebaseline, self.performance_test,
@@ -304,6 +251,12 @@ class TestSharder(BaseTestSharder):
PrintAnnotationForTestResults(test_results)
if test_results.failed and self.rebaseline:
test_runners[0].UpdateFilter(test_results.failed)
+ if self.log_dump_name:
+ # Zip all debug info outputs into a file named by log_dump_name.
+ debug_info.GTestDebugInfo.ZipAndCleanResults(
+ os.path.join(constants.CHROME_DIR, 'out', 'Release',
+ 'debug_info_dumps'),
+ self.log_dump_name)
def _RunATestSuite(options):
@@ -319,6 +272,7 @@ def _RunATestSuite(options):
Returns:
0 if successful, number of failing tests otherwise.
"""
+ buildbot_report.PrintNamedStep('Test suite %s' % options.test_suite)
attached_devices = []
buildbot_emulators = []
@@ -352,23 +306,16 @@ def _RunATestSuite(options):
if not ports.ResetTestServerPortAllocation():
raise Exception('Failed to reset test server port.')
- if (len(attached_devices) > 1 and options.test_suite and
- not options.gtest_filter and not options.performance_test):
- sharder = TestSharder(attached_devices, options.test_suite,
- options.gtest_filter, options.test_arguments,
- options.timeout, options.rebaseline,
- options.performance_test,
- options.cleanup_test_files, options.tool,
- options.log_dump, options.fast_and_loose)
- test_results = sharder.RunShardedTests()
- else:
- test_results = RunTests(options.exe, attached_devices[0],
- options.test_suite,
- options.gtest_filter, options.test_arguments,
- options.rebaseline, options.timeout,
- options.performance_test,
- options.cleanup_test_files, options.tool,
- options.log_dump, options.fast_and_loose)
+ if options.performance_test or options.gtest_filter:
+ # These configuration can't be split in multiple devices.
+ attached_devices = [attached_devices[0]]
+ sharder = TestSharder(attached_devices, options.test_suite,
nilesh 2012/07/17 18:14:33 We are now using TestSharder in all cases. However
+ options.gtest_filter, options.test_arguments,
+ options.timeout, options.rebaseline,
+ options.performance_test,
+ options.cleanup_test_files, options.tool,
+ options.log_dump, options.fast_and_loose)
+ test_results = sharder.RunShardedTests()
for buildbot_emulator in buildbot_emulators:
buildbot_emulator.Shutdown()
@@ -405,12 +352,7 @@ def Dispatch(options):
xvfb = Xvfb()
xvfb.Start()
- if options.test_suite:
- all_test_suites = FullyQualifiedTestSuites(options.exe,
- [options.test_suite])
- else:
- all_test_suites = FullyQualifiedTestSuites(options.exe,
- _TEST_SUITES)
+ all_test_suites = FullyQualifiedTestSuites(options.exe, options.test_suite)
failures = 0
for suite in all_test_suites:
options.test_suite = suite
@@ -447,9 +389,9 @@ def main(argv):
help='Indicator of performance test',
action='store_true')
option_parser.add_option('-L', dest='log_dump',
- help='file name of log dump, which will be put in'
- 'subfolder debug_info_dumps under the same directory'
- 'in where the test_suite exists.')
+ help='file name of log dump, which will be put in '
+ 'subfolder debug_info_dumps under the same '
+ 'directory in where the test_suite exists.')
option_parser.add_option('-e', '--emulator', dest='use_emulator',
action='store_true',
help='Run tests in a new instance of emulator')
« no previous file with comments | « build/android/pylib/single_test_runner.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698