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