17db96d56Sopenharmony_ci"""Tests for distutils.msvc9compiler.""" 27db96d56Sopenharmony_ciimport sys 37db96d56Sopenharmony_ciimport unittest 47db96d56Sopenharmony_ciimport os 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_cifrom distutils.errors import DistutilsPlatformError 77db96d56Sopenharmony_cifrom distutils.tests import support 87db96d56Sopenharmony_cifrom test.support import run_unittest 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci# A manifest with the only assembly reference being the msvcrt assembly, so 117db96d56Sopenharmony_ci# should have the assembly completely stripped. Note that although the 127db96d56Sopenharmony_ci# assembly has a <security> reference the assembly is removed - that is 137db96d56Sopenharmony_ci# currently a "feature", not a bug :) 147db96d56Sopenharmony_ci_MANIFEST_WITH_ONLY_MSVC_REFERENCE = """\ 157db96d56Sopenharmony_ci<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 167db96d56Sopenharmony_ci<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 177db96d56Sopenharmony_ci manifestVersion="1.0"> 187db96d56Sopenharmony_ci <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 197db96d56Sopenharmony_ci <security> 207db96d56Sopenharmony_ci <requestedPrivileges> 217db96d56Sopenharmony_ci <requestedExecutionLevel level="asInvoker" uiAccess="false"> 227db96d56Sopenharmony_ci </requestedExecutionLevel> 237db96d56Sopenharmony_ci </requestedPrivileges> 247db96d56Sopenharmony_ci </security> 257db96d56Sopenharmony_ci </trustInfo> 267db96d56Sopenharmony_ci <dependency> 277db96d56Sopenharmony_ci <dependentAssembly> 287db96d56Sopenharmony_ci <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" 297db96d56Sopenharmony_ci version="9.0.21022.8" processorArchitecture="x86" 307db96d56Sopenharmony_ci publicKeyToken="XXXX"> 317db96d56Sopenharmony_ci </assemblyIdentity> 327db96d56Sopenharmony_ci </dependentAssembly> 337db96d56Sopenharmony_ci </dependency> 347db96d56Sopenharmony_ci</assembly> 357db96d56Sopenharmony_ci""" 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci# A manifest with references to assemblies other than msvcrt. When processed, 387db96d56Sopenharmony_ci# this assembly should be returned with just the msvcrt part removed. 397db96d56Sopenharmony_ci_MANIFEST_WITH_MULTIPLE_REFERENCES = """\ 407db96d56Sopenharmony_ci<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 417db96d56Sopenharmony_ci<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 427db96d56Sopenharmony_ci manifestVersion="1.0"> 437db96d56Sopenharmony_ci <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 447db96d56Sopenharmony_ci <security> 457db96d56Sopenharmony_ci <requestedPrivileges> 467db96d56Sopenharmony_ci <requestedExecutionLevel level="asInvoker" uiAccess="false"> 477db96d56Sopenharmony_ci </requestedExecutionLevel> 487db96d56Sopenharmony_ci </requestedPrivileges> 497db96d56Sopenharmony_ci </security> 507db96d56Sopenharmony_ci </trustInfo> 517db96d56Sopenharmony_ci <dependency> 527db96d56Sopenharmony_ci <dependentAssembly> 537db96d56Sopenharmony_ci <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" 547db96d56Sopenharmony_ci version="9.0.21022.8" processorArchitecture="x86" 557db96d56Sopenharmony_ci publicKeyToken="XXXX"> 567db96d56Sopenharmony_ci </assemblyIdentity> 577db96d56Sopenharmony_ci </dependentAssembly> 587db96d56Sopenharmony_ci </dependency> 597db96d56Sopenharmony_ci <dependency> 607db96d56Sopenharmony_ci <dependentAssembly> 617db96d56Sopenharmony_ci <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" 627db96d56Sopenharmony_ci version="9.0.21022.8" processorArchitecture="x86" 637db96d56Sopenharmony_ci publicKeyToken="XXXX"></assemblyIdentity> 647db96d56Sopenharmony_ci </dependentAssembly> 657db96d56Sopenharmony_ci </dependency> 667db96d56Sopenharmony_ci</assembly> 677db96d56Sopenharmony_ci""" 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci_CLEANED_MANIFEST = """\ 707db96d56Sopenharmony_ci<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 717db96d56Sopenharmony_ci<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 727db96d56Sopenharmony_ci manifestVersion="1.0"> 737db96d56Sopenharmony_ci <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 747db96d56Sopenharmony_ci <security> 757db96d56Sopenharmony_ci <requestedPrivileges> 767db96d56Sopenharmony_ci <requestedExecutionLevel level="asInvoker" uiAccess="false"> 777db96d56Sopenharmony_ci </requestedExecutionLevel> 787db96d56Sopenharmony_ci </requestedPrivileges> 797db96d56Sopenharmony_ci </security> 807db96d56Sopenharmony_ci </trustInfo> 817db96d56Sopenharmony_ci <dependency> 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci </dependency> 847db96d56Sopenharmony_ci <dependency> 857db96d56Sopenharmony_ci <dependentAssembly> 867db96d56Sopenharmony_ci <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" 877db96d56Sopenharmony_ci version="9.0.21022.8" processorArchitecture="x86" 887db96d56Sopenharmony_ci publicKeyToken="XXXX"></assemblyIdentity> 897db96d56Sopenharmony_ci </dependentAssembly> 907db96d56Sopenharmony_ci </dependency> 917db96d56Sopenharmony_ci</assembly>""" 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ciif sys.platform=="win32": 947db96d56Sopenharmony_ci from distutils.msvccompiler import get_build_version 957db96d56Sopenharmony_ci if get_build_version()>=8.0: 967db96d56Sopenharmony_ci SKIP_MESSAGE = None 977db96d56Sopenharmony_ci else: 987db96d56Sopenharmony_ci SKIP_MESSAGE = "These tests are only for MSVC8.0 or above" 997db96d56Sopenharmony_cielse: 1007db96d56Sopenharmony_ci SKIP_MESSAGE = "These tests are only for win32" 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci@unittest.skipUnless(SKIP_MESSAGE is None, SKIP_MESSAGE) 1037db96d56Sopenharmony_ciclass msvc9compilerTestCase(support.TempdirManager, 1047db96d56Sopenharmony_ci unittest.TestCase): 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci def test_no_compiler(self): 1077db96d56Sopenharmony_ci # makes sure query_vcvarsall raises 1087db96d56Sopenharmony_ci # a DistutilsPlatformError if the compiler 1097db96d56Sopenharmony_ci # is not found 1107db96d56Sopenharmony_ci from distutils.msvc9compiler import query_vcvarsall 1117db96d56Sopenharmony_ci def _find_vcvarsall(version): 1127db96d56Sopenharmony_ci return None 1137db96d56Sopenharmony_ci 1147db96d56Sopenharmony_ci from distutils import msvc9compiler 1157db96d56Sopenharmony_ci old_find_vcvarsall = msvc9compiler.find_vcvarsall 1167db96d56Sopenharmony_ci msvc9compiler.find_vcvarsall = _find_vcvarsall 1177db96d56Sopenharmony_ci try: 1187db96d56Sopenharmony_ci self.assertRaises(DistutilsPlatformError, query_vcvarsall, 1197db96d56Sopenharmony_ci 'wont find this version') 1207db96d56Sopenharmony_ci finally: 1217db96d56Sopenharmony_ci msvc9compiler.find_vcvarsall = old_find_vcvarsall 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci def test_reg_class(self): 1247db96d56Sopenharmony_ci from distutils.msvc9compiler import Reg 1257db96d56Sopenharmony_ci self.assertRaises(KeyError, Reg.get_value, 'xxx', 'xxx') 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci # looking for values that should exist on all 1287db96d56Sopenharmony_ci # windows registry versions. 1297db96d56Sopenharmony_ci path = r'Control Panel\Desktop' 1307db96d56Sopenharmony_ci v = Reg.get_value(path, 'dragfullwindows') 1317db96d56Sopenharmony_ci self.assertIn(v, ('0', '1', '2')) 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci import winreg 1347db96d56Sopenharmony_ci HKCU = winreg.HKEY_CURRENT_USER 1357db96d56Sopenharmony_ci keys = Reg.read_keys(HKCU, 'xxxx') 1367db96d56Sopenharmony_ci self.assertEqual(keys, None) 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci keys = Reg.read_keys(HKCU, r'Control Panel') 1397db96d56Sopenharmony_ci self.assertIn('Desktop', keys) 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci def test_remove_visual_c_ref(self): 1427db96d56Sopenharmony_ci from distutils.msvc9compiler import MSVCCompiler 1437db96d56Sopenharmony_ci tempdir = self.mkdtemp() 1447db96d56Sopenharmony_ci manifest = os.path.join(tempdir, 'manifest') 1457db96d56Sopenharmony_ci f = open(manifest, 'w') 1467db96d56Sopenharmony_ci try: 1477db96d56Sopenharmony_ci f.write(_MANIFEST_WITH_MULTIPLE_REFERENCES) 1487db96d56Sopenharmony_ci finally: 1497db96d56Sopenharmony_ci f.close() 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci compiler = MSVCCompiler() 1527db96d56Sopenharmony_ci compiler._remove_visual_c_ref(manifest) 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci # see what we got 1557db96d56Sopenharmony_ci f = open(manifest) 1567db96d56Sopenharmony_ci try: 1577db96d56Sopenharmony_ci # removing trailing spaces 1587db96d56Sopenharmony_ci content = '\n'.join([line.rstrip() for line in f.readlines()]) 1597db96d56Sopenharmony_ci finally: 1607db96d56Sopenharmony_ci f.close() 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci # makes sure the manifest was properly cleaned 1637db96d56Sopenharmony_ci self.assertEqual(content, _CLEANED_MANIFEST) 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci def test_remove_entire_manifest(self): 1667db96d56Sopenharmony_ci from distutils.msvc9compiler import MSVCCompiler 1677db96d56Sopenharmony_ci tempdir = self.mkdtemp() 1687db96d56Sopenharmony_ci manifest = os.path.join(tempdir, 'manifest') 1697db96d56Sopenharmony_ci f = open(manifest, 'w') 1707db96d56Sopenharmony_ci try: 1717db96d56Sopenharmony_ci f.write(_MANIFEST_WITH_ONLY_MSVC_REFERENCE) 1727db96d56Sopenharmony_ci finally: 1737db96d56Sopenharmony_ci f.close() 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ci compiler = MSVCCompiler() 1767db96d56Sopenharmony_ci got = compiler._remove_visual_c_ref(manifest) 1777db96d56Sopenharmony_ci self.assertIsNone(got) 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_cidef test_suite(): 1817db96d56Sopenharmony_ci return unittest.TestLoader().loadTestsFromTestCase(msvc9compilerTestCase) 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ciif __name__ == "__main__": 1847db96d56Sopenharmony_ci run_unittest(test_suite()) 185