xref: /llvm-project/clang/tools/scan-build-py/tests/unit/test_clang.py (revision 8c48705a19753ea10a99fd0223c5eee75de776cb)
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
7import libear
8import libscanbuild.clang as sut
9import unittest
10import os.path
11import sys
12
13
14class ClangGetVersion(unittest.TestCase):
15    def test_get_version_is_not_empty(self):
16        self.assertTrue(sut.get_version('clang'))
17
18    def test_get_version_throws(self):
19        with self.assertRaises(OSError):
20            sut.get_version('notexists')
21
22
23class ClangGetArgumentsTest(unittest.TestCase):
24    def test_get_clang_arguments(self):
25        with libear.TemporaryDirectory() as tmpdir:
26            filename = os.path.join(tmpdir, 'test.c')
27            with open(filename, 'w') as handle:
28                handle.write('')
29
30            result = sut.get_arguments(
31                ['clang', '-c', filename, '-DNDEBUG', '-Dvar="this is it"'],
32                tmpdir)
33
34            self.assertTrue('NDEBUG' in result)
35            self.assertTrue('var="this is it"' in result)
36
37    def test_get_clang_arguments_fails(self):
38        with self.assertRaises(Exception):
39            sut.get_arguments(['clang', '-x', 'c', 'notexist.c'], '.')
40
41    def test_get_clang_arguments_fails_badly(self):
42        with self.assertRaises(OSError):
43            sut.get_arguments(['notexist'], '.')
44
45
46class ClangGetCheckersTest(unittest.TestCase):
47    def test_get_checkers(self):
48        # this test is only to see is not crashing
49        result = sut.get_checkers('clang', [])
50        self.assertTrue(len(result))
51        # do check result types
52        string_type = unicode if sys.version_info < (3,) else str
53        for key, value in result.items():
54            self.assertEqual(string_type, type(key))
55            self.assertEqual(string_type, type(value[0]))
56            self.assertEqual(bool, type(value[1]))
57
58    def test_get_active_checkers(self):
59        # this test is only to see is not crashing
60        result = sut.get_active_checkers('clang', [])
61        self.assertTrue(len(result))
62        # do check result types
63        for value in result:
64            self.assertEqual(str, type(value))
65
66    def test_is_active(self):
67        test = sut.is_active(['a', 'b.b', 'c.c.c'])
68
69        self.assertTrue(test('a'))
70        self.assertTrue(test('a.b'))
71        self.assertTrue(test('b.b'))
72        self.assertTrue(test('b.b.c'))
73        self.assertTrue(test('c.c.c.p'))
74
75        self.assertFalse(test('ab'))
76        self.assertFalse(test('ba'))
77        self.assertFalse(test('bb'))
78        self.assertFalse(test('c.c'))
79        self.assertFalse(test('b'))
80        self.assertFalse(test('d'))
81
82    def test_parse_checkers(self):
83        lines = [
84            'OVERVIEW: Clang Static Analyzer Checkers List',
85            '',
86            'CHECKERS:',
87            '  checker.one       Checker One description',
88            '  checker.two',
89            '                    Checker Two description']
90        result = dict(sut.parse_checkers(lines))
91        self.assertTrue('checker.one' in result)
92        self.assertEqual('Checker One description', result.get('checker.one'))
93        self.assertTrue('checker.two' in result)
94        self.assertEqual('Checker Two description', result.get('checker.two'))
95
96
97class ClangIsCtuCapableTest(unittest.TestCase):
98    def test_ctu_not_found(self):
99        is_ctu = sut.is_ctu_capable('not-found-clang-extdef-mapping')
100        self.assertFalse(is_ctu)
101
102
103class ClangGetTripleArchTest(unittest.TestCase):
104    def test_arch_is_not_empty(self):
105        arch = sut.get_triple_arch(['clang', '-E', '-'], '.')
106        self.assertTrue(len(arch) > 0)
107