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

Unified Diff: tools/code_coverage/coverage_posix.py

Issue 56136: Start of code coverage for Mac.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 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 | « chrome/chrome.gyp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/code_coverage/coverage_posix.py
===================================================================
--- tools/code_coverage/coverage_posix.py (revision 0)
+++ tools/code_coverage/coverage_posix.py (revision 0)
@@ -0,0 +1,120 @@
+#!/usr/bin/env python
+# Copyright (c) 2009 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.
+
+"""Generate and process code coverage on POSIX systems.
+
+Written for and tested on Mac.
+Not tested on Linux yet.
+
+--directory=DIR: specify directory that contains gcda files, and where
+ a "coverage" directory will be created containing the output html.
+
+TODO(jrg): make list of unit tests an arg to this script
+"""
+
+import logging
+import optparse
+import os
+import subprocess
+import sys
+
+class Coverage(object):
+ """Doitall class for code coverage."""
+
+ # Unit test files to run.
+ UNIT_TESTS = [
+ 'base_unittests',
+ # 'unit_tests,
+ ]
+
+ def __init__(self, directory):
+ super(Coverage, self).__init__()
+ self.directory = directory
+ self.output_directory = os.path.join(self.directory, 'coverage')
+ if not os.path.exists(self.output_directory):
+ os.mkdir(self.output_directory)
+ self.lcov_directory = os.path.join(sys.path[0],
+ '../../third_party/lcov/bin')
+ self.lcov = os.path.join(self.lcov_directory, 'lcov')
+ self.mcov = os.path.join(self.lcov_directory, 'mcov')
+ self.genhtml = os.path.join(self.lcov_directory, 'genhtml')
+ self.coverage_info_file = self.directory + 'coverage.info'
+ self.ConfirmPlatformAndPaths()
+
+ def ConfirmPlatformAndPaths(self):
+ """Confirm OS and paths (e.g. lcov)."""
+ if not self.IsPosix():
+ logging.fatal('Not posix.')
+ programs = [self.lcov, self.genhtml]
+ if self.IsMac():
+ programs.append(self.mcov)
+ for program in programs:
+ if not os.path.exists(program):
+ logging.fatal('lcov program missing: ' + program)
+
+ def IsPosix(self):
+ """Return True if we are POSIX."""
+ return self.IsMac() or self.IsLinux()
+
+ def IsMac(self):
+ return sys.platform == 'darwin'
+
+ def IsLinux(self):
+ return sys.platform == 'linux2'
+
+ def ClearData(self):
+ """Clear old gcda files"""
+ subprocess.call([self.lcov,
+ '--directory', self.directory,
+ '--zerocounters'])
+
+ def RunTests(self):
+ """Run all unit tests."""
+ for test in self.UNIT_TESTS:
+ fulltest = os.path.join(self.directory, test)
+ if not os.path.exists(fulltest):
+ logging.fatal(fulltest + ' does not exist')
+ # TODO(jrg): add timeout?
+ # TODO(jrg): check return value and choke if it failed?
+ # TODO(jrg): add --gtest_print_time like as run from XCode?
+ subprocess.call([fulltest])
+
+ def GenerateOutput(self):
+ """Convert profile data to html."""
+ if self.IsLinux():
+ subprocess.call([self.lcov,
+ '--directory', self.directory,
+ '--capture',
+ '--output-file',
+ self.coverage_info_file])
+ else:
+ subprocess.call([self.mcov,
+ '--directory', self.directory,
+ '--output', self.coverage_info_file])
+ subprocess.call([self.genhtml,
+ self.coverage_info_file,
+ '--output-directory',
+ self.output_directory])
+
+def main():
+ parser = optparse.OptionParser()
+ parser.add_option('-d',
+ '--directory',
+ dest='directory',
+ default=None,
+ help='Directory of unit test files')
+ (options, args) = parser.parse_args()
+ if not options.directory:
+ parser.error('Directory not specified')
+
+ coverage = Coverage(options.directory)
+ coverage.ClearData()
+ coverage.RunTests()
+ coverage.GenerateOutput()
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
Property changes on: tools/code_coverage/coverage_posix.py
___________________________________________________________________
Name: svn:executable
+ *
Name: eol-style
+ LF
« no previous file with comments | « chrome/chrome.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698