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 |