test_build_ext.py revision a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39f
188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlimport sys 288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlimport os 388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlimport tempfile 488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlimport shutil 588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlfrom StringIO import StringIO 688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlfrom distutils.core import Extension, Distribution 888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlfrom distutils.command.build_ext import build_ext 988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlfrom distutils import sysconfig 1088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 1188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlimport unittest 1288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlfrom test import test_support 1388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 14a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauerdef _get_source_filename(): 15a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauer srcdir = sysconfig.get_config_var('srcdir') 16a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauer return os.path.join(srcdir, 'Modules', 'xxmodule.c') 17a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauer 1888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlclass BuildExtTestCase(unittest.TestCase): 1988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl def setUp(self): 2088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # Create a simple test environment 2188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # Note that we're making changes to sys.path 2288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.tmp_dir = tempfile.mkdtemp(prefix="pythontest_") 2388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.sys_path = sys.path[:] 2488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl sys.path.append(self.tmp_dir) 25a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauer shutil.copy(_get_source_filename(), self.tmp_dir) 2688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 2788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl def test_build_ext(self): 2888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl xx_c = os.path.join(self.tmp_dir, 'xxmodule.c') 2988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl xx_ext = Extension('xx', [xx_c]) 3088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl dist = Distribution({'name': 'xx', 'ext_modules': [xx_ext]}) 3188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl dist.package_dir = self.tmp_dir 3288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd = build_ext(dist) 33b4701e638c1030e575adf441aab01ad6319cc83dThomas Heller if os.name == "nt": 34b4701e638c1030e575adf441aab01ad6319cc83dThomas Heller # On Windows, we must build a debug version iff running 35b4701e638c1030e575adf441aab01ad6319cc83dThomas Heller # a debug build of Python 36b4701e638c1030e575adf441aab01ad6319cc83dThomas Heller cmd.debug = sys.executable.endswith("_d.exe") 3788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd.build_lib = self.tmp_dir 3888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd.build_temp = self.tmp_dir 3988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 4088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl old_stdout = sys.stdout 4188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl if not test_support.verbose: 4288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # silence compiler output 4388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl sys.stdout = StringIO() 4488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl try: 4588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd.ensure_finalized() 4688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd.run() 4788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl finally: 4888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl sys.stdout = old_stdout 4988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 5088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl import xx 5188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 5288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl for attr in ('error', 'foo', 'new', 'roj'): 5388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assert_(hasattr(xx, attr)) 5488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 5588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assertEquals(xx.foo(2, 5), 7) 5688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assertEquals(xx.foo(13,15), 28) 5788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assertEquals(xx.new().demo(), None) 5888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl doc = 'This is a template module just for instruction.' 5988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assertEquals(xx.__doc__, doc) 6088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assert_(isinstance(xx.Null(), xx.Null)) 6188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assert_(isinstance(xx.Str(), xx.Str)) 6288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 6388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl def tearDown(self): 6488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # Get everything back to normal 6588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl test_support.unload('xx') 6688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl sys.path = self.sys_path 671672e10dc2d7b70ee1830fbe0294e81f25560387Hirokazu Yamamoto # XXX on Windows the test leaves a directory with xx module in TEMP 681672e10dc2d7b70ee1830fbe0294e81f25560387Hirokazu Yamamoto shutil.rmtree(self.tmp_dir, os.name == 'nt' or sys.platform == 'cygwin') 6988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 7088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandldef test_suite(): 71a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauer src = _get_source_filename() 72a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauer if not os.path.exists(src): 7388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl if test_support.verbose: 74a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauer print ('test_build_ext: Cannot find source code (test' 75a52f1c62eb8cce9fb7f78687b854d1d8c4dbe39fNeil Schemenauer ' must run in python build dir)') 7688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl return unittest.TestSuite() 7788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl else: return unittest.makeSuite(BuildExtTestCase) 7888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 7988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlif __name__ == '__main__': 8088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl test_support.run_unittest(test_suite()) 81