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