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