Blame htmlreport/test_htmlreport.py

Packit 2035a7
#!/usr/bin/env python
Packit 2035a7
"""Test cppcheck-htmlreport."""
Packit 2035a7
Packit 2035a7
import os
Packit 2035a7
import contextlib
Packit 2035a7
import shutil
Packit 2035a7
import subprocess
Packit 2035a7
import sys
Packit 2035a7
import tempfile
Packit 2035a7
Packit 2035a7
if sys.version_info < (2, 7):
Packit 2035a7
    # For TestCase.assertIn().
Packit 2035a7
    import unittest2 as unittest
Packit 2035a7
else:
Packit 2035a7
    import unittest
Packit 2035a7
Packit 2035a7
ROOT_DIR = os.path.split(os.path.abspath(os.path.dirname(__file__)))[0]
Packit 2035a7
CPPCHECK_BIN = os.path.join(ROOT_DIR, 'cppcheck')
Packit 2035a7
Packit 2035a7
HTML_REPORT_BIN = os.path.join(os.path.abspath(os.path.dirname(__file__)),
Packit 2035a7
                               'cppcheck-htmlreport')
Packit 2035a7
Packit 2035a7
Packit 2035a7
class TestHTMLReport(unittest.TestCase):
Packit 2035a7
Packit 2035a7
    def testReportError(self):
Packit 2035a7
        for xml_version in ['1', '2']:
Packit 2035a7
            self.checkReportError(xml_version)
Packit 2035a7
Packit 2035a7
    def checkReportError(self, xml_version):
Packit 2035a7
        with runCheck(
Packit 2035a7
            os.path.join(ROOT_DIR, 'samples', 'memleak', 'bad.c'),
Packit 2035a7
            xml_version=xml_version
Packit 2035a7
        ) as (report, output_directory):
Packit 2035a7
            self.assertIn('
Packit 2035a7
Packit 2035a7
            self.assertIn('Memory leak:', report)
Packit 2035a7
            self.assertIn('bad.c', report)
Packit 2035a7
Packit 2035a7
            detail_filename = os.path.join(output_directory, '0.html')
Packit 2035a7
            self.assertTrue(
Packit 2035a7
                os.path.exists(detail_filename))
Packit 2035a7
Packit 2035a7
            with open(detail_filename) as input_file:
Packit 2035a7
                detail_contents = input_file.read()
Packit 2035a7
                self.assertIn('
Packit 2035a7
                self.assertIn('Memory leak:', detail_contents)
Packit 2035a7
Packit 2035a7
    def testReportNoError(self):
Packit 2035a7
        for xml_version in ['1', '2']:
Packit 2035a7
            self.checkReportNoError(xml_version)
Packit 2035a7
Packit 2035a7
    def checkReportNoError(self, xml_version):
Packit 2035a7
        with runCheck(
Packit 2035a7
            os.path.join(ROOT_DIR, 'samples', 'memleak', 'good.c'),
Packit 2035a7
            xml_version=xml_version
Packit 2035a7
        ) as (report, output_directory):
Packit 2035a7
            self.assertIn('
Packit 2035a7
Packit 2035a7
            self.assertNotIn('Memory leak:', report)
Packit 2035a7
            self.assertNotIn('good.c', report)
Packit 2035a7
Packit 2035a7
            self.assertFalse(
Packit 2035a7
                os.path.exists(os.path.join(output_directory, '0.html')))
Packit 2035a7
Packit 2035a7
    def testMissingInclude(self):
Packit 2035a7
        with runCheck(
Packit 2035a7
            xml_filename=os.path.join(ROOT_DIR, 'htmlreport', 'example.xml'),
Packit 2035a7
        ) as (report, output_directory):
Packit 2035a7
            self.assertIn('
Packit 2035a7
Packit 2035a7
            self.assertIn('Uninitialized variable:', report)
Packit 2035a7
            self.assertIn('example.cc', report)
Packit 2035a7
Packit 2035a7
            self.assertTrue(
Packit 2035a7
                os.path.exists(os.path.join(output_directory, '0.html')))
Packit 2035a7
Packit 2035a7
Packit 2035a7
@contextlib.contextmanager
Packit 2035a7
def runCheck(source_filename=None, xml_version='1', xml_filename=None):
Packit 2035a7
    """Run cppcheck and cppcheck-htmlreport.
Packit 2035a7
Packit 2035a7
    Yield a tuple containing the resulting HTML report index and the directory
Packit 2035a7
    path.
Packit 2035a7
Packit 2035a7
    """
Packit 2035a7
    output_directory = tempfile.mkdtemp(dir='.')
Packit 2035a7
    if xml_filename is None:
Packit 2035a7
        assert source_filename
Packit 2035a7
        xml_filename = os.path.join(output_directory, 'output.xml')
Packit 2035a7
Packit 2035a7
        with open(xml_filename, 'w') as output_file:
Packit 2035a7
            subprocess.check_call(
Packit 2035a7
                [CPPCHECK_BIN, '--xml', source_filename,
Packit 2035a7
                 '--xml-version=' + xml_version],
Packit 2035a7
                stderr=output_file)
Packit 2035a7
Packit 2035a7
    assert os.path.exists(xml_filename)
Packit 2035a7
Packit 2035a7
    subprocess.check_call(
Packit 2035a7
        [HTML_REPORT_BIN,
Packit 2035a7
         '--file=' + os.path.realpath(xml_filename),
Packit 2035a7
         '--report-dir=' + os.path.realpath(output_directory)],
Packit 2035a7
        cwd=os.path.join(ROOT_DIR, 'htmlreport'))
Packit 2035a7
Packit 2035a7
    with open(os.path.join(output_directory, 'index.html')) as index_file:
Packit 2035a7
        index_contents = index_file.read()
Packit 2035a7
Packit 2035a7
    yield (index_contents, output_directory)
Packit 2035a7
Packit 2035a7
    shutil.rmtree(output_directory)
Packit 2035a7
Packit 2035a7
Packit 2035a7
if __name__ == '__main__':
Packit 2035a7
    unittest.main()