diff options
author | niranjan@google.com <niranjan@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-20 00:54:49 +0000 |
---|---|---|
committer | niranjan@google.com <niranjan@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-20 00:54:49 +0000 |
commit | 1581ad170e9c9d3a92c66b377c35a5abc747dc4c (patch) | |
tree | a8bc8f445fdc56a438b456c936b2fc92854d995c /tools/code_coverage | |
parent | d4eafbf25ee2e43dbcee80ccb55a3e5c153dd189 (diff) | |
download | chromium_src-1581ad170e9c9d3a92c66b377c35a5abc747dc4c.zip chromium_src-1581ad170e9c9d3a92c66b377c35a5abc747dc4c.tar.gz chromium_src-1581ad170e9c9d3a92c66b377c35a5abc747dc4c.tar.bz2 |
Added flags to the coverage script so that this can run locally and developers can use the .coverage files inside their Visual Studio Team Tools. Also misc bug fixes.
Review URL: http://codereview.chromium.org/11497
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5737 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/code_coverage')
-rw-r--r-- | tools/code_coverage/coverage.py | 100 |
1 files changed, 62 insertions, 38 deletions
diff --git a/tools/code_coverage/coverage.py b/tools/code_coverage/coverage.py index 009cd0b..55b2b07 100644 --- a/tools/code_coverage/coverage.py +++ b/tools/code_coverage/coverage.py @@ -30,39 +30,42 @@ import google.process_utils as proc # The list of binaries that will be instrumented for code coverage -windows_binaries = ['base_unittests.exe', +# TODO(niranjan): Re-enable instrumentation of chrome.exe and chrome.dll once we +# resolve the issue where vsinstr.exe is confused while reading symbols. +windows_binaries = [#'chrome.exe', + #'chrome.dll', 'unit_tests.exe', 'automated_ui_tests.exe', 'ui_tests.exe', 'installer_unittests.exe', 'ipc_tests.exe', 'memory_test.exe', - 'net_perftests.exe', - 'net_unittests.exe', 'page_cycler_tests.exe', 'perf_tests.exe', 'plugin_tests.exe', + 'reliability_tests.exe', 'security_tests.dll', - 'selenium_tests.exe', 'startup_tests.exe', 'tab_switching_test.exe', 'test_shell_tests.exe', 'test_shell.exe', 'activex_test_control.dll'] -# The list of tests that will be run -windows_tests = ['unit_tests.exe', - 'base_unittests.exe', - 'automated_ui_tests.exe', - 'ui_tests.exe', - 'installer_unittests.exe', - 'ipc_tests.exe', - 'net_perftests.exe', - 'net_unittests.exe', - 'plugin_tests.exe', - 'startup_tests.exe', - 'tab_switching_test.exe', - 'test_shell_tests.exe'] +# The list of [tests, args] that will be run. +# TODO(niranjan): Need to add layout tests that excercise the test shell. +windows_tests = [ + ['unit_tests.exe', ''], + ['automated_ui_tests.exe', ''], + ['ui_tests.exe', '--no-sandbox'], + ['installer_unittests.exe', ''], + ['ipc_tests.exe', ''], + ['page_cycler_tests.exe', '--gtest_filter=*File --no-sandbox'], + ['plugin_tests.exe', '--no-sandbox'], + ['reliability_tests.exe', '--no-sandbox'], + ['startup_tests.exe', '--no-sandbox'], + ['tab_switching_test.exe', '--no-sandbox'], + ['test_shell_tests.exe', ''] + ] def IsWindows(): @@ -85,13 +88,15 @@ class Coverage(object): def __init__(self, revision, src_path = None, - tools_path = None): + tools_path = None, + archive=None): """Init method for the Coverage class. Args: revision: Revision number of the Chromium source tree. src_path: Location of the Chromium source base. tools_path: Location of the Visual Studio Team Tools. (Win32 only) + archive: Archive location for the intermediate .coverage results. """ google.logging_utils.config_root() self.revision = revision @@ -99,6 +104,7 @@ class Coverage(object): self.tools_path = tools_path self.src_path = src_path self._dir = tempfile.mkdtemp() + self._archive = archive def SetUp(self, binaries): @@ -130,7 +136,9 @@ class Coverage(object): logging.error('Could not locate Visual Studio Team Server tools') return False # Remove trailing slashes - self.tools_path = self.tools_path.rstrip('\\') + self.tools_path = self.tools_path.rstrip('\\') + # Add this to the env PATH. + os.environ['PATH'] = os.environ['PATH'] + ';' + self.tools_path instrument_command = '%s /COVERAGE ' % (os.path.join(self.tools_path, 'vsinstr.exe')) for binary in binaries: @@ -169,6 +177,9 @@ class Coverage(object): # versions. else: return + if self._archive: + shutil.copytree(self._dir, os.path.join(self._archive, self.revision)) + logging.info('Archived the .coverage files') # Delete all the temp files and folders if self._dir != None: shutil.rmtree(self._dir, ignore_errors=True) @@ -177,10 +188,11 @@ class Coverage(object): self.instrumented = False - def RunTest(self, test): + def RunTest(self, src_root, test): """Run tests and collect the .coverage file Args: + src_root: Path to the root of the source. test: Path to the test to be run. Returns: @@ -188,10 +200,17 @@ class Coverage(object): None on error. """ # Generate the intermediate file name for the coverage results - testname = os.path.split(test)[1].strip('.exe') + testname = os.path.split(test[0])[1].strip('.exe') + # test_command = binary + args + test_command = '%s %s' % (os.path.join(src_root, + 'chrome', + 'Release', + test[0]), + test[1]) + coverage_file = os.path.join(self._dir, '%s_win32_%s.coverage' % - (testname, self.revision)) - logging.info('.coverage file for test %s: %s' % (test, coverage_file)) + (test_name, self.revision)) + logging.info('.coverage file for test %s: %s' % (test_name, coverage_file)) # After all the binaries have been instrumented, we start the counters. counters_command = ('%s -start:coverage -output:%s' % @@ -203,10 +222,10 @@ class Coverage(object): retcode = subprocess.call(counters_command) # Run the test binary - logging.info('Executing test %s: ' % test) - (retcode, output) = proc.RunCommandFull(test, collect_output=True) + logging.info('Executing test %s: ' % test_command) + (retcode, output) = proc.RunCommandFull(test_command, collect_output=True) if retcode != 0: # Return error if the tests fail - logging.error('One or more tests failed in %s.' % test) + logging.error('One or more tests failed in %s.' % test_command) return None # Stop the counters @@ -236,6 +255,10 @@ class Coverage(object): True on success. False on failure. """ + if upload_path == None: + logging.info('Upload path not specified. Will not convert to LCOV') + return True + if IsWindows(): # Stop counters counters_command = ('%s -shutdown' % @@ -247,7 +270,6 @@ class Coverage(object): (self.revision)) lcov = open(lcov_file, 'w') for coverage_file in list_coverage: - # Convert the intermediate .coverage file to lcov format if self.tools_path == None: logging.error('Lcov converter tool not found') @@ -261,9 +283,9 @@ class Coverage(object): coverage_file)) (retcode, output) = proc.RunCommandFull(convert_command, collect_output=True) - if output != 0: - logging.error('Conversion to LCOV failed. Exiting.') - sys.exit(1) + # TODO(niranjan): Fix this to check for the correct return code. +# if output != 0: +# logging.error('Conversion to LCOV failed. Exiting.') tmp_lcov_file = coverage_file + '.lcov' logging.info('Conversion to lcov complete for %s' % (coverage_file)) # Now append this .lcov file to the cumulative lcov file @@ -271,9 +293,8 @@ class Coverage(object): tmp_lcov = open(tmp_lcov_file, 'r') lcov.write(tmp_lcov.read()) tmp_lcov.close() - lcov.close() - # Finally upload the LCOV file - logging.info('LCOV file uploaded to %s' % (upload_path)) + lcov.close() + logging.info('LCOV file uploaded to %s' % (upload_path)) def main(): @@ -304,6 +325,11 @@ def main(): dest='src_root', default=None, help='Root of the source repository') + parser.add_option('-a', + '--archive', + dest='archive', + default=None, + help='Archive location of the intermediate .coverage data') (options, args) = parser.parse_args() @@ -311,21 +337,19 @@ def main(): parser.error('Revision number not specified') if options.src_root == None: parser.error('Source root not specified') - if options.upload_path == None: - parser.error('Upload path not specified') if IsWindows(): # Initialize coverage cov = Coverage(options.revision, options.src_root, - options.tools_path) + options.tools_path, + options.archive) list_coverage = [] # Instrument the binaries if cov.SetUp(windows_binaries): # Run all the tests for test in windows_tests: - test = os.path.join(options.src_root, 'chrome', 'Release', test) - coverage = cov.RunTest(test) + coverage = cov.RunTest(options.src_root, test) if coverage == None: # Indicate failure to the buildbots. return 1 # Collect the intermediate file |