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