test_build_ext.py revision 88e2acf038b717199655d8206e4a5deaa0a0eb1a
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 1488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlclass BuildExtTestCase(unittest.TestCase): 1588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl def setUp(self): 1688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # Create a simple test environment 1788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # Note that we're making changes to sys.path 1888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.tmp_dir = tempfile.mkdtemp(prefix="pythontest_") 1988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.sys_path = sys.path[:] 2088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl sys.path.append(self.tmp_dir) 2188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 2288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl xx_c = os.path.join(sysconfig.project_base, 'Modules', 'xxmodule.c') 2388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl shutil.copy(xx_c, self.tmp_dir) 2488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 2588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl def test_build_ext(self): 2688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl xx_c = os.path.join(self.tmp_dir, 'xxmodule.c') 2788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl xx_ext = Extension('xx', [xx_c]) 2888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl dist = Distribution({'name': 'xx', 'ext_modules': [xx_ext]}) 2988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl dist.package_dir = self.tmp_dir 3088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd = build_ext(dist) 3188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd.build_lib = self.tmp_dir 3288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd.build_temp = self.tmp_dir 3388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 3488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl old_stdout = sys.stdout 3588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl if not test_support.verbose: 3688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # silence compiler output 3788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl sys.stdout = StringIO() 3888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl try: 3988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd.ensure_finalized() 4088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl cmd.run() 4188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl finally: 4288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl sys.stdout = old_stdout 4388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 4488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl import xx 4588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 4688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl for attr in ('error', 'foo', 'new', 'roj'): 4788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assert_(hasattr(xx, attr)) 4888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 4988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assertEquals(xx.foo(2, 5), 7) 5088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assertEquals(xx.foo(13,15), 28) 5188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assertEquals(xx.new().demo(), None) 5288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl doc = 'This is a template module just for instruction.' 5388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assertEquals(xx.__doc__, doc) 5488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assert_(isinstance(xx.Null(), xx.Null)) 5588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl self.assert_(isinstance(xx.Str(), xx.Str)) 5688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 5788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl def tearDown(self): 5888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # Get everything back to normal 5988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl test_support.unload('xx') 6088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl sys.path = self.sys_path 6188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl # XXX on Windows the test leaves a directory with xx.pyd in TEMP 6288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl shutil.rmtree(self.tmp_dir, False if os.name != "nt" else True) 6388e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 6488e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandldef test_suite(): 6588e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl if not sysconfig.python_build: 6688e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl if test_support.verbose: 6788e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl print 'test_build_ext: The test must be run in a python build dir' 6888e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl return unittest.TestSuite() 6988e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl else: return unittest.makeSuite(BuildExtTestCase) 7088e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl 7188e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandlif __name__ == '__main__': 7288e2acf038b717199655d8206e4a5deaa0a0eb1aGeorg Brandl test_support.run_unittest(test_suite()) 73