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

Unified Diff: build/android/single_test_runner.py

Issue 10693110: [android] Split top-level scripts and libraries from build/android. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Copyright on __init__.py, removed #! on some pylib/ files. 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/run_tests_helper.py ('k') | build/android/test_package.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/android/single_test_runner.py
diff --git a/build/android/single_test_runner.py b/build/android/single_test_runner.py
deleted file mode 100644
index 48e92ea3d6cec24f2d59731b4057a7c807c00b94..0000000000000000000000000000000000000000
--- a/build/android/single_test_runner.py
+++ /dev/null
@@ -1,315 +0,0 @@
-# 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 logging
-import os
-import sys
-
-from base_test_runner import BaseTestRunner
-import debug_info
-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.
- """
-
- def __init__(self, device, test_suite, gtest_filter, test_arguments, timeout,
- rebaseline, performance_test, cleanup_test_files, tool,
- shard_index, dump_debug_info=False,
- fast_and_loose=False):
- BaseTestRunner.__init__(self, device, shard_index)
- 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
-
- if os.path.splitext(test_suite)[1] == '.apk':
- self.test_package = TestPackageApk(
- self.adb, device,
- test_suite, timeout, rebaseline, performance_test, cleanup_test_files,
- tool, self.dump_debug_info)
- else:
- self.test_package = TestPackageExecutable(
- self.adb, device,
- test_suite, timeout, rebaseline, performance_test, cleanup_test_files,
- tool, self.dump_debug_info)
-
- def _GetHttpServerDocumentRootForTestSuite(self):
- """Returns the document root needed by the test suite."""
- if self.test_package.test_suite_basename == 'page_cycler_tests':
- return os.path.join(run_tests_helper.CHROME_DIR, 'data', 'page_cycler')
- return None
-
-
- 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']:
- return [
- 'base/data/json/bom_feff.json',
- 'net/data/cache_tests/insert_load1',
- 'net/data/cache_tests/dirty_entry5',
- 'ui/base/test/data/data_pack_unittest',
- 'chrome/test/data/bookmarks/History_with_empty_starred',
- 'chrome/test/data/bookmarks/History_with_starred',
- 'chrome/test/data/extensions/json_schema_test.js',
- 'chrome/test/data/History/',
- 'chrome/test/data/json_schema_validator/',
- '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_database',
- 'chrome/test/data/zip',
- ]
- 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',
- ]
- 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/ui/sunspider_uitest.js',
- 'chrome/test/ui/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 [
- 'webkit/data/dom_storage/webcore_test_database.localstorage',
- ]
- 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.
- """
- document_root = self._GetHttpServerDocumentRootForTestSuite()
- if document_root:
- self.LaunchTestHttpServer(document_root)
- 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.test_package.tool.CopyFiles()
- test_data = self.GetDataFilesForTestSuite()
- if test_data and not self.fast_and_loose:
- if self.test_package.test_suite_basename == 'page_cycler_tests':
- # Since the test data for page cycler are huge (around 200M), we use
- # sdcard to store the data and create symbol links to map them to
- # data/local/tmp/ later.
- self.CopyTestData(test_data, '/sdcard/')
- for p in [os.path.dirname(d) for d in test_data if os.path.isdir(d)]:
- mapped_device_path = '/data/local/tmp/' + p
- # Unlink the mapped_device_path at first in case it was mapped to
- # a wrong path. Add option '-r' becuase the old path could be a dir.
- self.adb.RunShellCommand('rm -r %s' % mapped_device_path)
- self.adb.RunShellCommand(
- 'ln -s /sdcard/%s %s' % (p, mapped_device_path))
- else:
- self.CopyTestData(test_data, '/data/local/tmp/')
-
- 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()
- if self.test_package.performance_test:
- if run_tests_helper.IsRunningAsBuildbot():
- self.adb.SetJavaAssertsEnabled(enable=False)
- self.adb.Reboot(full_reboot=False)
- self.adb.SetupPerformanceTest()
- if self.dump_debug_info:
- self.dump_debug_info.StartRecordingLog(True)
- self.StripAndCopyFiles()
- self.LaunchHelperToolsForTestSuite()
- self.test_package.tool.SetupEnvironment()
-
- def TearDown(self):
- """Cleans up the test enviroment for the test suite."""
- self.test_package.tool.CleanUpEnvironment()
- if self.test_package.cleanup_test_files:
- self.adb.RemovePushedFiles()
- if self.dump_debug_info:
- self.dump_debug_info.StopRecordingLog()
- if self.test_package.performance_test:
- self.adb.TearDownPerformanceTest()
- super(SingleTestRunner, self).TearDown()
« no previous file with comments | « build/android/run_tests_helper.py ('k') | build/android/test_package.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698