mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """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):
 | |
|         import distutils._msvccompiler as _msvccompiler
 | |
|         # makes sure query_vcvarsall raises
 | |
|         # a DistutilsPlatformError if the compiler
 | |
|         # is not found
 | |
|         def _find_vcvarsall(plat_spec):
 | |
|             return None, None
 | |
| 
 | |
|         old_find_vcvarsall = _msvccompiler._find_vcvarsall
 | |
|         _msvccompiler._find_vcvarsall = _find_vcvarsall
 | |
|         try:
 | |
|             self.assertRaises(DistutilsPlatformError,
 | |
|                               _msvccompiler._get_vc_env,
 | |
|                              'wont find this version')
 | |
|         finally:
 | |
|             _msvccompiler._find_vcvarsall = old_find_vcvarsall
 | |
| 
 | |
|     def test_compiler_options(self):
 | |
|         import distutils._msvccompiler as _msvccompiler
 | |
|         # 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):
 | |
|         import distutils._msvccompiler as _msvccompiler
 | |
|         # 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):
 | |
|         import distutils._msvccompiler as _msvccompiler
 | |
| 
 | |
|         tempdir = self.mkdtemp()
 | |
|         compiler = _msvccompiler.MSVCCompiler()
 | |
|         compiler.initialize()
 | |
|         dll = compiler._vcruntime_redist
 | |
|         self.assertTrue(os.path.isfile(dll), dll or "<None>")
 | |
| 
 | |
|         compiler._copy_vcruntime(tempdir)
 | |
| 
 | |
|         self.assertFalse(os.path.isfile(os.path.join(
 | |
|             tempdir, os.path.basename(dll))), dll or "<None>")
 | |
| 
 | |
|     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
 | |
| 
 | |
|     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")
 | |
| 
 | |
| def test_suite():
 | |
|     return unittest.makeSuite(msvccompilerTestCase)
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     run_unittest(test_suite())
 | 
