| 
									
										
										
										
											2015-05-23 09:02:50 -07:00
										 |  |  | """Tests for distutils._msvccompiler.""" | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from distutils.errors import DistutilsPlatformError | 
					
						
							|  |  |  | from distutils.tests import support | 
					
						
							|  |  |  | from test.support import run_unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SKIP_MESSAGE = (None if sys.platform == "win32" else | 
					
						
							|  |  |  |                 "These tests are only for win32") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @unittest.skipUnless(SKIP_MESSAGE is None, SKIP_MESSAGE) | 
					
						
							|  |  |  | class msvccompilerTestCase(support.TempdirManager, | 
					
						
							|  |  |  |                             unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_no_compiler(self): | 
					
						
							| 
									
										
										
										
											2015-09-08 23:42:51 -07:00
										 |  |  |         import distutils._msvccompiler as _msvccompiler | 
					
						
							| 
									
										
										
										
											2015-05-23 09:02:50 -07:00
										 |  |  |         # makes sure query_vcvarsall raises | 
					
						
							|  |  |  |         # a DistutilsPlatformError if the compiler | 
					
						
							|  |  |  |         # is not found | 
					
						
							| 
									
										
										
										
											2015-09-08 21:39:01 -07:00
										 |  |  |         def _find_vcvarsall(plat_spec): | 
					
						
							|  |  |  |             return None, None | 
					
						
							| 
									
										
										
										
											2015-05-23 09:02:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         old_find_vcvarsall = _msvccompiler._find_vcvarsall | 
					
						
							|  |  |  |         _msvccompiler._find_vcvarsall = _find_vcvarsall | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2015-09-08 21:39:01 -07:00
										 |  |  |             self.assertRaises(DistutilsPlatformError, | 
					
						
							|  |  |  |                               _msvccompiler._get_vc_env, | 
					
						
							| 
									
										
										
										
											2015-05-23 09:02:50 -07:00
										 |  |  |                              'wont find this version') | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             _msvccompiler._find_vcvarsall = old_find_vcvarsall | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:39:01 -07:00
										 |  |  |     def test_compiler_options(self): | 
					
						
							| 
									
										
										
										
											2015-09-08 23:42:51 -07:00
										 |  |  |         import distutils._msvccompiler as _msvccompiler | 
					
						
							| 
									
										
										
										
											2015-09-08 21:39:01 -07:00
										 |  |  |         # suppress path to vcruntime from _find_vcvarsall to | 
					
						
							|  |  |  |         # check that /MT is added to compile options | 
					
						
							|  |  |  |         old_find_vcvarsall = _msvccompiler._find_vcvarsall | 
					
						
							|  |  |  |         def _find_vcvarsall(plat_spec): | 
					
						
							|  |  |  |             return old_find_vcvarsall(plat_spec)[0], None | 
					
						
							|  |  |  |         _msvccompiler._find_vcvarsall = _find_vcvarsall | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             compiler = _msvccompiler.MSVCCompiler() | 
					
						
							|  |  |  |             compiler.initialize() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertIn('/MT', compiler.compile_options) | 
					
						
							|  |  |  |             self.assertNotIn('/MD', compiler.compile_options) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             _msvccompiler._find_vcvarsall = old_find_vcvarsall | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_vcruntime_copy(self): | 
					
						
							| 
									
										
										
										
											2015-09-08 23:42:51 -07:00
										 |  |  |         import distutils._msvccompiler as _msvccompiler | 
					
						
							| 
									
										
										
										
											2015-09-08 21:39:01 -07:00
										 |  |  |         # force path to a known file - it doesn't matter | 
					
						
							|  |  |  |         # what we copy as long as its name is not in | 
					
						
							|  |  |  |         # _msvccompiler._BUNDLED_DLLS | 
					
						
							|  |  |  |         old_find_vcvarsall = _msvccompiler._find_vcvarsall | 
					
						
							|  |  |  |         def _find_vcvarsall(plat_spec): | 
					
						
							|  |  |  |             return old_find_vcvarsall(plat_spec)[0], __file__ | 
					
						
							|  |  |  |         _msvccompiler._find_vcvarsall = _find_vcvarsall | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             tempdir = self.mkdtemp() | 
					
						
							|  |  |  |             compiler = _msvccompiler.MSVCCompiler() | 
					
						
							|  |  |  |             compiler.initialize() | 
					
						
							|  |  |  |             compiler._copy_vcruntime(tempdir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertTrue(os.path.isfile(os.path.join( | 
					
						
							|  |  |  |                 tempdir, os.path.basename(__file__)))) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             _msvccompiler._find_vcvarsall = old_find_vcvarsall | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_vcruntime_skip_copy(self): | 
					
						
							| 
									
										
										
										
											2015-09-08 23:42:51 -07:00
										 |  |  |         import distutils._msvccompiler as _msvccompiler | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:39:01 -07:00
										 |  |  |         tempdir = self.mkdtemp() | 
					
						
							|  |  |  |         compiler = _msvccompiler.MSVCCompiler() | 
					
						
							|  |  |  |         compiler.initialize() | 
					
						
							|  |  |  |         dll = compiler._vcruntime_redist | 
					
						
							| 
									
										
										
										
											2017-09-07 11:49:23 -07:00
										 |  |  |         self.assertTrue(os.path.isfile(dll), dll or "<None>") | 
					
						
							| 
									
										
										
										
											2015-09-09 06:54:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:39:01 -07:00
										 |  |  |         compiler._copy_vcruntime(tempdir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertFalse(os.path.isfile(os.path.join( | 
					
						
							| 
									
										
										
										
											2017-09-07 11:49:23 -07:00
										 |  |  |             tempdir, os.path.basename(dll))), dll or "<None>") | 
					
						
							| 
									
										
										
										
											2015-09-08 21:39:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-17 09:32:38 -07:00
										 |  |  |     def test_get_vc_env_unicode(self): | 
					
						
							|  |  |  |         import distutils._msvccompiler as _msvccompiler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test_var = 'ṰḖṤṪ┅ṼẨṜ' | 
					
						
							|  |  |  |         test_value = '₃⁴₅' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Ensure we don't early exit from _get_vc_env | 
					
						
							|  |  |  |         old_distutils_use_sdk = os.environ.pop('DISTUTILS_USE_SDK', None) | 
					
						
							|  |  |  |         os.environ[test_var] = test_value | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             env = _msvccompiler._get_vc_env('x86') | 
					
						
							|  |  |  |             self.assertIn(test_var.lower(), env) | 
					
						
							|  |  |  |             self.assertEqual(test_value, env[test_var.lower()]) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             os.environ.pop(test_var) | 
					
						
							|  |  |  |             if old_distutils_use_sdk: | 
					
						
							|  |  |  |                 os.environ['DISTUTILS_USE_SDK'] = old_distutils_use_sdk | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 11:49:23 -07:00
										 |  |  |     def test_get_vc2017(self): | 
					
						
							|  |  |  |         import distutils._msvccompiler as _msvccompiler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # This function cannot be mocked, so pass it if we find VS 2017 | 
					
						
							|  |  |  |         # and mark it skipped if we do not. | 
					
						
							|  |  |  |         version, path = _msvccompiler._find_vc2017() | 
					
						
							|  |  |  |         if version: | 
					
						
							|  |  |  |             self.assertGreaterEqual(version, 15) | 
					
						
							|  |  |  |             self.assertTrue(os.path.isdir(path)) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             raise unittest.SkipTest("VS 2017 is not installed") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_vc2015(self): | 
					
						
							|  |  |  |         import distutils._msvccompiler as _msvccompiler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # This function cannot be mocked, so pass it if we find VS 2015 | 
					
						
							|  |  |  |         # and mark it skipped if we do not. | 
					
						
							|  |  |  |         version, path = _msvccompiler._find_vc2015() | 
					
						
							|  |  |  |         if version: | 
					
						
							|  |  |  |             self.assertGreaterEqual(version, 14) | 
					
						
							|  |  |  |             self.assertTrue(os.path.isdir(path)) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             raise unittest.SkipTest("VS 2015 is not installed") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-23 09:02:50 -07:00
										 |  |  | def test_suite(): | 
					
						
							|  |  |  |     return unittest.makeSuite(msvccompilerTestCase) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     run_unittest(test_suite()) |