Home | History | Annotate | Line # | Download | only in unit
      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 
      6 import libear
      7 import libscanbuild.clang as sut
      8 import unittest
      9 import os.path
     10 import sys
     11 
     12 
     13 class 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 
     22 class 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"'],
     31                 tmpdir)
     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 
     45 class 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         result = dict(sut.parse_checkers(lines))
     90         self.assertTrue('checker.one' in result)
     91         self.assertEqual('Checker One description', result.get('checker.one'))
     92         self.assertTrue('checker.two' in result)
     93         self.assertEqual('Checker Two description', result.get('checker.two'))
     94 
     95 
     96 class ClangIsCtuCapableTest(unittest.TestCase):
     97     def test_ctu_not_found(self):
     98         is_ctu = sut.is_ctu_capable('not-found-clang-extdef-mapping')
     99         self.assertFalse(is_ctu)
    100 
    101 
    102 class ClangGetTripleArchTest(unittest.TestCase):
    103     def test_arch_is_not_empty(self):
    104         arch = sut.get_triple_arch(['clang', '-E', '-'], '.')
    105         self.assertTrue(len(arch) > 0)
    106