Home | History | Annotate | Download | only in cases
      1 # -*- coding: utf-8 -*-
      2 #                     The LLVM Compiler Infrastructure
      3 #
      4 # This file is distributed under the University of Illinois Open Source
      5 # License. See LICENSE.TXT for details.
      6 
      7 import libear
      8 from . import call_and_report
      9 import unittest
     10 
     11 import os.path
     12 import string
     13 import glob
     14 
     15 
     16 def prepare_cdb(name, target_dir):
     17     target_file = 'build_{0}.json'.format(name)
     18     this_dir, _ = os.path.split(__file__)
     19     path = os.path.normpath(os.path.join(this_dir, '..', 'src'))
     20     source_dir = os.path.join(path, 'compilation_database')
     21     source_file = os.path.join(source_dir, target_file + '.in')
     22     target_file = os.path.join(target_dir, 'compile_commands.json')
     23     with open(source_file, 'r') as in_handle:
     24         with open(target_file, 'w') as out_handle:
     25             for line in in_handle:
     26                 temp = string.Template(line)
     27                 out_handle.write(temp.substitute(path=path))
     28     return target_file
     29 
     30 
     31 def run_analyzer(directory, cdb, args):
     32     cmd = ['analyze-build', '--cdb', cdb, '--output', directory] \
     33         + args
     34     return call_and_report(cmd, [])
     35 
     36 
     37 class OutputDirectoryTest(unittest.TestCase):
     38     def test_regular_keeps_report_dir(self):
     39         with libear.TemporaryDirectory() as tmpdir:
     40             cdb = prepare_cdb('regular', tmpdir)
     41             exit_code, reportdir = run_analyzer(tmpdir, cdb, [])
     42             self.assertTrue(os.path.isdir(reportdir))
     43 
     44     def test_clear_deletes_report_dir(self):
     45         with libear.TemporaryDirectory() as tmpdir:
     46             cdb = prepare_cdb('clean', tmpdir)
     47             exit_code, reportdir = run_analyzer(tmpdir, cdb, [])
     48             self.assertFalse(os.path.isdir(reportdir))
     49 
     50     def test_clear_keeps_report_dir_when_asked(self):
     51         with libear.TemporaryDirectory() as tmpdir:
     52             cdb = prepare_cdb('clean', tmpdir)
     53             exit_code, reportdir = run_analyzer(tmpdir, cdb, ['--keep-empty'])
     54             self.assertTrue(os.path.isdir(reportdir))
     55 
     56 
     57 class ExitCodeTest(unittest.TestCase):
     58     def test_regular_does_not_set_exit_code(self):
     59         with libear.TemporaryDirectory() as tmpdir:
     60             cdb = prepare_cdb('regular', tmpdir)
     61             exit_code, __ = run_analyzer(tmpdir, cdb, [])
     62             self.assertFalse(exit_code)
     63 
     64     def test_clear_does_not_set_exit_code(self):
     65         with libear.TemporaryDirectory() as tmpdir:
     66             cdb = prepare_cdb('clean', tmpdir)
     67             exit_code, __ = run_analyzer(tmpdir, cdb, [])
     68             self.assertFalse(exit_code)
     69 
     70     def test_regular_sets_exit_code_if_asked(self):
     71         with libear.TemporaryDirectory() as tmpdir:
     72             cdb = prepare_cdb('regular', tmpdir)
     73             exit_code, __ = run_analyzer(tmpdir, cdb, ['--status-bugs'])
     74             self.assertTrue(exit_code)
     75 
     76     def test_clear_does_not_set_exit_code_if_asked(self):
     77         with libear.TemporaryDirectory() as tmpdir:
     78             cdb = prepare_cdb('clean', tmpdir)
     79             exit_code, __ = run_analyzer(tmpdir, cdb, ['--status-bugs'])
     80             self.assertFalse(exit_code)
     81 
     82     def test_regular_sets_exit_code_if_asked_from_plist(self):
     83         with libear.TemporaryDirectory() as tmpdir:
     84             cdb = prepare_cdb('regular', tmpdir)
     85             exit_code, __ = run_analyzer(
     86                 tmpdir, cdb, ['--status-bugs', '--plist'])
     87             self.assertTrue(exit_code)
     88 
     89     def test_clear_does_not_set_exit_code_if_asked_from_plist(self):
     90         with libear.TemporaryDirectory() as tmpdir:
     91             cdb = prepare_cdb('clean', tmpdir)
     92             exit_code, __ = run_analyzer(
     93                 tmpdir, cdb, ['--status-bugs', '--plist'])
     94             self.assertFalse(exit_code)
     95 
     96 
     97 class OutputFormatTest(unittest.TestCase):
     98     @staticmethod
     99     def get_html_count(directory):
    100         return len(glob.glob(os.path.join(directory, 'report-*.html')))
    101 
    102     @staticmethod
    103     def get_plist_count(directory):
    104         return len(glob.glob(os.path.join(directory, 'report-*.plist')))
    105 
    106     def test_default_creates_html_report(self):
    107         with libear.TemporaryDirectory() as tmpdir:
    108             cdb = prepare_cdb('regular', tmpdir)
    109             exit_code, reportdir = run_analyzer(tmpdir, cdb, [])
    110             self.assertTrue(
    111                 os.path.exists(os.path.join(reportdir, 'index.html')))
    112             self.assertEqual(self.get_html_count(reportdir), 2)
    113             self.assertEqual(self.get_plist_count(reportdir), 0)
    114 
    115     def test_plist_and_html_creates_html_report(self):
    116         with libear.TemporaryDirectory() as tmpdir:
    117             cdb = prepare_cdb('regular', tmpdir)
    118             exit_code, reportdir = run_analyzer(tmpdir, cdb, ['--plist-html'])
    119             self.assertTrue(
    120                 os.path.exists(os.path.join(reportdir, 'index.html')))
    121             self.assertEqual(self.get_html_count(reportdir), 2)
    122             self.assertEqual(self.get_plist_count(reportdir), 5)
    123 
    124     def test_plist_does_not_creates_html_report(self):
    125         with libear.TemporaryDirectory() as tmpdir:
    126             cdb = prepare_cdb('regular', tmpdir)
    127             exit_code, reportdir = run_analyzer(tmpdir, cdb, ['--plist'])
    128             self.assertFalse(
    129                 os.path.exists(os.path.join(reportdir, 'index.html')))
    130             self.assertEqual(self.get_html_count(reportdir), 0)
    131             self.assertEqual(self.get_plist_count(reportdir), 5)
    132 
    133 
    134 class FailureReportTest(unittest.TestCase):
    135     def test_broken_creates_failure_reports(self):
    136         with libear.TemporaryDirectory() as tmpdir:
    137             cdb = prepare_cdb('broken', tmpdir)
    138             exit_code, reportdir = run_analyzer(tmpdir, cdb, [])
    139             self.assertTrue(
    140                 os.path.isdir(os.path.join(reportdir, 'failures')))
    141 
    142     def test_broken_does_not_creates_failure_reports(self):
    143         with libear.TemporaryDirectory() as tmpdir:
    144             cdb = prepare_cdb('broken', tmpdir)
    145             exit_code, reportdir = run_analyzer(
    146                 tmpdir, cdb, ['--no-failure-reports'])
    147             self.assertFalse(
    148                 os.path.isdir(os.path.join(reportdir, 'failures')))
    149 
    150 
    151 class TitleTest(unittest.TestCase):
    152     def assertTitleEqual(self, directory, expected):
    153         import re
    154         patterns = [
    155             re.compile(r'<title>(?P<page>.*)</title>'),
    156             re.compile(r'<h1>(?P<head>.*)</h1>')
    157         ]
    158         result = dict()
    159 
    160         index = os.path.join(directory, 'index.html')
    161         with open(index, 'r') as handler:
    162             for line in handler.readlines():
    163                 for regex in patterns:
    164                     match = regex.match(line.strip())
    165                     if match:
    166                         result.update(match.groupdict())
    167                         break
    168         self.assertEqual(result['page'], result['head'])
    169         self.assertEqual(result['page'], expected)
    170 
    171     def test_default_title_in_report(self):
    172         with libear.TemporaryDirectory() as tmpdir:
    173             cdb = prepare_cdb('broken', tmpdir)
    174             exit_code, reportdir = run_analyzer(tmpdir, cdb, [])
    175             self.assertTitleEqual(reportdir, 'src - analyzer results')
    176 
    177     def test_given_title_in_report(self):
    178         with libear.TemporaryDirectory() as tmpdir:
    179             cdb = prepare_cdb('broken', tmpdir)
    180             exit_code, reportdir = run_analyzer(
    181                 tmpdir, cdb, ['--html-title', 'this is the title'])
    182             self.assertTitleEqual(reportdir, 'this is the title')
    183