forked from danmar/cppcheck
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_htmlreport.py
More file actions
executable file
·115 lines (85 loc) · 3.51 KB
/
test_htmlreport.py
File metadata and controls
executable file
·115 lines (85 loc) · 3.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env python3
"""Test cppcheck-htmlreport."""
import os
import contextlib
import shutil
import subprocess
import sys
import tempfile
if sys.version_info < (2, 7):
# For TestCase.assertIn().
import unittest2 as unittest
else:
import unittest
ROOT_DIR = os.path.split(os.path.abspath(os.path.dirname(__file__)))[0]
CPPCHECK_BIN = os.path.join(ROOT_DIR, 'cppcheck')
HTML_REPORT_BIN = os.path.join(os.path.abspath(os.path.dirname(__file__)),
'cppcheck-htmlreport')
class TestHTMLReport(unittest.TestCase):
def testReportError(self):
for xml_version in ['2']:
self.checkReportError(xml_version)
def checkReportError(self, xml_version):
with runCheck(
os.path.join(ROOT_DIR, 'samples', 'memleak', 'bad.c'),
xml_version=xml_version
) as (report, output_directory):
self.assertIn('<html', report)
self.assertIn('Memory leak:', report)
self.assertIn('bad.c', report)
detail_filename = os.path.join(output_directory, '0.html')
self.assertTrue(
os.path.exists(detail_filename))
with open(detail_filename) as input_file:
detail_contents = input_file.read()
self.assertIn('<html', detail_contents)
self.assertIn('Memory leak:', detail_contents)
def testReportNoError(self):
for xml_version in ['2']:
self.checkReportNoError(xml_version)
def checkReportNoError(self, xml_version):
with runCheck(
os.path.join(ROOT_DIR, 'samples', 'memleak', 'good.c'),
xml_version=xml_version
) as (report, output_directory):
self.assertIn('<html', report)
self.assertNotIn('Memory leak:', report)
self.assertNotIn('good.c', report)
self.assertFalse(
os.path.exists(os.path.join(output_directory, '0.html')))
def testMissingInclude(self):
with runCheck(
xml_filename=os.path.join(ROOT_DIR, 'htmlreport', 'example.xml'),
) as (report, output_directory):
self.assertIn('<html', report)
self.assertIn('Uninitialized variable:', report)
self.assertIn('example.cc', report)
self.assertTrue(
os.path.exists(os.path.join(output_directory, '0.html')))
@contextlib.contextmanager
def runCheck(source_filename=None, xml_version='1', xml_filename=None):
"""Run cppcheck and cppcheck-htmlreport.
Yield a tuple containing the resulting HTML report index and the directory
path.
"""
output_directory = tempfile.mkdtemp(dir='.')
if xml_filename is None:
assert source_filename
xml_filename = os.path.join(output_directory, 'output.xml')
with open(xml_filename, 'w') as output_file:
subprocess.check_call(
[CPPCHECK_BIN, '--xml', source_filename,
'--xml-version=' + xml_version],
stderr=output_file)
assert os.path.exists(xml_filename)
subprocess.check_call(
[sys.executable, HTML_REPORT_BIN,
'--file=' + os.path.realpath(xml_filename),
'--report-dir=' + os.path.realpath(output_directory)],
cwd=os.path.join(ROOT_DIR, 'htmlreport'))
with open(os.path.join(output_directory, 'index.html')) as index_file:
index_contents = index_file.read()
yield index_contents, output_directory
shutil.rmtree(output_directory)
if __name__ == '__main__':
unittest.main()