#!/usr/bin/env python2.7 """Test internal functions within check_cfc.py.""" import check_cfc import os import platform import unittest class TestCheckCFC(unittest.TestCase): def test_flip_dash_g(self): self.assertIn('-g', check_cfc.flip_dash_g(['clang', '-c'])) self.assertNotIn('-g', check_cfc.flip_dash_g(['clang', '-c', '-g'])) self.assertNotIn( '-g', check_cfc.flip_dash_g(['clang', '-g', '-c', '-g'])) def test_remove_dir_from_path(self): bin_path = r'/usr/bin' space_path = r'/home/user/space in path' superstring_path = r'/usr/bin/local' # Test removing last thing in path self.assertNotIn( bin_path, check_cfc.remove_dir_from_path(bin_path, bin_path)) # Test removing one entry and leaving others # Also tests removing repeated path path_var = os.pathsep.join( [superstring_path, bin_path, space_path, bin_path]) stripped_path_var = check_cfc.remove_dir_from_path(path_var, bin_path) self.assertIn(superstring_path, stripped_path_var) self.assertNotIn(bin_path, stripped_path_var.split(os.pathsep)) self.assertIn(space_path, stripped_path_var) # Test removing non-canonical path self.assertNotIn(r'/usr//bin', check_cfc.remove_dir_from_path(r'/usr//bin', bin_path)) if platform == 'Windows': # Windows is case insensitive so should remove a different case # path self.assertNotIn( bin_path, check_cfc.remove_dir_from_path(path_var, r'/USR/BIN')) else: # Case sensitive so will not remove different case path self.assertIn( bin_path, check_cfc.remove_dir_from_path(path_var, r'/USR/BIN')) def test_is_output_specified(self): self.assertTrue( check_cfc.is_output_specified(['clang', '-o', 'test.o'])) self.assertTrue(check_cfc.is_output_specified(['clang', '-otest.o'])) self.assertFalse( check_cfc.is_output_specified(['clang', '-gline-tables-only'])) # Not specified for implied output file name self.assertFalse(check_cfc.is_output_specified(['clang', 'test.c'])) def test_get_output_file(self): self.assertEqual( check_cfc.get_output_file(['clang', '-o', 'test.o']), 'test.o') self.assertEqual( check_cfc.get_output_file(['clang', '-otest.o']), 'test.o') self.assertIsNone( check_cfc.get_output_file(['clang', '-gline-tables-only'])) # Can't get output file if more than one input file self.assertIsNone( check_cfc.get_output_file(['clang', '-c', 'test.cpp', 'test2.cpp'])) # No output file specified self.assertIsNone(check_cfc.get_output_file(['clang', '-c', 'test.c'])) def test_derive_output_file(self): # Test getting implicit output file self.assertEqual( check_cfc.derive_output_file(['clang', '-c', 'test.c']), 'test.o') self.assertEqual( check_cfc.derive_output_file(['clang', '-c', 'test.cpp']), 'test.o') self.assertIsNone(check_cfc.derive_output_file(['clang', '--version'])) def test_is_normal_compile(self): self.assertTrue(check_cfc.is_normal_compile( ['clang', '-c', 'test.cpp', '-o', 'test2.o'])) self.assertTrue( check_cfc.is_normal_compile(['clang', '-c', 'test.cpp'])) # Outputting bitcode is not a normal compile self.assertFalse( check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '-flto'])) self.assertFalse( check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '-emit-llvm'])) # Outputting preprocessed output or assembly is not a normal compile self.assertFalse( check_cfc.is_normal_compile(['clang', '-E', 'test.cpp', '-o', 'test.ii'])) self.assertFalse( check_cfc.is_normal_compile(['clang', '-S', 'test.cpp', '-o', 'test.s'])) # Input of preprocessed or assembly is not a "normal compile" self.assertFalse( check_cfc.is_normal_compile(['clang', '-c', 'test.s', '-o', 'test.o'])) self.assertFalse( check_cfc.is_normal_compile(['clang', '-c', 'test.ii', '-o', 'test.o'])) # Specifying --version and -c is not a normal compile self.assertFalse( check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '--version'])) self.assertFalse( check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '--help'])) # Outputting dependency files is not a normal compile self.assertFalse( check_cfc.is_normal_compile(['clang', '-c', '-M', 'test.cpp'])) self.assertFalse( check_cfc.is_normal_compile(['clang', '-c', '-MM', 'test.cpp'])) # Creating a dependency file as a side effect still outputs an object file self.assertTrue( check_cfc.is_normal_compile(['clang', '-c', '-MD', 'test.cpp'])) self.assertTrue( check_cfc.is_normal_compile(['clang', '-c', '-MMD', 'test.cpp'])) def test_replace_output_file(self): self.assertEqual(check_cfc.replace_output_file( ['clang', '-o', 'test.o'], 'testg.o'), ['clang', '-o', 'testg.o']) self.assertEqual(check_cfc.replace_output_file( ['clang', '-otest.o'], 'testg.o'), ['clang', '-otestg.o']) with self.assertRaises(Exception): check_cfc.replace_output_file(['clang'], 'testg.o') def test_add_output_file(self): self.assertEqual(check_cfc.add_output_file( ['clang'], 'testg.o'), ['clang', '-o', 'testg.o']) def test_set_output_file(self): # Test output not specified self.assertEqual( check_cfc.set_output_file(['clang'], 'test.o'), ['clang', '-o', 'test.o']) # Test output is specified self.assertEqual(check_cfc.set_output_file( ['clang', '-o', 'test.o'], 'testb.o'), ['clang', '-o', 'testb.o']) def test_get_input_file(self): # No input file self.assertIsNone(check_cfc.get_input_file(['clang'])) # Input C file self.assertEqual( check_cfc.get_input_file(['clang', 'test.c']), 'test.c') # Input C++ file self.assertEqual( check_cfc.get_input_file(['clang', 'test.cpp']), 'test.cpp') # Multiple input files self.assertIsNone( check_cfc.get_input_file(['clang', 'test.c', 'test2.cpp'])) self.assertIsNone( check_cfc.get_input_file(['clang', 'test.c', 'test2.c'])) # Don't handle preprocessed files self.assertIsNone(check_cfc.get_input_file(['clang', 'test.i'])) self.assertIsNone(check_cfc.get_input_file(['clang', 'test.ii'])) # Test identifying input file with quotes self.assertEqual( check_cfc.get_input_file(['clang', '"test.c"']), '"test.c"') self.assertEqual( check_cfc.get_input_file(['clang', "'test.c'"]), "'test.c'") # Test multiple quotes self.assertEqual( check_cfc.get_input_file(['clang', "\"'test.c'\""]), "\"'test.c'\"") def test_set_input_file(self): self.assertEqual(check_cfc.set_input_file( ['clang', 'test.c'], 'test.s'), ['clang', 'test.s']) if __name__ == '__main__': unittest.main()