17db96d56Sopenharmony_ci"""Tests for distutils.command.build_clib.""" 27db96d56Sopenharmony_ciimport unittest 37db96d56Sopenharmony_ciimport os 47db96d56Sopenharmony_ciimport sys 57db96d56Sopenharmony_ciimport sysconfig 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_cifrom test.support import ( 87db96d56Sopenharmony_ci run_unittest, missing_compiler_executable, requires_subprocess 97db96d56Sopenharmony_ci) 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_cifrom distutils.command.build_clib import build_clib 127db96d56Sopenharmony_cifrom distutils.errors import DistutilsSetupError 137db96d56Sopenharmony_cifrom distutils.tests import support 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ciclass BuildCLibTestCase(support.TempdirManager, 167db96d56Sopenharmony_ci support.LoggingSilencer, 177db96d56Sopenharmony_ci unittest.TestCase): 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci def setUp(self): 207db96d56Sopenharmony_ci super().setUp() 217db96d56Sopenharmony_ci self._backup_CONFIG_VARS = dict(sysconfig._CONFIG_VARS) 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ci def tearDown(self): 247db96d56Sopenharmony_ci super().tearDown() 257db96d56Sopenharmony_ci sysconfig._CONFIG_VARS.clear() 267db96d56Sopenharmony_ci sysconfig._CONFIG_VARS.update(self._backup_CONFIG_VARS) 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci def test_check_library_dist(self): 297db96d56Sopenharmony_ci pkg_dir, dist = self.create_dist() 307db96d56Sopenharmony_ci cmd = build_clib(dist) 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci # 'libraries' option must be a list 337db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.check_library_list, 'foo') 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci # each element of 'libraries' must a 2-tuple 367db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.check_library_list, 377db96d56Sopenharmony_ci ['foo1', 'foo2']) 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci # first element of each tuple in 'libraries' 407db96d56Sopenharmony_ci # must be a string (the library name) 417db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.check_library_list, 427db96d56Sopenharmony_ci [(1, 'foo1'), ('name', 'foo2')]) 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci # library name may not contain directory separators 457db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.check_library_list, 467db96d56Sopenharmony_ci [('name', 'foo1'), 477db96d56Sopenharmony_ci ('another/name', 'foo2')]) 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci # second element of each tuple must be a dictionary (build info) 507db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.check_library_list, 517db96d56Sopenharmony_ci [('name', {}), 527db96d56Sopenharmony_ci ('another', 'foo2')]) 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci # those work 557db96d56Sopenharmony_ci libs = [('name', {}), ('name', {'ok': 'good'})] 567db96d56Sopenharmony_ci cmd.check_library_list(libs) 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci def test_get_source_files(self): 597db96d56Sopenharmony_ci pkg_dir, dist = self.create_dist() 607db96d56Sopenharmony_ci cmd = build_clib(dist) 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci # "in 'libraries' option 'sources' must be present and must be 637db96d56Sopenharmony_ci # a list of source filenames 647db96d56Sopenharmony_ci cmd.libraries = [('name', {})] 657db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.get_source_files) 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci cmd.libraries = [('name', {'sources': 1})] 687db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.get_source_files) 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci cmd.libraries = [('name', {'sources': ['a', 'b']})] 717db96d56Sopenharmony_ci self.assertEqual(cmd.get_source_files(), ['a', 'b']) 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci cmd.libraries = [('name', {'sources': ('a', 'b')})] 747db96d56Sopenharmony_ci self.assertEqual(cmd.get_source_files(), ['a', 'b']) 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci cmd.libraries = [('name', {'sources': ('a', 'b')}), 777db96d56Sopenharmony_ci ('name2', {'sources': ['c', 'd']})] 787db96d56Sopenharmony_ci self.assertEqual(cmd.get_source_files(), ['a', 'b', 'c', 'd']) 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci def test_build_libraries(self): 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci pkg_dir, dist = self.create_dist() 837db96d56Sopenharmony_ci cmd = build_clib(dist) 847db96d56Sopenharmony_ci class FakeCompiler: 857db96d56Sopenharmony_ci def compile(*args, **kw): 867db96d56Sopenharmony_ci pass 877db96d56Sopenharmony_ci create_static_lib = compile 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci cmd.compiler = FakeCompiler() 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci # build_libraries is also doing a bit of typo checking 927db96d56Sopenharmony_ci lib = [('name', {'sources': 'notvalid'})] 937db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.build_libraries, lib) 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci lib = [('name', {'sources': list()})] 967db96d56Sopenharmony_ci cmd.build_libraries(lib) 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci lib = [('name', {'sources': tuple()})] 997db96d56Sopenharmony_ci cmd.build_libraries(lib) 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci def test_finalize_options(self): 1027db96d56Sopenharmony_ci pkg_dir, dist = self.create_dist() 1037db96d56Sopenharmony_ci cmd = build_clib(dist) 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci cmd.include_dirs = 'one-dir' 1067db96d56Sopenharmony_ci cmd.finalize_options() 1077db96d56Sopenharmony_ci self.assertEqual(cmd.include_dirs, ['one-dir']) 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci cmd.include_dirs = None 1107db96d56Sopenharmony_ci cmd.finalize_options() 1117db96d56Sopenharmony_ci self.assertEqual(cmd.include_dirs, []) 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci cmd.distribution.libraries = 'WONTWORK' 1147db96d56Sopenharmony_ci self.assertRaises(DistutilsSetupError, cmd.finalize_options) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci @unittest.skipIf(sys.platform == 'win32', "can't test on Windows") 1177db96d56Sopenharmony_ci @requires_subprocess() 1187db96d56Sopenharmony_ci def test_run(self): 1197db96d56Sopenharmony_ci pkg_dir, dist = self.create_dist() 1207db96d56Sopenharmony_ci cmd = build_clib(dist) 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci foo_c = os.path.join(pkg_dir, 'foo.c') 1237db96d56Sopenharmony_ci self.write_file(foo_c, 'int main(void) { return 1;}\n') 1247db96d56Sopenharmony_ci cmd.libraries = [('foo', {'sources': [foo_c]})] 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci build_temp = os.path.join(pkg_dir, 'build') 1277db96d56Sopenharmony_ci os.mkdir(build_temp) 1287db96d56Sopenharmony_ci cmd.build_temp = build_temp 1297db96d56Sopenharmony_ci cmd.build_clib = build_temp 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci # Before we run the command, we want to make sure 1327db96d56Sopenharmony_ci # all commands are present on the system. 1337db96d56Sopenharmony_ci ccmd = missing_compiler_executable() 1347db96d56Sopenharmony_ci if ccmd is not None: 1357db96d56Sopenharmony_ci self.skipTest('The %r command is not found' % ccmd) 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci # this should work 1387db96d56Sopenharmony_ci cmd.run() 1397db96d56Sopenharmony_ci 1407db96d56Sopenharmony_ci # let's check the result 1417db96d56Sopenharmony_ci self.assertIn('libfoo.a', os.listdir(build_temp)) 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_cidef test_suite(): 1447db96d56Sopenharmony_ci return unittest.TestLoader().loadTestsFromTestCase(BuildCLibTestCase) 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ciif __name__ == "__main__": 1477db96d56Sopenharmony_ci run_unittest(test_suite()) 148