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