17db96d56Sopenharmony_ciimport unittest 27db96d56Sopenharmony_ciimport sys 37db96d56Sopenharmony_ciimport os 47db96d56Sopenharmony_ciimport subprocess 57db96d56Sopenharmony_ciimport shutil 67db96d56Sopenharmony_cifrom copy import copy 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_cifrom test.support import ( 97db96d56Sopenharmony_ci captured_stdout, PythonSymlink, requires_subprocess, is_wasi 107db96d56Sopenharmony_ci) 117db96d56Sopenharmony_cifrom test.support.import_helper import import_module 127db96d56Sopenharmony_cifrom test.support.os_helper import (TESTFN, unlink, skip_unless_symlink, 137db96d56Sopenharmony_ci change_cwd) 147db96d56Sopenharmony_cifrom test.support.warnings_helper import check_warnings 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ciimport sysconfig 177db96d56Sopenharmony_cifrom sysconfig import (get_paths, get_platform, get_config_vars, 187db96d56Sopenharmony_ci get_path, get_path_names, _INSTALL_SCHEMES, 197db96d56Sopenharmony_ci get_default_scheme, get_scheme_names, get_config_var, 207db96d56Sopenharmony_ci _expand_vars, _get_preferred_schemes, _main) 217db96d56Sopenharmony_ciimport _osx_support 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ciHAS_USER_BASE = sysconfig._HAS_USER_BASE 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciclass TestSysConfig(unittest.TestCase): 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci def setUp(self): 307db96d56Sopenharmony_ci super(TestSysConfig, self).setUp() 317db96d56Sopenharmony_ci self.sys_path = sys.path[:] 327db96d56Sopenharmony_ci # patching os.uname 337db96d56Sopenharmony_ci if hasattr(os, 'uname'): 347db96d56Sopenharmony_ci self.uname = os.uname 357db96d56Sopenharmony_ci self._uname = os.uname() 367db96d56Sopenharmony_ci else: 377db96d56Sopenharmony_ci self.uname = None 387db96d56Sopenharmony_ci self._set_uname(('',)*5) 397db96d56Sopenharmony_ci os.uname = self._get_uname 407db96d56Sopenharmony_ci # saving the environment 417db96d56Sopenharmony_ci self.name = os.name 427db96d56Sopenharmony_ci self.platform = sys.platform 437db96d56Sopenharmony_ci self.version = sys.version 447db96d56Sopenharmony_ci self.sep = os.sep 457db96d56Sopenharmony_ci self.join = os.path.join 467db96d56Sopenharmony_ci self.isabs = os.path.isabs 477db96d56Sopenharmony_ci self.splitdrive = os.path.splitdrive 487db96d56Sopenharmony_ci self._config_vars = sysconfig._CONFIG_VARS, copy(sysconfig._CONFIG_VARS) 497db96d56Sopenharmony_ci self._added_envvars = [] 507db96d56Sopenharmony_ci self._changed_envvars = [] 517db96d56Sopenharmony_ci for var in ('MACOSX_DEPLOYMENT_TARGET', 'PATH'): 527db96d56Sopenharmony_ci if var in os.environ: 537db96d56Sopenharmony_ci self._changed_envvars.append((var, os.environ[var])) 547db96d56Sopenharmony_ci else: 557db96d56Sopenharmony_ci self._added_envvars.append(var) 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci def tearDown(self): 587db96d56Sopenharmony_ci sys.path[:] = self.sys_path 597db96d56Sopenharmony_ci self._cleanup_testfn() 607db96d56Sopenharmony_ci if self.uname is not None: 617db96d56Sopenharmony_ci os.uname = self.uname 627db96d56Sopenharmony_ci else: 637db96d56Sopenharmony_ci del os.uname 647db96d56Sopenharmony_ci os.name = self.name 657db96d56Sopenharmony_ci sys.platform = self.platform 667db96d56Sopenharmony_ci sys.version = self.version 677db96d56Sopenharmony_ci os.sep = self.sep 687db96d56Sopenharmony_ci os.path.join = self.join 697db96d56Sopenharmony_ci os.path.isabs = self.isabs 707db96d56Sopenharmony_ci os.path.splitdrive = self.splitdrive 717db96d56Sopenharmony_ci sysconfig._CONFIG_VARS = self._config_vars[0] 727db96d56Sopenharmony_ci sysconfig._CONFIG_VARS.clear() 737db96d56Sopenharmony_ci sysconfig._CONFIG_VARS.update(self._config_vars[1]) 747db96d56Sopenharmony_ci for var, value in self._changed_envvars: 757db96d56Sopenharmony_ci os.environ[var] = value 767db96d56Sopenharmony_ci for var in self._added_envvars: 777db96d56Sopenharmony_ci os.environ.pop(var, None) 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_ci super(TestSysConfig, self).tearDown() 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci def _set_uname(self, uname): 827db96d56Sopenharmony_ci self._uname = os.uname_result(uname) 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci def _get_uname(self): 857db96d56Sopenharmony_ci return self._uname 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci def _cleanup_testfn(self): 887db96d56Sopenharmony_ci path = TESTFN 897db96d56Sopenharmony_ci if os.path.isfile(path): 907db96d56Sopenharmony_ci os.remove(path) 917db96d56Sopenharmony_ci elif os.path.isdir(path): 927db96d56Sopenharmony_ci shutil.rmtree(path) 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci def test_get_path_names(self): 957db96d56Sopenharmony_ci self.assertEqual(get_path_names(), sysconfig._SCHEME_KEYS) 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci def test_get_paths(self): 987db96d56Sopenharmony_ci scheme = get_paths() 997db96d56Sopenharmony_ci default_scheme = get_default_scheme() 1007db96d56Sopenharmony_ci wanted = _expand_vars(default_scheme, None) 1017db96d56Sopenharmony_ci wanted = sorted(wanted.items()) 1027db96d56Sopenharmony_ci scheme = sorted(scheme.items()) 1037db96d56Sopenharmony_ci self.assertEqual(scheme, wanted) 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci def test_get_path(self): 1067db96d56Sopenharmony_ci config_vars = get_config_vars() 1077db96d56Sopenharmony_ci if os.name == 'nt': 1087db96d56Sopenharmony_ci # On Windows, we replace the native platlibdir name with the 1097db96d56Sopenharmony_ci # default so that POSIX schemes resolve correctly 1107db96d56Sopenharmony_ci config_vars = config_vars | {'platlibdir': 'lib'} 1117db96d56Sopenharmony_ci for scheme in _INSTALL_SCHEMES: 1127db96d56Sopenharmony_ci for name in _INSTALL_SCHEMES[scheme]: 1137db96d56Sopenharmony_ci expected = _INSTALL_SCHEMES[scheme][name].format(**config_vars) 1147db96d56Sopenharmony_ci self.assertEqual( 1157db96d56Sopenharmony_ci os.path.normpath(get_path(name, scheme)), 1167db96d56Sopenharmony_ci os.path.normpath(expected), 1177db96d56Sopenharmony_ci ) 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci def test_get_default_scheme(self): 1207db96d56Sopenharmony_ci self.assertIn(get_default_scheme(), _INSTALL_SCHEMES) 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci def test_get_preferred_schemes(self): 1237db96d56Sopenharmony_ci expected_schemes = {'prefix', 'home', 'user'} 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci # Windows. 1267db96d56Sopenharmony_ci os.name = 'nt' 1277db96d56Sopenharmony_ci schemes = _get_preferred_schemes() 1287db96d56Sopenharmony_ci self.assertIsInstance(schemes, dict) 1297db96d56Sopenharmony_ci self.assertEqual(set(schemes), expected_schemes) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci # Mac and Linux, shared library build. 1327db96d56Sopenharmony_ci os.name = 'posix' 1337db96d56Sopenharmony_ci schemes = _get_preferred_schemes() 1347db96d56Sopenharmony_ci self.assertIsInstance(schemes, dict) 1357db96d56Sopenharmony_ci self.assertEqual(set(schemes), expected_schemes) 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci # Mac, framework build. 1387db96d56Sopenharmony_ci os.name = 'posix' 1397db96d56Sopenharmony_ci sys.platform = 'darwin' 1407db96d56Sopenharmony_ci sys._framework = True 1417db96d56Sopenharmony_ci self.assertIsInstance(schemes, dict) 1427db96d56Sopenharmony_ci self.assertEqual(set(schemes), expected_schemes) 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci def test_posix_venv_scheme(self): 1457db96d56Sopenharmony_ci # The following directories were hardcoded in the venv module 1467db96d56Sopenharmony_ci # before bpo-45413, here we assert the posix_venv scheme does not regress 1477db96d56Sopenharmony_ci binpath = 'bin' 1487db96d56Sopenharmony_ci incpath = 'include' 1497db96d56Sopenharmony_ci libpath = os.path.join('lib', 1507db96d56Sopenharmony_ci 'python%d.%d' % sys.version_info[:2], 1517db96d56Sopenharmony_ci 'site-packages') 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci # Resolve the paths in prefix 1547db96d56Sopenharmony_ci binpath = os.path.join(sys.prefix, binpath) 1557db96d56Sopenharmony_ci incpath = os.path.join(sys.prefix, incpath) 1567db96d56Sopenharmony_ci libpath = os.path.join(sys.prefix, libpath) 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci self.assertEqual(binpath, sysconfig.get_path('scripts', scheme='posix_venv')) 1597db96d56Sopenharmony_ci self.assertEqual(libpath, sysconfig.get_path('purelib', scheme='posix_venv')) 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci # The include directory on POSIX isn't exactly the same as before, 1627db96d56Sopenharmony_ci # but it is "within" 1637db96d56Sopenharmony_ci sysconfig_includedir = sysconfig.get_path('include', scheme='posix_venv') 1647db96d56Sopenharmony_ci self.assertTrue(sysconfig_includedir.startswith(incpath + os.sep)) 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci def test_nt_venv_scheme(self): 1677db96d56Sopenharmony_ci # The following directories were hardcoded in the venv module 1687db96d56Sopenharmony_ci # before bpo-45413, here we assert the posix_venv scheme does not regress 1697db96d56Sopenharmony_ci binpath = 'Scripts' 1707db96d56Sopenharmony_ci incpath = 'Include' 1717db96d56Sopenharmony_ci libpath = os.path.join('Lib', 'site-packages') 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci # Resolve the paths in prefix 1747db96d56Sopenharmony_ci binpath = os.path.join(sys.prefix, binpath) 1757db96d56Sopenharmony_ci incpath = os.path.join(sys.prefix, incpath) 1767db96d56Sopenharmony_ci libpath = os.path.join(sys.prefix, libpath) 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ci self.assertEqual(binpath, sysconfig.get_path('scripts', scheme='nt_venv')) 1797db96d56Sopenharmony_ci self.assertEqual(incpath, sysconfig.get_path('include', scheme='nt_venv')) 1807db96d56Sopenharmony_ci self.assertEqual(libpath, sysconfig.get_path('purelib', scheme='nt_venv')) 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci def test_venv_scheme(self): 1837db96d56Sopenharmony_ci if sys.platform == 'win32': 1847db96d56Sopenharmony_ci self.assertEqual( 1857db96d56Sopenharmony_ci sysconfig.get_path('scripts', scheme='venv'), 1867db96d56Sopenharmony_ci sysconfig.get_path('scripts', scheme='nt_venv') 1877db96d56Sopenharmony_ci ) 1887db96d56Sopenharmony_ci self.assertEqual( 1897db96d56Sopenharmony_ci sysconfig.get_path('include', scheme='venv'), 1907db96d56Sopenharmony_ci sysconfig.get_path('include', scheme='nt_venv') 1917db96d56Sopenharmony_ci ) 1927db96d56Sopenharmony_ci self.assertEqual( 1937db96d56Sopenharmony_ci sysconfig.get_path('purelib', scheme='venv'), 1947db96d56Sopenharmony_ci sysconfig.get_path('purelib', scheme='nt_venv') 1957db96d56Sopenharmony_ci ) 1967db96d56Sopenharmony_ci else: 1977db96d56Sopenharmony_ci self.assertEqual( 1987db96d56Sopenharmony_ci sysconfig.get_path('scripts', scheme='venv'), 1997db96d56Sopenharmony_ci sysconfig.get_path('scripts', scheme='posix_venv') 2007db96d56Sopenharmony_ci ) 2017db96d56Sopenharmony_ci self.assertEqual( 2027db96d56Sopenharmony_ci sysconfig.get_path('include', scheme='venv'), 2037db96d56Sopenharmony_ci sysconfig.get_path('include', scheme='posix_venv') 2047db96d56Sopenharmony_ci ) 2057db96d56Sopenharmony_ci self.assertEqual( 2067db96d56Sopenharmony_ci sysconfig.get_path('purelib', scheme='venv'), 2077db96d56Sopenharmony_ci sysconfig.get_path('purelib', scheme='posix_venv') 2087db96d56Sopenharmony_ci ) 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci def test_get_config_vars(self): 2117db96d56Sopenharmony_ci cvars = get_config_vars() 2127db96d56Sopenharmony_ci self.assertIsInstance(cvars, dict) 2137db96d56Sopenharmony_ci self.assertTrue(cvars) 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci def test_get_platform(self): 2167db96d56Sopenharmony_ci # windows XP, 32bits 2177db96d56Sopenharmony_ci os.name = 'nt' 2187db96d56Sopenharmony_ci sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) ' 2197db96d56Sopenharmony_ci '[MSC v.1310 32 bit (Intel)]') 2207db96d56Sopenharmony_ci sys.platform = 'win32' 2217db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'win32') 2227db96d56Sopenharmony_ci 2237db96d56Sopenharmony_ci # windows XP, amd64 2247db96d56Sopenharmony_ci os.name = 'nt' 2257db96d56Sopenharmony_ci sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) ' 2267db96d56Sopenharmony_ci '[MSC v.1310 32 bit (Amd64)]') 2277db96d56Sopenharmony_ci sys.platform = 'win32' 2287db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'win-amd64') 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci # macbook 2317db96d56Sopenharmony_ci os.name = 'posix' 2327db96d56Sopenharmony_ci sys.version = ('2.5 (r25:51918, Sep 19 2006, 08:49:13) ' 2337db96d56Sopenharmony_ci '\n[GCC 4.0.1 (Apple Computer, Inc. build 5341)]') 2347db96d56Sopenharmony_ci sys.platform = 'darwin' 2357db96d56Sopenharmony_ci self._set_uname(('Darwin', 'macziade', '8.11.1', 2367db96d56Sopenharmony_ci ('Darwin Kernel Version 8.11.1: ' 2377db96d56Sopenharmony_ci 'Wed Oct 10 18:23:28 PDT 2007; ' 2387db96d56Sopenharmony_ci 'root:xnu-792.25.20~1/RELEASE_I386'), 'PowerPC')) 2397db96d56Sopenharmony_ci _osx_support._remove_original_values(get_config_vars()) 2407db96d56Sopenharmony_ci get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.3' 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci get_config_vars()['CFLAGS'] = ('-fno-strict-aliasing -DNDEBUG -g ' 2437db96d56Sopenharmony_ci '-fwrapv -O3 -Wall -Wstrict-prototypes') 2447db96d56Sopenharmony_ci 2457db96d56Sopenharmony_ci maxint = sys.maxsize 2467db96d56Sopenharmony_ci try: 2477db96d56Sopenharmony_ci sys.maxsize = 2147483647 2487db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.3-ppc') 2497db96d56Sopenharmony_ci sys.maxsize = 9223372036854775807 2507db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.3-ppc64') 2517db96d56Sopenharmony_ci finally: 2527db96d56Sopenharmony_ci sys.maxsize = maxint 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci self._set_uname(('Darwin', 'macziade', '8.11.1', 2557db96d56Sopenharmony_ci ('Darwin Kernel Version 8.11.1: ' 2567db96d56Sopenharmony_ci 'Wed Oct 10 18:23:28 PDT 2007; ' 2577db96d56Sopenharmony_ci 'root:xnu-792.25.20~1/RELEASE_I386'), 'i386')) 2587db96d56Sopenharmony_ci _osx_support._remove_original_values(get_config_vars()) 2597db96d56Sopenharmony_ci get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.3' 2607db96d56Sopenharmony_ci 2617db96d56Sopenharmony_ci get_config_vars()['CFLAGS'] = ('-fno-strict-aliasing -DNDEBUG -g ' 2627db96d56Sopenharmony_ci '-fwrapv -O3 -Wall -Wstrict-prototypes') 2637db96d56Sopenharmony_ci maxint = sys.maxsize 2647db96d56Sopenharmony_ci try: 2657db96d56Sopenharmony_ci sys.maxsize = 2147483647 2667db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.3-i386') 2677db96d56Sopenharmony_ci sys.maxsize = 9223372036854775807 2687db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.3-x86_64') 2697db96d56Sopenharmony_ci finally: 2707db96d56Sopenharmony_ci sys.maxsize = maxint 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci # macbook with fat binaries (fat, universal or fat64) 2737db96d56Sopenharmony_ci _osx_support._remove_original_values(get_config_vars()) 2747db96d56Sopenharmony_ci get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.4' 2757db96d56Sopenharmony_ci get_config_vars()['CFLAGS'] = ('-arch ppc -arch i386 -isysroot ' 2767db96d56Sopenharmony_ci '/Developer/SDKs/MacOSX10.4u.sdk ' 2777db96d56Sopenharmony_ci '-fno-strict-aliasing -fno-common ' 2787db96d56Sopenharmony_ci '-dynamic -DNDEBUG -g -O3') 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.4-fat') 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci _osx_support._remove_original_values(get_config_vars()) 2837db96d56Sopenharmony_ci get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch i386 -isysroot ' 2847db96d56Sopenharmony_ci '/Developer/SDKs/MacOSX10.4u.sdk ' 2857db96d56Sopenharmony_ci '-fno-strict-aliasing -fno-common ' 2867db96d56Sopenharmony_ci '-dynamic -DNDEBUG -g -O3') 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.4-intel') 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci _osx_support._remove_original_values(get_config_vars()) 2917db96d56Sopenharmony_ci get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc -arch i386 -isysroot ' 2927db96d56Sopenharmony_ci '/Developer/SDKs/MacOSX10.4u.sdk ' 2937db96d56Sopenharmony_ci '-fno-strict-aliasing -fno-common ' 2947db96d56Sopenharmony_ci '-dynamic -DNDEBUG -g -O3') 2957db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.4-fat3') 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci _osx_support._remove_original_values(get_config_vars()) 2987db96d56Sopenharmony_ci get_config_vars()['CFLAGS'] = ('-arch ppc64 -arch x86_64 -arch ppc -arch i386 -isysroot ' 2997db96d56Sopenharmony_ci '/Developer/SDKs/MacOSX10.4u.sdk ' 3007db96d56Sopenharmony_ci '-fno-strict-aliasing -fno-common ' 3017db96d56Sopenharmony_ci '-dynamic -DNDEBUG -g -O3') 3027db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.4-universal') 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci _osx_support._remove_original_values(get_config_vars()) 3057db96d56Sopenharmony_ci get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc64 -isysroot ' 3067db96d56Sopenharmony_ci '/Developer/SDKs/MacOSX10.4u.sdk ' 3077db96d56Sopenharmony_ci '-fno-strict-aliasing -fno-common ' 3087db96d56Sopenharmony_ci '-dynamic -DNDEBUG -g -O3') 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.4-fat64') 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci for arch in ('ppc', 'i386', 'x86_64', 'ppc64'): 3137db96d56Sopenharmony_ci _osx_support._remove_original_values(get_config_vars()) 3147db96d56Sopenharmony_ci get_config_vars()['CFLAGS'] = ('-arch %s -isysroot ' 3157db96d56Sopenharmony_ci '/Developer/SDKs/MacOSX10.4u.sdk ' 3167db96d56Sopenharmony_ci '-fno-strict-aliasing -fno-common ' 3177db96d56Sopenharmony_ci '-dynamic -DNDEBUG -g -O3' % arch) 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'macosx-10.4-%s' % arch) 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci # linux debian sarge 3227db96d56Sopenharmony_ci os.name = 'posix' 3237db96d56Sopenharmony_ci sys.version = ('2.3.5 (#1, Jul 4 2007, 17:28:59) ' 3247db96d56Sopenharmony_ci '\n[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)]') 3257db96d56Sopenharmony_ci sys.platform = 'linux2' 3267db96d56Sopenharmony_ci self._set_uname(('Linux', 'aglae', '2.6.21.1dedibox-r7', 3277db96d56Sopenharmony_ci '#1 Mon Apr 30 17:25:38 CEST 2007', 'i686')) 3287db96d56Sopenharmony_ci 3297db96d56Sopenharmony_ci self.assertEqual(get_platform(), 'linux-i686') 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci # XXX more platforms to tests here 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci @unittest.skipIf(is_wasi, "Incompatible with WASI mapdir and OOT builds") 3347db96d56Sopenharmony_ci def test_get_config_h_filename(self): 3357db96d56Sopenharmony_ci config_h = sysconfig.get_config_h_filename() 3367db96d56Sopenharmony_ci self.assertTrue(os.path.isfile(config_h), config_h) 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci def test_get_scheme_names(self): 3397db96d56Sopenharmony_ci wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv'] 3407db96d56Sopenharmony_ci if HAS_USER_BASE: 3417db96d56Sopenharmony_ci wanted.extend(['nt_user', 'osx_framework_user', 'posix_user']) 3427db96d56Sopenharmony_ci self.assertEqual(get_scheme_names(), tuple(sorted(wanted))) 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_ci @skip_unless_symlink 3457db96d56Sopenharmony_ci @requires_subprocess() 3467db96d56Sopenharmony_ci def test_symlink(self): # Issue 7880 3477db96d56Sopenharmony_ci with PythonSymlink() as py: 3487db96d56Sopenharmony_ci cmd = "-c", "import sysconfig; print(sysconfig.get_platform())" 3497db96d56Sopenharmony_ci self.assertEqual(py.call_real(*cmd), py.call_link(*cmd)) 3507db96d56Sopenharmony_ci 3517db96d56Sopenharmony_ci def test_user_similar(self): 3527db96d56Sopenharmony_ci # Issue #8759: make sure the posix scheme for the users 3537db96d56Sopenharmony_ci # is similar to the global posix_prefix one 3547db96d56Sopenharmony_ci base = get_config_var('base') 3557db96d56Sopenharmony_ci if HAS_USER_BASE: 3567db96d56Sopenharmony_ci user = get_config_var('userbase') 3577db96d56Sopenharmony_ci # the global scheme mirrors the distinction between prefix and 3587db96d56Sopenharmony_ci # exec-prefix but not the user scheme, so we have to adapt the paths 3597db96d56Sopenharmony_ci # before comparing (issue #9100) 3607db96d56Sopenharmony_ci adapt = sys.base_prefix != sys.base_exec_prefix 3617db96d56Sopenharmony_ci for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): 3627db96d56Sopenharmony_ci global_path = get_path(name, 'posix_prefix') 3637db96d56Sopenharmony_ci if adapt: 3647db96d56Sopenharmony_ci global_path = global_path.replace(sys.exec_prefix, sys.base_prefix) 3657db96d56Sopenharmony_ci base = base.replace(sys.exec_prefix, sys.base_prefix) 3667db96d56Sopenharmony_ci elif sys.base_prefix != sys.prefix: 3677db96d56Sopenharmony_ci # virtual environment? Likewise, we have to adapt the paths 3687db96d56Sopenharmony_ci # before comparing 3697db96d56Sopenharmony_ci global_path = global_path.replace(sys.base_prefix, sys.prefix) 3707db96d56Sopenharmony_ci base = base.replace(sys.base_prefix, sys.prefix) 3717db96d56Sopenharmony_ci if HAS_USER_BASE: 3727db96d56Sopenharmony_ci user_path = get_path(name, 'posix_user') 3737db96d56Sopenharmony_ci expected = os.path.normpath(global_path.replace(base, user, 1)) 3747db96d56Sopenharmony_ci # bpo-44860: platlib of posix_user doesn't use sys.platlibdir, 3757db96d56Sopenharmony_ci # whereas posix_prefix does. 3767db96d56Sopenharmony_ci if name == 'platlib': 3777db96d56Sopenharmony_ci # Replace "/lib64/python3.11/site-packages" suffix 3787db96d56Sopenharmony_ci # with "/lib/python3.11/site-packages". 3797db96d56Sopenharmony_ci py_version_short = sysconfig.get_python_version() 3807db96d56Sopenharmony_ci suffix = f'python{py_version_short}/site-packages' 3817db96d56Sopenharmony_ci expected = expected.replace(f'/{sys.platlibdir}/{suffix}', 3827db96d56Sopenharmony_ci f'/lib/{suffix}') 3837db96d56Sopenharmony_ci self.assertEqual(user_path, expected) 3847db96d56Sopenharmony_ci 3857db96d56Sopenharmony_ci def test_main(self): 3867db96d56Sopenharmony_ci # just making sure _main() runs and returns things in the stdout 3877db96d56Sopenharmony_ci with captured_stdout() as output: 3887db96d56Sopenharmony_ci _main() 3897db96d56Sopenharmony_ci self.assertTrue(len(output.getvalue().split('\n')) > 0) 3907db96d56Sopenharmony_ci 3917db96d56Sopenharmony_ci @unittest.skipIf(sys.platform == "win32", "Does not apply to Windows") 3927db96d56Sopenharmony_ci def test_ldshared_value(self): 3937db96d56Sopenharmony_ci ldflags = sysconfig.get_config_var('LDFLAGS') 3947db96d56Sopenharmony_ci ldshared = sysconfig.get_config_var('LDSHARED') 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci self.assertIn(ldflags, ldshared) 3977db96d56Sopenharmony_ci 3987db96d56Sopenharmony_ci @unittest.skipUnless(sys.platform == "darwin", "test only relevant on MacOSX") 3997db96d56Sopenharmony_ci @requires_subprocess() 4007db96d56Sopenharmony_ci def test_platform_in_subprocess(self): 4017db96d56Sopenharmony_ci my_platform = sysconfig.get_platform() 4027db96d56Sopenharmony_ci 4037db96d56Sopenharmony_ci # Test without MACOSX_DEPLOYMENT_TARGET in the environment 4047db96d56Sopenharmony_ci 4057db96d56Sopenharmony_ci env = os.environ.copy() 4067db96d56Sopenharmony_ci if 'MACOSX_DEPLOYMENT_TARGET' in env: 4077db96d56Sopenharmony_ci del env['MACOSX_DEPLOYMENT_TARGET'] 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci p = subprocess.Popen([ 4107db96d56Sopenharmony_ci sys.executable, '-c', 4117db96d56Sopenharmony_ci 'import sysconfig; print(sysconfig.get_platform())', 4127db96d56Sopenharmony_ci ], 4137db96d56Sopenharmony_ci stdout=subprocess.PIPE, 4147db96d56Sopenharmony_ci stderr=subprocess.DEVNULL, 4157db96d56Sopenharmony_ci env=env) 4167db96d56Sopenharmony_ci test_platform = p.communicate()[0].strip() 4177db96d56Sopenharmony_ci test_platform = test_platform.decode('utf-8') 4187db96d56Sopenharmony_ci status = p.wait() 4197db96d56Sopenharmony_ci 4207db96d56Sopenharmony_ci self.assertEqual(status, 0) 4217db96d56Sopenharmony_ci self.assertEqual(my_platform, test_platform) 4227db96d56Sopenharmony_ci 4237db96d56Sopenharmony_ci # Test with MACOSX_DEPLOYMENT_TARGET in the environment, and 4247db96d56Sopenharmony_ci # using a value that is unlikely to be the default one. 4257db96d56Sopenharmony_ci env = os.environ.copy() 4267db96d56Sopenharmony_ci env['MACOSX_DEPLOYMENT_TARGET'] = '10.1' 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci p = subprocess.Popen([ 4297db96d56Sopenharmony_ci sys.executable, '-c', 4307db96d56Sopenharmony_ci 'import sysconfig; print(sysconfig.get_platform())', 4317db96d56Sopenharmony_ci ], 4327db96d56Sopenharmony_ci stdout=subprocess.PIPE, 4337db96d56Sopenharmony_ci stderr=subprocess.DEVNULL, 4347db96d56Sopenharmony_ci env=env) 4357db96d56Sopenharmony_ci test_platform = p.communicate()[0].strip() 4367db96d56Sopenharmony_ci test_platform = test_platform.decode('utf-8') 4377db96d56Sopenharmony_ci status = p.wait() 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci self.assertEqual(status, 0) 4407db96d56Sopenharmony_ci self.assertEqual(my_platform, test_platform) 4417db96d56Sopenharmony_ci 4427db96d56Sopenharmony_ci @unittest.skipIf(is_wasi, "Incompatible with WASI mapdir and OOT builds") 4437db96d56Sopenharmony_ci def test_srcdir(self): 4447db96d56Sopenharmony_ci # See Issues #15322, #15364. 4457db96d56Sopenharmony_ci srcdir = sysconfig.get_config_var('srcdir') 4467db96d56Sopenharmony_ci 4477db96d56Sopenharmony_ci self.assertTrue(os.path.isabs(srcdir), srcdir) 4487db96d56Sopenharmony_ci self.assertTrue(os.path.isdir(srcdir), srcdir) 4497db96d56Sopenharmony_ci 4507db96d56Sopenharmony_ci if sysconfig._PYTHON_BUILD: 4517db96d56Sopenharmony_ci # The python executable has not been installed so srcdir 4527db96d56Sopenharmony_ci # should be a full source checkout. 4537db96d56Sopenharmony_ci Python_h = os.path.join(srcdir, 'Include', 'Python.h') 4547db96d56Sopenharmony_ci self.assertTrue(os.path.exists(Python_h), Python_h) 4557db96d56Sopenharmony_ci # <srcdir>/PC/pyconfig.h always exists even if unused on POSIX. 4567db96d56Sopenharmony_ci pyconfig_h = os.path.join(srcdir, 'PC', 'pyconfig.h') 4577db96d56Sopenharmony_ci self.assertTrue(os.path.exists(pyconfig_h), pyconfig_h) 4587db96d56Sopenharmony_ci pyconfig_h_in = os.path.join(srcdir, 'pyconfig.h.in') 4597db96d56Sopenharmony_ci self.assertTrue(os.path.exists(pyconfig_h_in), pyconfig_h_in) 4607db96d56Sopenharmony_ci elif os.name == 'posix': 4617db96d56Sopenharmony_ci makefile_dir = os.path.dirname(sysconfig.get_makefile_filename()) 4627db96d56Sopenharmony_ci # Issue #19340: srcdir has been realpath'ed already 4637db96d56Sopenharmony_ci makefile_dir = os.path.realpath(makefile_dir) 4647db96d56Sopenharmony_ci self.assertEqual(makefile_dir, srcdir) 4657db96d56Sopenharmony_ci 4667db96d56Sopenharmony_ci def test_srcdir_independent_of_cwd(self): 4677db96d56Sopenharmony_ci # srcdir should be independent of the current working directory 4687db96d56Sopenharmony_ci # See Issues #15322, #15364. 4697db96d56Sopenharmony_ci srcdir = sysconfig.get_config_var('srcdir') 4707db96d56Sopenharmony_ci with change_cwd(os.pardir): 4717db96d56Sopenharmony_ci srcdir2 = sysconfig.get_config_var('srcdir') 4727db96d56Sopenharmony_ci self.assertEqual(srcdir, srcdir2) 4737db96d56Sopenharmony_ci 4747db96d56Sopenharmony_ci @unittest.skipIf(sysconfig.get_config_var('EXT_SUFFIX') is None, 4757db96d56Sopenharmony_ci 'EXT_SUFFIX required for this test') 4767db96d56Sopenharmony_ci def test_EXT_SUFFIX_in_vars(self): 4777db96d56Sopenharmony_ci import _imp 4787db96d56Sopenharmony_ci if not _imp.extension_suffixes(): 4797db96d56Sopenharmony_ci self.skipTest("stub loader has no suffixes") 4807db96d56Sopenharmony_ci vars = sysconfig.get_config_vars() 4817db96d56Sopenharmony_ci self.assertEqual(vars['EXT_SUFFIX'], _imp.extension_suffixes()[0]) 4827db96d56Sopenharmony_ci 4837db96d56Sopenharmony_ci @unittest.skipUnless(sys.platform == 'linux' and 4847db96d56Sopenharmony_ci hasattr(sys.implementation, '_multiarch'), 4857db96d56Sopenharmony_ci 'multiarch-specific test') 4867db96d56Sopenharmony_ci def test_triplet_in_ext_suffix(self): 4877db96d56Sopenharmony_ci ctypes = import_module('ctypes') 4887db96d56Sopenharmony_ci import platform, re 4897db96d56Sopenharmony_ci machine = platform.machine() 4907db96d56Sopenharmony_ci suffix = sysconfig.get_config_var('EXT_SUFFIX') 4917db96d56Sopenharmony_ci if re.match('(aarch64|arm|mips|ppc|powerpc|s390|sparc)', machine): 4927db96d56Sopenharmony_ci self.assertTrue('linux' in suffix, suffix) 4937db96d56Sopenharmony_ci if re.match('(i[3-6]86|x86_64)$', machine): 4947db96d56Sopenharmony_ci if ctypes.sizeof(ctypes.c_char_p()) == 4: 4957db96d56Sopenharmony_ci expected_suffixes = 'i386-linux-gnu.so', 'x86_64-linux-gnux32.so', 'i386-linux-musl.so' 4967db96d56Sopenharmony_ci else: # 8 byte pointer size 4977db96d56Sopenharmony_ci expected_suffixes = 'x86_64-linux-gnu.so', 'x86_64-linux-musl.so' 4987db96d56Sopenharmony_ci self.assertTrue(suffix.endswith(expected_suffixes), 4997db96d56Sopenharmony_ci f'unexpected suffix {suffix!r}') 5007db96d56Sopenharmony_ci 5017db96d56Sopenharmony_ci @unittest.skipUnless(sys.platform == 'darwin', 'OS X-specific test') 5027db96d56Sopenharmony_ci def test_osx_ext_suffix(self): 5037db96d56Sopenharmony_ci suffix = sysconfig.get_config_var('EXT_SUFFIX') 5047db96d56Sopenharmony_ci self.assertTrue(suffix.endswith('-darwin.so'), suffix) 5057db96d56Sopenharmony_ci 5067db96d56Sopenharmony_ciclass MakefileTests(unittest.TestCase): 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci @unittest.skipIf(sys.platform.startswith('win'), 5097db96d56Sopenharmony_ci 'Test is not Windows compatible') 5107db96d56Sopenharmony_ci @unittest.skipIf(is_wasi, "Incompatible with WASI mapdir and OOT builds") 5117db96d56Sopenharmony_ci def test_get_makefile_filename(self): 5127db96d56Sopenharmony_ci makefile = sysconfig.get_makefile_filename() 5137db96d56Sopenharmony_ci self.assertTrue(os.path.isfile(makefile), makefile) 5147db96d56Sopenharmony_ci 5157db96d56Sopenharmony_ci def test_parse_makefile(self): 5167db96d56Sopenharmony_ci self.addCleanup(unlink, TESTFN) 5177db96d56Sopenharmony_ci with open(TESTFN, "w") as makefile: 5187db96d56Sopenharmony_ci print("var1=a$(VAR2)", file=makefile) 5197db96d56Sopenharmony_ci print("VAR2=b$(var3)", file=makefile) 5207db96d56Sopenharmony_ci print("var3=42", file=makefile) 5217db96d56Sopenharmony_ci print("var4=$/invalid", file=makefile) 5227db96d56Sopenharmony_ci print("var5=dollar$$5", file=makefile) 5237db96d56Sopenharmony_ci print("var6=${var3}/lib/python3.5/config-$(VAR2)$(var5)" 5247db96d56Sopenharmony_ci "-x86_64-linux-gnu", file=makefile) 5257db96d56Sopenharmony_ci vars = sysconfig._parse_makefile(TESTFN) 5267db96d56Sopenharmony_ci self.assertEqual(vars, { 5277db96d56Sopenharmony_ci 'var1': 'ab42', 5287db96d56Sopenharmony_ci 'VAR2': 'b42', 5297db96d56Sopenharmony_ci 'var3': 42, 5307db96d56Sopenharmony_ci 'var4': '$/invalid', 5317db96d56Sopenharmony_ci 'var5': 'dollar$5', 5327db96d56Sopenharmony_ci 'var6': '42/lib/python3.5/config-b42dollar$5-x86_64-linux-gnu', 5337db96d56Sopenharmony_ci }) 5347db96d56Sopenharmony_ci 5357db96d56Sopenharmony_ci 5367db96d56Sopenharmony_ciif __name__ == "__main__": 5377db96d56Sopenharmony_ci unittest.main() 538