summaryrefslogtreecommitdiffstats
path: root/media/webrtc/trunk/build/android/pylib/single_test_runner.py
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /media/webrtc/trunk/build/android/pylib/single_test_runner.py
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'media/webrtc/trunk/build/android/pylib/single_test_runner.py')
-rw-r--r--media/webrtc/trunk/build/android/pylib/single_test_runner.py343
1 files changed, 343 insertions, 0 deletions
diff --git a/media/webrtc/trunk/build/android/pylib/single_test_runner.py b/media/webrtc/trunk/build/android/pylib/single_test_runner.py
new file mode 100644
index 000000000..a680c68f1
--- /dev/null
+++ b/media/webrtc/trunk/build/android/pylib/single_test_runner.py
@@ -0,0 +1,343 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import glob
+import logging
+import os
+import sys
+
+from base_test_runner import BaseTestRunner
+import debug_info
+import constants
+import perf_tests_helper
+import run_tests_helper
+from test_package_apk import TestPackageApk
+from test_package_executable import TestPackageExecutable
+from test_result import TestResults
+
+
+class SingleTestRunner(BaseTestRunner):
+ """Single test suite attached to a single device.
+
+ Args:
+ 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.
+ timeout: Timeout for each test.
+ rebaseline: Whether or not to run tests in isolation and update the filter.
+ 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.
+ shard_index: index number of the shard on which the test suite will run.
+ dump_debug_info: Whether or not to dump debug information.
+ build_type: 'Release' or 'Debug'.
+ """
+
+ def __init__(self, device, test_suite, gtest_filter, test_arguments, timeout,
+ rebaseline, performance_test, cleanup_test_files, tool_name,
+ shard_index, dump_debug_info, fast_and_loose, build_type):
+ BaseTestRunner.__init__(self, device, tool_name, shard_index, build_type)
+ self._running_on_emulator = self.device.startswith('emulator')
+ self._gtest_filter = gtest_filter
+ self._test_arguments = test_arguments
+ self.test_results = TestResults()
+ if dump_debug_info:
+ self.dump_debug_info = debug_info.GTestDebugInfo(self.adb, device,
+ os.path.basename(test_suite), gtest_filter)
+ else:
+ self.dump_debug_info = None
+ self.fast_and_loose = fast_and_loose
+
+ logging.warning('Test suite: ' + test_suite)
+ if os.path.splitext(test_suite)[1] == '.apk':
+ self.test_package = TestPackageApk(self.adb, device,
+ test_suite, timeout, rebaseline, performance_test, cleanup_test_files,
+ self.tool, self.dump_debug_info)
+ else:
+ self.test_package = TestPackageExecutable(
+ self.adb, device,
+ test_suite, timeout, rebaseline, performance_test, cleanup_test_files,
+ self.tool, self.dump_debug_info)
+ self._performance_test_setup = None
+ if performance_test:
+ self._performance_test_setup = perf_tests_helper.PerfTestSetup(self.adb)
+
+ def _TestSuiteRequiresMockTestServer(self):
+ """Returns True if the test suite requires mock test server."""
+ return False
+ # TODO(yfriedman): Disabled because of flakiness.
+ # (self.test_package.test_suite_basename == 'unit_tests' or
+ # self.test_package.test_suite_basename == 'net_unittests' or
+ # False)
+
+ def _GetFilterFileName(self):
+ """Returns the filename of gtest filter."""
+ return os.path.join(sys.path[0], 'gtest_filter',
+ self.test_package.test_suite_basename + '_disabled')
+
+ def _GetAdditionalEmulatorFilterName(self):
+ """Returns the filename of additional gtest filter for emulator."""
+ return os.path.join(sys.path[0], 'gtest_filter',
+ self.test_package.test_suite_basename +
+ '_emulator_additional_disabled')
+
+ def GetDisabledTests(self):
+ """Returns a list of disabled tests.
+
+ Returns:
+ A list of disabled tests obtained from gtest_filter/test_suite_disabled.
+ """
+ disabled_tests = run_tests_helper.GetExpectations(self._GetFilterFileName())
+ if self._running_on_emulator:
+ # Append emulator's filter file.
+ disabled_tests.extend(run_tests_helper.GetExpectations(
+ self._GetAdditionalEmulatorFilterName()))
+ return disabled_tests
+
+ def UpdateFilter(self, failed_tests):
+ """Updates test_suite_disabled file with the new filter (deletes if empty).
+
+ If running in Emulator, only the failed tests which are not in the normal
+ filter returned by _GetFilterFileName() are written to emulator's
+ additional filter file.
+
+ Args:
+ failed_tests: A sorted list of failed tests.
+ """
+ disabled_tests = []
+ if not self._running_on_emulator:
+ filter_file_name = self._GetFilterFileName()
+ else:
+ filter_file_name = self._GetAdditionalEmulatorFilterName()
+ disabled_tests.extend(
+ run_tests_helper.GetExpectations(self._GetFilterFileName()))
+ logging.info('About to update emulator\'s additional filter (%s).'
+ % filter_file_name)
+
+ new_failed_tests = []
+ if failed_tests:
+ for test in failed_tests:
+ if test.name not in disabled_tests:
+ new_failed_tests.append(test.name)
+
+ if not new_failed_tests:
+ if os.path.exists(filter_file_name):
+ os.unlink(filter_file_name)
+ return
+
+ filter_file = file(filter_file_name, 'w')
+ if self._running_on_emulator:
+ filter_file.write('# Addtional list of suppressions from emulator\n')
+ else:
+ filter_file.write('# List of suppressions\n')
+ filter_file.write('# This file was automatically generated by %s\n'
+ % sys.argv[0])
+ filter_file.write('\n'.join(sorted(new_failed_tests)))
+ filter_file.write('\n')
+ filter_file.close()
+
+ def GetDataFilesForTestSuite(self):
+ """Returns a list of data files/dirs needed by the test suite."""
+ # Ideally, we'd just push all test data. However, it has >100MB, and a lot
+ # of the files are not relevant (some are used for browser_tests, others for
+ # features not supported, etc..).
+ if self.test_package.test_suite_basename in ['base_unittests',
+ 'sql_unittests',
+ 'unit_tests']:
+ test_files = [
+ 'base/data/file_util_unittest',
+ 'base/data/json/bom_feff.json',
+ 'chrome/test/data/download-test1.lib',
+ 'chrome/test/data/extensions/bad_magic.crx',
+ 'chrome/test/data/extensions/good.crx',
+ 'chrome/test/data/extensions/icon1.png',
+ 'chrome/test/data/extensions/icon2.png',
+ 'chrome/test/data/extensions/icon3.png',
+ 'chrome/test/data/extensions/allow_silent_upgrade/',
+ 'chrome/test/data/extensions/app/',
+ 'chrome/test/data/extensions/bad/',
+ 'chrome/test/data/extensions/effective_host_permissions/',
+ 'chrome/test/data/extensions/empty_manifest/',
+ 'chrome/test/data/extensions/good/Extensions/',
+ 'chrome/test/data/extensions/manifest_tests/',
+ 'chrome/test/data/extensions/page_action/',
+ 'chrome/test/data/extensions/permissions/',
+ 'chrome/test/data/extensions/script_and_capture/',
+ 'chrome/test/data/extensions/unpacker/',
+ 'chrome/test/data/bookmarks/',
+ 'chrome/test/data/components/',
+ 'chrome/test/data/extensions/json_schema_test.js',
+ 'chrome/test/data/History/',
+ 'chrome/test/data/json_schema_validator/',
+ 'chrome/test/data/pref_service/',
+ 'chrome/test/data/serializer_nested_test.js',
+ 'chrome/test/data/serializer_test.js',
+ 'chrome/test/data/serializer_test_nowhitespace.js',
+ 'chrome/test/data/top_sites/',
+ 'chrome/test/data/web_app_info/',
+ 'chrome/test/data/web_database',
+ 'chrome/test/data/webui/',
+ 'chrome/test/data/zip',
+ 'chrome/third_party/mock4js/',
+ 'content/browser/gpu/software_rendering_list.json',
+ 'net/data/cache_tests/insert_load1',
+ 'net/data/cache_tests/dirty_entry5',
+ 'net/data/ssl/certificates/',
+ 'ui/base/test/data/data_pack_unittest',
+ ]
+ if self.test_package.test_suite_basename == 'unit_tests':
+ test_files += ['chrome/test/data/simple_open_search.xml']
+ # The following are spell check data. Now only list the data under
+ # third_party/hunspell_dictionaries which are used by unit tests.
+ old_cwd = os.getcwd()
+ os.chdir(constants.CHROME_DIR)
+ test_files += glob.glob('third_party/hunspell_dictionaries/*.bdic')
+ os.chdir(old_cwd)
+ return test_files
+ elif self.test_package.test_suite_basename == 'net_unittests':
+ return [
+ 'net/data/cache_tests',
+ 'net/data/filter_unittests',
+ 'net/data/ftp',
+ 'net/data/proxy_resolver_v8_unittest',
+ 'net/data/ssl/certificates',
+ 'net/data/url_request_unittest/',
+ 'net/data/proxy_script_fetcher_unittest'
+ ]
+ elif self.test_package.test_suite_basename == 'ui_tests':
+ return [
+ 'chrome/test/data/dromaeo',
+ 'chrome/test/data/json2.js',
+ 'chrome/test/data/sunspider',
+ 'chrome/test/data/v8_benchmark',
+ 'chrome/test/perf/sunspider_uitest.js',
+ 'chrome/test/perf/v8_benchmark_uitest.js',
+ ]
+ elif self.test_package.test_suite_basename == 'page_cycler_tests':
+ data = [
+ 'tools/page_cycler',
+ 'data/page_cycler',
+ ]
+ for d in data:
+ if not os.path.exists(d):
+ raise Exception('Page cycler data not found.')
+ return data
+ elif self.test_package.test_suite_basename == 'webkit_unit_tests':
+ return [
+ 'third_party/WebKit/Source/WebKit/chromium/tests/data',
+ ]
+ elif self.test_package.test_suite_basename == 'content_unittests':
+ return [
+ 'content/test/data/gpu/webgl_conformance_test_expectations.txt',
+ 'net/data/ssl/certificates/',
+ 'webkit/data/dom_storage/webcore_test_database.localstorage',
+ 'third_party/hyphen/hyph_en_US.dic',
+ ]
+ elif self.test_package.test_suite_basename == 'media_unittests':
+ return [
+ 'media/test/data',
+ ]
+ return []
+
+ def LaunchHelperToolsForTestSuite(self):
+ """Launches helper tools for the test suite.
+
+ Sometimes one test may need to run some helper tools first in order to
+ successfully complete the test.
+ """
+ if self._TestSuiteRequiresMockTestServer():
+ self.LaunchChromeTestServerSpawner()
+
+ def StripAndCopyFiles(self):
+ """Strips and copies the required data files for the test suite."""
+ self.test_package.StripAndCopyExecutable()
+ self.test_package.PushDataAndPakFiles()
+ self.tool.CopyFiles()
+ test_data = self.GetDataFilesForTestSuite()
+ if test_data and not self.fast_and_loose:
+ # Make sure SD card is ready.
+ self.adb.WaitForSdCardReady(20)
+ for data in test_data:
+ self.CopyTestData([data], self.adb.GetExternalStorage())
+
+ def RunTestsWithFilter(self):
+ """Runs a tests via a small, temporary shell script."""
+ self.test_package.CreateTestRunnerScript(self._gtest_filter,
+ self._test_arguments)
+ self.test_results = self.test_package.RunTestsAndListResults()
+
+ def RebaselineTests(self):
+ """Runs all available tests, restarting in case of failures."""
+ if self._gtest_filter:
+ all_tests = set(self._gtest_filter.split(':'))
+ else:
+ all_tests = set(self.test_package.GetAllTests())
+ failed_results = set()
+ executed_results = set()
+ while True:
+ executed_names = set([f.name for f in executed_results])
+ self._gtest_filter = ':'.join(all_tests - executed_names)
+ self.RunTestsWithFilter()
+ failed_results.update(self.test_results.crashed,
+ self.test_results.failed)
+ executed_results.update(self.test_results.crashed,
+ self.test_results.failed,
+ self.test_results.ok)
+ executed_names = set([f.name for f in executed_results])
+ logging.info('*' * 80)
+ logging.info(self.device)
+ logging.info('Executed: ' + str(len(executed_names)) + ' of ' +
+ str(len(all_tests)))
+ logging.info('Failed so far: ' + str(len(failed_results)) + ' ' +
+ str([f.name for f in failed_results]))
+ logging.info('Remaining: ' + str(len(all_tests - executed_names)) + ' ' +
+ str(all_tests - executed_names))
+ logging.info('*' * 80)
+ if executed_names == all_tests:
+ break
+ self.test_results = TestResults.FromRun(
+ ok=list(executed_results - failed_results),
+ failed=list(failed_results))
+
+ def RunTests(self):
+ """Runs all tests (in rebaseline mode, runs each test in isolation).
+
+ Returns:
+ A TestResults object.
+ """
+ if self.test_package.rebaseline:
+ self.RebaselineTests()
+ else:
+ if not self._gtest_filter:
+ self._gtest_filter = ('-' + ':'.join(self.GetDisabledTests()) + ':' +
+ ':'.join(['*.' + x + '*' for x in
+ self.test_package.GetDisabledPrefixes()]))
+ self.RunTestsWithFilter()
+ return self.test_results
+
+ def SetUp(self):
+ """Sets up necessary test enviroment for the test suite."""
+ super(SingleTestRunner, self).SetUp()
+ self.adb.ClearApplicationState(constants.CHROME_PACKAGE)
+ if self._performance_test_setup:
+ self._performance_test_setup.SetUp()
+ if self.dump_debug_info:
+ self.dump_debug_info.StartRecordingLog(True)
+ self.StripAndCopyFiles()
+ self.LaunchHelperToolsForTestSuite()
+ self.tool.SetupEnvironment()
+
+ def TearDown(self):
+ """Cleans up the test enviroment for the test suite."""
+ self.tool.CleanUpEnvironment()
+ if self.test_package.cleanup_test_files:
+ self.adb.RemovePushedFiles()
+ if self.dump_debug_info:
+ self.dump_debug_info.StopRecordingLog()
+ if self._performance_test_setup:
+ self._performance_test_setup.TearDown()
+ if self.dump_debug_info:
+ self.dump_debug_info.ArchiveNewCrashFiles()
+ super(SingleTestRunner, self).TearDown()