"""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 "") compiler._copy_vcruntime(tempdir) self.assertFalse(os.path.isfile(os.path.join( tempdir, os.path.basename(dll))), dll or "") 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())