| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2009 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Generate and process code coverage. | 6 """Generate and process code coverage. |
| 7 | 7 |
| 8 TODO(jrg): rename this from coverage_posix.py to coverage_all.py! | 8 TODO(jrg): rename this from coverage_posix.py to coverage_all.py! |
| 9 | 9 |
| 10 Written for and tested on Mac, Linux, and Windows. To use this script | 10 Written for and tested on Mac, Linux, and Windows. To use this script |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 --genhtml: generate html output. If not specified only lcov is generated. | 29 --genhtml: generate html output. If not specified only lcov is generated. |
| 30 | 30 |
| 31 --all_unittests: if present, run all files named *_unittests that we | 31 --all_unittests: if present, run all files named *_unittests that we |
| 32 can find. | 32 can find. |
| 33 | 33 |
| 34 --fast_test: make the tests run real fast (just for testing) | 34 --fast_test: make the tests run real fast (just for testing) |
| 35 | 35 |
| 36 --strict: if a test fails, we continue happily. --strict will cause | 36 --strict: if a test fails, we continue happily. --strict will cause |
| 37 us to die immediately. | 37 us to die immediately. |
| 38 | 38 |
| 39 --trim=False: by default we trim away tests known to be problematic on |
| 40 specific platforms. If set to false we do NOT trim out tests. |
| 41 |
| 39 Strings after all options are considered tests to run. Test names | 42 Strings after all options are considered tests to run. Test names |
| 40 have all text before a ':' stripped to help with gyp compatibility. | 43 have all text before a ':' stripped to help with gyp compatibility. |
| 41 For example, ../base/base.gyp:base_unittests is interpreted as a test | 44 For example, ../base/base.gyp:base_unittests is interpreted as a test |
| 42 named "base_unittests". | 45 named "base_unittests". |
| 43 """ | 46 """ |
| 44 | 47 |
| 45 import glob | 48 import glob |
| 46 import logging | 49 import logging |
| 47 import optparse | 50 import optparse |
| 48 import os | 51 import os |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 | 131 |
| 129 # If needed, append .exe to tests since vsinstr.exe likes it that | 132 # If needed, append .exe to tests since vsinstr.exe likes it that |
| 130 # way. | 133 # way. |
| 131 if self.IsWindows(): | 134 if self.IsWindows(): |
| 132 for ind in range(len(self.tests)): | 135 for ind in range(len(self.tests)): |
| 133 test = self.tests[ind] | 136 test = self.tests[ind] |
| 134 test_exe = test + '.exe' | 137 test_exe = test + '.exe' |
| 135 if not test.endswith('.exe') and os.path.exists(test_exe): | 138 if not test.endswith('.exe') and os.path.exists(test_exe): |
| 136 self.tests[ind] = test_exe | 139 self.tests[ind] = test_exe |
| 137 | 140 |
| 138 # Temporarily make Windows quick for bringup by filtering | 141 def TrimTests(self): |
| 139 # out all except base_unittests. Easier than a chrome.cyp change. | 142 """Trim specific tests for each platform.""" |
| 140 # TODO(jrg): remove this | |
| 141 if self.IsWindows(): | 143 if self.IsWindows(): |
| 142 t2 = [] | 144 # special case for now to be fast |
| 145 inclusion = ['base_unittests'] |
| 146 keep = [] |
| 143 for test in self.tests: | 147 for test in self.tests: |
| 144 if 'base_unittests' in test: | 148 for i in inclusion: |
| 145 t2.append(test) | 149 if test.endswith(i): |
| 146 self.tests = t2 | 150 keep.append(test) |
| 147 | 151 self.tests = keep |
| 148 | 152 return |
| 153 if self.IsLinux(): |
| 154 return |
| 155 if self.IsMac(): |
| 156 exclusion = ['automated_ui_tests'] |
| 157 punted = [] |
| 158 for test in self.tests: |
| 159 for e in exclusion: |
| 160 if test.endswith(e): |
| 161 punted.append(test) |
| 162 self.tests = filter(lambda t: t not in punted, self.tests) |
| 163 if punted: |
| 164 logging.info('Tests trimmed out: ' + str(punted)) |
| 149 | 165 |
| 150 def ConfirmPlatformAndPaths(self): | 166 def ConfirmPlatformAndPaths(self): |
| 151 """Confirm OS and paths (e.g. lcov).""" | 167 """Confirm OS and paths (e.g. lcov).""" |
| 152 for program in self.programs: | 168 for program in self.programs: |
| 153 if not os.path.exists(program): | 169 if not os.path.exists(program): |
| 154 logging.fatal('Program missing: ' + program) | 170 logging.fatal('Program missing: ' + program) |
| 155 sys.exit(1) | 171 sys.exit(1) |
| 156 | 172 |
| 157 def Run(self, cmdlist, ignore_error=False, ignore_retcode=None, | 173 def Run(self, cmdlist, ignore_error=False, ignore_retcode=None, |
| 158 explanation=None): | 174 explanation=None): |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 parser.add_option('-s', | 343 parser.add_option('-s', |
| 328 '--strict', | 344 '--strict', |
| 329 dest='strict', | 345 dest='strict', |
| 330 default=False, | 346 default=False, |
| 331 help='Be strict and die on test failure.') | 347 help='Be strict and die on test failure.') |
| 332 parser.add_option('-S', | 348 parser.add_option('-S', |
| 333 '--src_root', | 349 '--src_root', |
| 334 dest='src_root', | 350 dest='src_root', |
| 335 default='.', | 351 default='.', |
| 336 help='Source root (only used on Windows)') | 352 help='Source root (only used on Windows)') |
| 353 parser.add_option('-t', |
| 354 '--trim', |
| 355 dest='trim', |
| 356 default=True, |
| 357 help='Trim out tests? Default True.') |
| 337 (options, args) = parser.parse_args() | 358 (options, args) = parser.parse_args() |
| 338 if not options.directory: | 359 if not options.directory: |
| 339 parser.error('Directory not specified') | 360 parser.error('Directory not specified') |
| 340 coverage = Coverage(options.directory, options, args) | 361 coverage = Coverage(options.directory, options, args) |
| 341 coverage.ClearData() | 362 coverage.ClearData() |
| 342 coverage.FindTests() | 363 coverage.FindTests() |
| 364 if options.trim: |
| 365 coverage.TrimTests() |
| 343 coverage.BeforeRunTests() | 366 coverage.BeforeRunTests() |
| 344 coverage.RunTests() | 367 coverage.RunTests() |
| 345 coverage.AfterRunTests() | 368 coverage.AfterRunTests() |
| 346 coverage.GenerateLcov() | 369 coverage.GenerateLcov() |
| 347 if options.genhtml: | 370 if options.genhtml: |
| 348 coverage.GenerateHtml() | 371 coverage.GenerateHtml() |
| 349 return 0 | 372 return 0 |
| 350 | 373 |
| 351 | 374 |
| 352 if __name__ == '__main__': | 375 if __name__ == '__main__': |
| 353 sys.exit(main()) | 376 sys.exit(main()) |
| OLD | NEW |