1"""Tests for distutils.command.build_clib.""" 2import unittest 3import os 4import sys 5 6from test.support import run_unittest 7 8from .py35compat import missing_compiler_executable 9 10from distutils.command.build_clib import build_clib 11from distutils.errors import DistutilsSetupError 12from distutils.tests import support 13 14class BuildCLibTestCase(support.TempdirManager, 15 support.LoggingSilencer, 16 unittest.TestCase): 17 18 def test_check_library_dist(self): 19 pkg_dir, dist = self.create_dist() 20 cmd = build_clib(dist) 21 22 # 'libraries' option must be a list 23 self.assertRaises(DistutilsSetupError, cmd.check_library_list, 'foo') 24 25 # each element of 'libraries' must a 2-tuple 26 self.assertRaises(DistutilsSetupError, cmd.check_library_list, 27 ['foo1', 'foo2']) 28 29 # first element of each tuple in 'libraries' 30 # must be a string (the library name) 31 self.assertRaises(DistutilsSetupError, cmd.check_library_list, 32 [(1, 'foo1'), ('name', 'foo2')]) 33 34 # library name may not contain directory separators 35 self.assertRaises(DistutilsSetupError, cmd.check_library_list, 36 [('name', 'foo1'), 37 ('another/name', 'foo2')]) 38 39 # second element of each tuple must be a dictionary (build info) 40 self.assertRaises(DistutilsSetupError, cmd.check_library_list, 41 [('name', {}), 42 ('another', 'foo2')]) 43 44 # those work 45 libs = [('name', {}), ('name', {'ok': 'good'})] 46 cmd.check_library_list(libs) 47 48 def test_get_source_files(self): 49 pkg_dir, dist = self.create_dist() 50 cmd = build_clib(dist) 51 52 # "in 'libraries' option 'sources' must be present and must be 53 # a list of source filenames 54 cmd.libraries = [('name', {})] 55 self.assertRaises(DistutilsSetupError, cmd.get_source_files) 56 57 cmd.libraries = [('name', {'sources': 1})] 58 self.assertRaises(DistutilsSetupError, cmd.get_source_files) 59 60 cmd.libraries = [('name', {'sources': ['a', 'b']})] 61 self.assertEqual(cmd.get_source_files(), ['a', 'b']) 62 63 cmd.libraries = [('name', {'sources': ('a', 'b')})] 64 self.assertEqual(cmd.get_source_files(), ['a', 'b']) 65 66 cmd.libraries = [('name', {'sources': ('a', 'b')}), 67 ('name2', {'sources': ['c', 'd']})] 68 self.assertEqual(cmd.get_source_files(), ['a', 'b', 'c', 'd']) 69 70 def test_build_libraries(self): 71 72 pkg_dir, dist = self.create_dist() 73 cmd = build_clib(dist) 74 class FakeCompiler: 75 def compile(*args, **kw): 76 pass 77 create_static_lib = compile 78 79 cmd.compiler = FakeCompiler() 80 81 # build_libraries is also doing a bit of typo checking 82 lib = [('name', {'sources': 'notvalid'})] 83 self.assertRaises(DistutilsSetupError, cmd.build_libraries, lib) 84 85 lib = [('name', {'sources': list()})] 86 cmd.build_libraries(lib) 87 88 lib = [('name', {'sources': tuple()})] 89 cmd.build_libraries(lib) 90 91 def test_finalize_options(self): 92 pkg_dir, dist = self.create_dist() 93 cmd = build_clib(dist) 94 95 cmd.include_dirs = 'one-dir' 96 cmd.finalize_options() 97 self.assertEqual(cmd.include_dirs, ['one-dir']) 98 99 cmd.include_dirs = None 100 cmd.finalize_options() 101 self.assertEqual(cmd.include_dirs, []) 102 103 cmd.distribution.libraries = 'WONTWORK' 104 self.assertRaises(DistutilsSetupError, cmd.finalize_options) 105 106 @unittest.skipIf(sys.platform == 'win32', "can't test on Windows") 107 def test_run(self): 108 pkg_dir, dist = self.create_dist() 109 cmd = build_clib(dist) 110 111 foo_c = os.path.join(pkg_dir, 'foo.c') 112 self.write_file(foo_c, 'int main(void) { return 1;}\n') 113 cmd.libraries = [('foo', {'sources': [foo_c]})] 114 115 build_temp = os.path.join(pkg_dir, 'build') 116 os.mkdir(build_temp) 117 cmd.build_temp = build_temp 118 cmd.build_clib = build_temp 119 120 # Before we run the command, we want to make sure 121 # all commands are present on the system. 122 ccmd = missing_compiler_executable() 123 if ccmd is not None: 124 self.skipTest('The %r command is not found' % ccmd) 125 126 # this should work 127 cmd.run() 128 129 # let's check the result 130 self.assertIn('libfoo.a', os.listdir(build_temp)) 131 132def test_suite(): 133 return unittest.TestLoader().loadTestsFromTestCase(BuildCLibTestCase) 134 135if __name__ == "__main__": 136 run_unittest(test_suite()) 137