OLD | NEW |
---|---|
(Empty) | |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 import contextlib | |
6 | |
7 from cStringIO import StringIO | |
8 | |
9 try: | |
10 import coverage | |
11 coverage_version = coverage.__version__ | |
12 except ImportError: | |
13 coverage = None | |
14 coverage_version = None | |
15 | |
16 from distutils.version import StrictVersion | |
17 | |
18 if (not coverage or | |
19 #not hasattr(coverage.collector, 'CTracer') or | |
agable
2014/04/03 00:38:00
Remove commented out lines
| |
20 #not coverage.collector.CTracer or | |
21 StrictVersion(coverage_version) < StrictVersion('3.7.1')): | |
22 raise ImportError( | |
23 'This test requires natively-installed python-coverage (>=3.7.1). ' | |
24 'Current is %s.' % coverage_version) | |
25 | |
26 | |
27 @contextlib.contextmanager | |
28 def _cover(**kwargs): | |
29 c = coverage.coverage(**kwargs) | |
30 c._warn_no_data = False # pylint: disable=protected-access | |
31 c.start() | |
32 try: | |
33 yield | |
34 finally: | |
35 c.stop() | |
36 c.save() | |
37 | |
38 | |
39 @contextlib.contextmanager | |
40 def _nop_cover(): | |
41 yield | |
42 | |
43 | |
44 class CoverageContext(object): | |
45 def __init__(self, includes, omits, enabled=True): | |
46 self.opts = None | |
47 self.cov = None | |
48 self.enabled = enabled | |
49 | |
50 if enabled: | |
51 self.opts = { | |
52 'include': includes, | |
53 'omit': omits, | |
54 'data_suffix': True | |
55 } | |
56 self.cov = coverage.coverage(**self.opts) | |
57 self.cov.erase() | |
58 | |
59 def cleanup(self): | |
60 if self.enabled: | |
61 self.cov.combine() | |
62 | |
63 def report(self, verbose): | |
64 fail = False | |
65 | |
66 if self.enabled: | |
67 outf = StringIO() | |
68 fail = self.cov.report(file=outf) != 100.0 | |
69 summary = outf.getvalue().replace('%- 15s' % 'Name', 'Coverage Report', 1) | |
70 if verbose: | |
71 print | |
72 print summary | |
73 elif fail: | |
74 print | |
75 lines = summary.splitlines() | |
76 lines[2:-2] = [l for l in lines[2:-2] | |
77 if not l.strip().endswith('100%')] | |
78 print '\n'.join(lines) | |
79 print | |
80 print 'FATAL: Test coverage is not at 100%.' | |
81 | |
82 return not fail | |
83 | |
84 def create_subprocess_context(self): | |
85 if self.enabled: | |
86 return _cover(**self.opts) | |
87 else: | |
88 return _nop_cover() | |
OLD | NEW |