1"""Tests for distutils.msvc9compiler.""" 2import sys 3import unittest 4import os 5 6from distutils.errors import DistutilsPlatformError 7from distutils.tests import support 8from test.support import run_unittest 9 10# A manifest with the only assembly reference being the msvcrt assembly, so 11# should have the assembly completely stripped. Note that although the 12# assembly has a <security> reference the assembly is removed - that is 13# currently a "feature", not a bug :) 14_MANIFEST_WITH_ONLY_MSVC_REFERENCE = """\ 15<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 16<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 17 manifestVersion="1.0"> 18 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 19 <security> 20 <requestedPrivileges> 21 <requestedExecutionLevel level="asInvoker" uiAccess="false"> 22 </requestedExecutionLevel> 23 </requestedPrivileges> 24 </security> 25 </trustInfo> 26 <dependency> 27 <dependentAssembly> 28 <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" 29 version="9.0.21022.8" processorArchitecture="x86" 30 publicKeyToken="XXXX"> 31 </assemblyIdentity> 32 </dependentAssembly> 33 </dependency> 34</assembly> 35""" 36 37# A manifest with references to assemblies other than msvcrt. When processed, 38# this assembly should be returned with just the msvcrt part removed. 39_MANIFEST_WITH_MULTIPLE_REFERENCES = """\ 40<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 41<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 42 manifestVersion="1.0"> 43 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 44 <security> 45 <requestedPrivileges> 46 <requestedExecutionLevel level="asInvoker" uiAccess="false"> 47 </requestedExecutionLevel> 48 </requestedPrivileges> 49 </security> 50 </trustInfo> 51 <dependency> 52 <dependentAssembly> 53 <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" 54 version="9.0.21022.8" processorArchitecture="x86" 55 publicKeyToken="XXXX"> 56 </assemblyIdentity> 57 </dependentAssembly> 58 </dependency> 59 <dependency> 60 <dependentAssembly> 61 <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" 62 version="9.0.21022.8" processorArchitecture="x86" 63 publicKeyToken="XXXX"></assemblyIdentity> 64 </dependentAssembly> 65 </dependency> 66</assembly> 67""" 68 69_CLEANED_MANIFEST = """\ 70<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 71<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 72 manifestVersion="1.0"> 73 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 74 <security> 75 <requestedPrivileges> 76 <requestedExecutionLevel level="asInvoker" uiAccess="false"> 77 </requestedExecutionLevel> 78 </requestedPrivileges> 79 </security> 80 </trustInfo> 81 <dependency> 82 83 </dependency> 84 <dependency> 85 <dependentAssembly> 86 <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" 87 version="9.0.21022.8" processorArchitecture="x86" 88 publicKeyToken="XXXX"></assemblyIdentity> 89 </dependentAssembly> 90 </dependency> 91</assembly>""" 92 93if sys.platform=="win32": 94 from distutils.msvccompiler import get_build_version 95 if get_build_version()>=8.0: 96 SKIP_MESSAGE = None 97 else: 98 SKIP_MESSAGE = "These tests are only for MSVC8.0 or above" 99else: 100 SKIP_MESSAGE = "These tests are only for win32" 101 102@unittest.skipUnless(SKIP_MESSAGE is None, SKIP_MESSAGE) 103class msvc9compilerTestCase(support.TempdirManager, 104 unittest.TestCase): 105 106 def test_no_compiler(self): 107 # makes sure query_vcvarsall raises 108 # a DistutilsPlatformError if the compiler 109 # is not found 110 from distutils.msvc9compiler import query_vcvarsall 111 def _find_vcvarsall(version): 112 return None 113 114 from distutils import msvc9compiler 115 old_find_vcvarsall = msvc9compiler.find_vcvarsall 116 msvc9compiler.find_vcvarsall = _find_vcvarsall 117 try: 118 self.assertRaises(DistutilsPlatformError, query_vcvarsall, 119 'wont find this version') 120 finally: 121 msvc9compiler.find_vcvarsall = old_find_vcvarsall 122 123 def test_reg_class(self): 124 from distutils.msvc9compiler import Reg 125 self.assertRaises(KeyError, Reg.get_value, 'xxx', 'xxx') 126 127 # looking for values that should exist on all 128 # windows registry versions. 129 path = r'Control Panel\Desktop' 130 v = Reg.get_value(path, 'dragfullwindows') 131 self.assertIn(v, ('0', '1', '2')) 132 133 import winreg 134 HKCU = winreg.HKEY_CURRENT_USER 135 keys = Reg.read_keys(HKCU, 'xxxx') 136 self.assertEqual(keys, None) 137 138 keys = Reg.read_keys(HKCU, r'Control Panel') 139 self.assertIn('Desktop', keys) 140 141 def test_remove_visual_c_ref(self): 142 from distutils.msvc9compiler import MSVCCompiler 143 tempdir = self.mkdtemp() 144 manifest = os.path.join(tempdir, 'manifest') 145 f = open(manifest, 'w') 146 try: 147 f.write(_MANIFEST_WITH_MULTIPLE_REFERENCES) 148 finally: 149 f.close() 150 151 compiler = MSVCCompiler() 152 compiler._remove_visual_c_ref(manifest) 153 154 # see what we got 155 f = open(manifest) 156 try: 157 # removing trailing spaces 158 content = '\n'.join([line.rstrip() for line in f.readlines()]) 159 finally: 160 f.close() 161 162 # makes sure the manifest was properly cleaned 163 self.assertEqual(content, _CLEANED_MANIFEST) 164 165 def test_remove_entire_manifest(self): 166 from distutils.msvc9compiler import MSVCCompiler 167 tempdir = self.mkdtemp() 168 manifest = os.path.join(tempdir, 'manifest') 169 f = open(manifest, 'w') 170 try: 171 f.write(_MANIFEST_WITH_ONLY_MSVC_REFERENCE) 172 finally: 173 f.close() 174 175 compiler = MSVCCompiler() 176 got = compiler._remove_visual_c_ref(manifest) 177 self.assertIsNone(got) 178 179 180def test_suite(): 181 return unittest.makeSuite(msvc9compilerTestCase) 182 183if __name__ == "__main__": 184 run_unittest(test_suite()) 185