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 libscanbuild.compilation as sut 7*e5dd7070Spatrickimport unittest 8*e5dd7070Spatrick 9*e5dd7070Spatrick 10*e5dd7070Spatrickclass CompilerTest(unittest.TestCase): 11*e5dd7070Spatrick 12*e5dd7070Spatrick def test_is_compiler_call(self): 13*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['clang'])) 14*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['clang-3.6'])) 15*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['clang++'])) 16*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['clang++-3.5.1'])) 17*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['cc'])) 18*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['c++'])) 19*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['gcc'])) 20*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['g++'])) 21*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['/usr/local/bin/gcc'])) 22*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['/usr/local/bin/g++'])) 23*e5dd7070Spatrick self.assertIsNotNone(sut.compiler_language(['/usr/local/bin/clang'])) 24*e5dd7070Spatrick self.assertIsNotNone( 25*e5dd7070Spatrick sut.compiler_language(['armv7_neno-linux-gnueabi-g++'])) 26*e5dd7070Spatrick 27*e5dd7070Spatrick self.assertIsNone(sut.compiler_language([])) 28*e5dd7070Spatrick self.assertIsNone(sut.compiler_language([''])) 29*e5dd7070Spatrick self.assertIsNone(sut.compiler_language(['ld'])) 30*e5dd7070Spatrick self.assertIsNone(sut.compiler_language(['as'])) 31*e5dd7070Spatrick self.assertIsNone(sut.compiler_language(['/usr/local/bin/compiler'])) 32*e5dd7070Spatrick 33*e5dd7070Spatrick 34*e5dd7070Spatrickclass SplitTest(unittest.TestCase): 35*e5dd7070Spatrick 36*e5dd7070Spatrick def test_detect_cxx_from_compiler_name(self): 37*e5dd7070Spatrick def test(cmd): 38*e5dd7070Spatrick result = sut.split_command([cmd, '-c', 'src.c']) 39*e5dd7070Spatrick self.assertIsNotNone(result, "wrong input for test") 40*e5dd7070Spatrick return result.compiler == 'c++' 41*e5dd7070Spatrick 42*e5dd7070Spatrick self.assertFalse(test('cc')) 43*e5dd7070Spatrick self.assertFalse(test('gcc')) 44*e5dd7070Spatrick self.assertFalse(test('clang')) 45*e5dd7070Spatrick 46*e5dd7070Spatrick self.assertTrue(test('c++')) 47*e5dd7070Spatrick self.assertTrue(test('g++')) 48*e5dd7070Spatrick self.assertTrue(test('g++-5.3.1')) 49*e5dd7070Spatrick self.assertTrue(test('clang++')) 50*e5dd7070Spatrick self.assertTrue(test('clang++-3.7.1')) 51*e5dd7070Spatrick self.assertTrue(test('armv7_neno-linux-gnueabi-g++')) 52*e5dd7070Spatrick 53*e5dd7070Spatrick def test_action(self): 54*e5dd7070Spatrick self.assertIsNotNone(sut.split_command(['clang', 'source.c'])) 55*e5dd7070Spatrick self.assertIsNotNone(sut.split_command(['clang', '-c', 'source.c'])) 56*e5dd7070Spatrick self.assertIsNotNone(sut.split_command(['clang', '-c', 'source.c', 57*e5dd7070Spatrick '-MF', 'a.d'])) 58*e5dd7070Spatrick 59*e5dd7070Spatrick self.assertIsNone(sut.split_command(['clang', '-E', 'source.c'])) 60*e5dd7070Spatrick self.assertIsNone(sut.split_command(['clang', '-c', '-E', 'source.c'])) 61*e5dd7070Spatrick self.assertIsNone(sut.split_command(['clang', '-c', '-M', 'source.c'])) 62*e5dd7070Spatrick self.assertIsNone( 63*e5dd7070Spatrick sut.split_command(['clang', '-c', '-MM', 'source.c'])) 64*e5dd7070Spatrick 65*e5dd7070Spatrick def test_source_file(self): 66*e5dd7070Spatrick def test(expected, cmd): 67*e5dd7070Spatrick self.assertEqual(expected, sut.split_command(cmd).files) 68*e5dd7070Spatrick 69*e5dd7070Spatrick test(['src.c'], ['clang', 'src.c']) 70*e5dd7070Spatrick test(['src.c'], ['clang', '-c', 'src.c']) 71*e5dd7070Spatrick test(['src.C'], ['clang', '-x', 'c', 'src.C']) 72*e5dd7070Spatrick test(['src.cpp'], ['clang++', '-c', 'src.cpp']) 73*e5dd7070Spatrick test(['s1.c', 's2.c'], ['clang', '-c', 's1.c', 's2.c']) 74*e5dd7070Spatrick test(['s1.c', 's2.c'], ['cc', 's1.c', 's2.c', '-ldep', '-o', 'a.out']) 75*e5dd7070Spatrick test(['src.c'], ['clang', '-c', '-I', './include', 'src.c']) 76*e5dd7070Spatrick test(['src.c'], ['clang', '-c', '-I', '/opt/me/include', 'src.c']) 77*e5dd7070Spatrick test(['src.c'], ['clang', '-c', '-D', 'config=file.c', 'src.c']) 78*e5dd7070Spatrick 79*e5dd7070Spatrick self.assertIsNone( 80*e5dd7070Spatrick sut.split_command(['cc', 'this.o', 'that.o', '-o', 'a.out'])) 81*e5dd7070Spatrick self.assertIsNone( 82*e5dd7070Spatrick sut.split_command(['cc', 'this.o', '-lthat', '-o', 'a.out'])) 83*e5dd7070Spatrick 84*e5dd7070Spatrick def test_filter_flags(self): 85*e5dd7070Spatrick def test(expected, flags): 86*e5dd7070Spatrick command = ['clang', '-c', 'src.c'] + flags 87*e5dd7070Spatrick self.assertEqual(expected, sut.split_command(command).flags) 88*e5dd7070Spatrick 89*e5dd7070Spatrick def same(expected): 90*e5dd7070Spatrick test(expected, expected) 91*e5dd7070Spatrick 92*e5dd7070Spatrick def filtered(flags): 93*e5dd7070Spatrick test([], flags) 94*e5dd7070Spatrick 95*e5dd7070Spatrick same([]) 96*e5dd7070Spatrick same(['-I', '/opt/me/include', '-DNDEBUG', '-ULIMITS']) 97*e5dd7070Spatrick same(['-O', '-O2']) 98*e5dd7070Spatrick same(['-m32', '-mmms']) 99*e5dd7070Spatrick same(['-Wall', '-Wno-unused', '-g', '-funroll-loops']) 100*e5dd7070Spatrick 101*e5dd7070Spatrick filtered([]) 102*e5dd7070Spatrick filtered(['-lclien', '-L/opt/me/lib', '-L', '/opt/you/lib']) 103*e5dd7070Spatrick filtered(['-static']) 104*e5dd7070Spatrick filtered(['-MD', '-MT', 'something']) 105*e5dd7070Spatrick filtered(['-MMD', '-MF', 'something']) 106*e5dd7070Spatrick 107*e5dd7070Spatrick 108*e5dd7070Spatrickclass SourceClassifierTest(unittest.TestCase): 109*e5dd7070Spatrick 110*e5dd7070Spatrick def test_sources(self): 111*e5dd7070Spatrick self.assertIsNone(sut.classify_source('file.o')) 112*e5dd7070Spatrick self.assertIsNone(sut.classify_source('file.exe')) 113*e5dd7070Spatrick self.assertIsNone(sut.classify_source('/path/file.o')) 114*e5dd7070Spatrick self.assertIsNone(sut.classify_source('clang')) 115*e5dd7070Spatrick 116*e5dd7070Spatrick self.assertEqual('c', sut.classify_source('file.c')) 117*e5dd7070Spatrick self.assertEqual('c', sut.classify_source('./file.c')) 118*e5dd7070Spatrick self.assertEqual('c', sut.classify_source('/path/file.c')) 119*e5dd7070Spatrick self.assertEqual('c++', sut.classify_source('file.c', False)) 120*e5dd7070Spatrick self.assertEqual('c++', sut.classify_source('./file.c', False)) 121*e5dd7070Spatrick self.assertEqual('c++', sut.classify_source('/path/file.c', False)) 122