17db96d56Sopenharmony_ci"""Tests for 'site'. 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciTests assume the initial paths in sys.path once the interpreter has begun 47db96d56Sopenharmony_ciexecuting have not been removed. 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci""" 77db96d56Sopenharmony_ciimport unittest 87db96d56Sopenharmony_ciimport test.support 97db96d56Sopenharmony_cifrom test import support 107db96d56Sopenharmony_cifrom test.support import os_helper 117db96d56Sopenharmony_cifrom test.support import socket_helper 127db96d56Sopenharmony_cifrom test.support import captured_stderr 137db96d56Sopenharmony_cifrom test.support.os_helper import TESTFN, EnvironmentVarGuard, change_cwd 147db96d56Sopenharmony_ciimport ast 157db96d56Sopenharmony_ciimport builtins 167db96d56Sopenharmony_ciimport encodings 177db96d56Sopenharmony_ciimport glob 187db96d56Sopenharmony_ciimport io 197db96d56Sopenharmony_ciimport os 207db96d56Sopenharmony_ciimport re 217db96d56Sopenharmony_ciimport shutil 227db96d56Sopenharmony_ciimport subprocess 237db96d56Sopenharmony_ciimport sys 247db96d56Sopenharmony_ciimport sysconfig 257db96d56Sopenharmony_ciimport tempfile 267db96d56Sopenharmony_ciimport urllib.error 277db96d56Sopenharmony_ciimport urllib.request 287db96d56Sopenharmony_cifrom unittest import mock 297db96d56Sopenharmony_cifrom copy import copy 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci# These tests are not particularly useful if Python was invoked with -S. 327db96d56Sopenharmony_ci# If you add tests that are useful under -S, this skip should be moved 337db96d56Sopenharmony_ci# to the class level. 347db96d56Sopenharmony_ciif sys.flags.no_site: 357db96d56Sopenharmony_ci raise unittest.SkipTest("Python was invoked with -S") 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ciimport site 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ciHAS_USER_SITE = (site.USER_SITE is not None) 417db96d56Sopenharmony_ciOLD_SYS_PATH = None 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_cidef setUpModule(): 457db96d56Sopenharmony_ci global OLD_SYS_PATH 467db96d56Sopenharmony_ci OLD_SYS_PATH = sys.path[:] 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci if site.ENABLE_USER_SITE and not os.path.isdir(site.USER_SITE): 497db96d56Sopenharmony_ci # need to add user site directory for tests 507db96d56Sopenharmony_ci try: 517db96d56Sopenharmony_ci os.makedirs(site.USER_SITE) 527db96d56Sopenharmony_ci # modify sys.path: will be restored by tearDownModule() 537db96d56Sopenharmony_ci site.addsitedir(site.USER_SITE) 547db96d56Sopenharmony_ci except PermissionError as exc: 557db96d56Sopenharmony_ci raise unittest.SkipTest('unable to create user site directory (%r): %s' 567db96d56Sopenharmony_ci % (site.USER_SITE, exc)) 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_cidef tearDownModule(): 607db96d56Sopenharmony_ci sys.path[:] = OLD_SYS_PATH 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ciclass HelperFunctionsTests(unittest.TestCase): 647db96d56Sopenharmony_ci """Tests for helper functions. 657db96d56Sopenharmony_ci """ 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci def setUp(self): 687db96d56Sopenharmony_ci """Save a copy of sys.path""" 697db96d56Sopenharmony_ci self.sys_path = sys.path[:] 707db96d56Sopenharmony_ci self.old_base = site.USER_BASE 717db96d56Sopenharmony_ci self.old_site = site.USER_SITE 727db96d56Sopenharmony_ci self.old_prefixes = site.PREFIXES 737db96d56Sopenharmony_ci self.original_vars = sysconfig._CONFIG_VARS 747db96d56Sopenharmony_ci self.old_vars = copy(sysconfig._CONFIG_VARS) 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci def tearDown(self): 777db96d56Sopenharmony_ci """Restore sys.path""" 787db96d56Sopenharmony_ci sys.path[:] = self.sys_path 797db96d56Sopenharmony_ci site.USER_BASE = self.old_base 807db96d56Sopenharmony_ci site.USER_SITE = self.old_site 817db96d56Sopenharmony_ci site.PREFIXES = self.old_prefixes 827db96d56Sopenharmony_ci sysconfig._CONFIG_VARS = self.original_vars 837db96d56Sopenharmony_ci # _CONFIG_VARS is None before get_config_vars() is called 847db96d56Sopenharmony_ci if sysconfig._CONFIG_VARS is not None: 857db96d56Sopenharmony_ci sysconfig._CONFIG_VARS.clear() 867db96d56Sopenharmony_ci sysconfig._CONFIG_VARS.update(self.old_vars) 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci def test_makepath(self): 897db96d56Sopenharmony_ci # Test makepath() have an absolute path for its first return value 907db96d56Sopenharmony_ci # and a case-normalized version of the absolute path for its 917db96d56Sopenharmony_ci # second value. 927db96d56Sopenharmony_ci path_parts = ("Beginning", "End") 937db96d56Sopenharmony_ci original_dir = os.path.join(*path_parts) 947db96d56Sopenharmony_ci abs_dir, norm_dir = site.makepath(*path_parts) 957db96d56Sopenharmony_ci self.assertEqual(os.path.abspath(original_dir), abs_dir) 967db96d56Sopenharmony_ci if original_dir == os.path.normcase(original_dir): 977db96d56Sopenharmony_ci self.assertEqual(abs_dir, norm_dir) 987db96d56Sopenharmony_ci else: 997db96d56Sopenharmony_ci self.assertEqual(os.path.normcase(abs_dir), norm_dir) 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci def test_init_pathinfo(self): 1027db96d56Sopenharmony_ci dir_set = site._init_pathinfo() 1037db96d56Sopenharmony_ci for entry in [site.makepath(path)[1] for path in sys.path 1047db96d56Sopenharmony_ci if path and os.path.exists(path)]: 1057db96d56Sopenharmony_ci self.assertIn(entry, dir_set, 1067db96d56Sopenharmony_ci "%s from sys.path not found in set returned " 1077db96d56Sopenharmony_ci "by _init_pathinfo(): %s" % (entry, dir_set)) 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci def pth_file_tests(self, pth_file): 1107db96d56Sopenharmony_ci """Contain common code for testing results of reading a .pth file""" 1117db96d56Sopenharmony_ci self.assertIn(pth_file.imported, sys.modules, 1127db96d56Sopenharmony_ci "%s not in sys.modules" % pth_file.imported) 1137db96d56Sopenharmony_ci self.assertIn(site.makepath(pth_file.good_dir_path)[0], sys.path) 1147db96d56Sopenharmony_ci self.assertFalse(os.path.exists(pth_file.bad_dir_path)) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci def test_addpackage(self): 1177db96d56Sopenharmony_ci # Make sure addpackage() imports if the line starts with 'import', 1187db96d56Sopenharmony_ci # adds directories to sys.path for any line in the file that is not a 1197db96d56Sopenharmony_ci # comment or import that is a valid directory name for where the .pth 1207db96d56Sopenharmony_ci # file resides; invalid directories are not added 1217db96d56Sopenharmony_ci pth_file = PthFile() 1227db96d56Sopenharmony_ci pth_file.cleanup(prep=True) # to make sure that nothing is 1237db96d56Sopenharmony_ci # pre-existing that shouldn't be 1247db96d56Sopenharmony_ci try: 1257db96d56Sopenharmony_ci pth_file.create() 1267db96d56Sopenharmony_ci site.addpackage(pth_file.base_dir, pth_file.filename, set()) 1277db96d56Sopenharmony_ci self.pth_file_tests(pth_file) 1287db96d56Sopenharmony_ci finally: 1297db96d56Sopenharmony_ci pth_file.cleanup() 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci def make_pth(self, contents, pth_dir='.', pth_name=TESTFN): 1327db96d56Sopenharmony_ci # Create a .pth file and return its (abspath, basename). 1337db96d56Sopenharmony_ci pth_dir = os.path.abspath(pth_dir) 1347db96d56Sopenharmony_ci pth_basename = pth_name + '.pth' 1357db96d56Sopenharmony_ci pth_fn = os.path.join(pth_dir, pth_basename) 1367db96d56Sopenharmony_ci with open(pth_fn, 'w', encoding='utf-8') as pth_file: 1377db96d56Sopenharmony_ci self.addCleanup(lambda: os.remove(pth_fn)) 1387db96d56Sopenharmony_ci pth_file.write(contents) 1397db96d56Sopenharmony_ci return pth_dir, pth_basename 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci def test_addpackage_import_bad_syntax(self): 1427db96d56Sopenharmony_ci # Issue 10642 1437db96d56Sopenharmony_ci pth_dir, pth_fn = self.make_pth("import bad-syntax\n") 1447db96d56Sopenharmony_ci with captured_stderr() as err_out: 1457db96d56Sopenharmony_ci site.addpackage(pth_dir, pth_fn, set()) 1467db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), "line 1") 1477db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), 1487db96d56Sopenharmony_ci re.escape(os.path.join(pth_dir, pth_fn))) 1497db96d56Sopenharmony_ci # XXX: the previous two should be independent checks so that the 1507db96d56Sopenharmony_ci # order doesn't matter. The next three could be a single check 1517db96d56Sopenharmony_ci # but my regex foo isn't good enough to write it. 1527db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), 'Traceback') 1537db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), r'import bad-syntax') 1547db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), 'SyntaxError') 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci def test_addpackage_import_bad_exec(self): 1577db96d56Sopenharmony_ci # Issue 10642 1587db96d56Sopenharmony_ci pth_dir, pth_fn = self.make_pth("randompath\nimport nosuchmodule\n") 1597db96d56Sopenharmony_ci with captured_stderr() as err_out: 1607db96d56Sopenharmony_ci site.addpackage(pth_dir, pth_fn, set()) 1617db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), "line 2") 1627db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), 1637db96d56Sopenharmony_ci re.escape(os.path.join(pth_dir, pth_fn))) 1647db96d56Sopenharmony_ci # XXX: ditto previous XXX comment. 1657db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), 'Traceback') 1667db96d56Sopenharmony_ci self.assertRegex(err_out.getvalue(), 'ModuleNotFoundError') 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci def test_addpackage_empty_lines(self): 1697db96d56Sopenharmony_ci # Issue 33689 1707db96d56Sopenharmony_ci pth_dir, pth_fn = self.make_pth("\n\n \n\n") 1717db96d56Sopenharmony_ci known_paths = site.addpackage(pth_dir, pth_fn, set()) 1727db96d56Sopenharmony_ci self.assertEqual(known_paths, set()) 1737db96d56Sopenharmony_ci 1747db96d56Sopenharmony_ci def test_addpackage_import_bad_pth_file(self): 1757db96d56Sopenharmony_ci # Issue 5258 1767db96d56Sopenharmony_ci pth_dir, pth_fn = self.make_pth("abc\x00def\n") 1777db96d56Sopenharmony_ci with captured_stderr() as err_out: 1787db96d56Sopenharmony_ci self.assertFalse(site.addpackage(pth_dir, pth_fn, set())) 1797db96d56Sopenharmony_ci self.maxDiff = None 1807db96d56Sopenharmony_ci self.assertEqual(err_out.getvalue(), "") 1817db96d56Sopenharmony_ci for path in sys.path: 1827db96d56Sopenharmony_ci if isinstance(path, str): 1837db96d56Sopenharmony_ci self.assertNotIn("abc\x00def", path) 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci def test_addsitedir(self): 1867db96d56Sopenharmony_ci # Same tests for test_addpackage since addsitedir() essentially just 1877db96d56Sopenharmony_ci # calls addpackage() for every .pth file in the directory 1887db96d56Sopenharmony_ci pth_file = PthFile() 1897db96d56Sopenharmony_ci pth_file.cleanup(prep=True) # Make sure that nothing is pre-existing 1907db96d56Sopenharmony_ci # that is tested for 1917db96d56Sopenharmony_ci try: 1927db96d56Sopenharmony_ci pth_file.create() 1937db96d56Sopenharmony_ci site.addsitedir(pth_file.base_dir, set()) 1947db96d56Sopenharmony_ci self.pth_file_tests(pth_file) 1957db96d56Sopenharmony_ci finally: 1967db96d56Sopenharmony_ci pth_file.cleanup() 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci # This tests _getuserbase, hence the double underline 1997db96d56Sopenharmony_ci # to distinguish from a test for getuserbase 2007db96d56Sopenharmony_ci def test__getuserbase(self): 2017db96d56Sopenharmony_ci self.assertEqual(site._getuserbase(), sysconfig._getuserbase()) 2027db96d56Sopenharmony_ci 2037db96d56Sopenharmony_ci @unittest.skipUnless(HAS_USER_SITE, 'need user site') 2047db96d56Sopenharmony_ci def test_get_path(self): 2057db96d56Sopenharmony_ci if sys.platform == 'darwin' and sys._framework: 2067db96d56Sopenharmony_ci scheme = 'osx_framework_user' 2077db96d56Sopenharmony_ci else: 2087db96d56Sopenharmony_ci scheme = os.name + '_user' 2097db96d56Sopenharmony_ci self.assertEqual(os.path.normpath(site._get_path(site._getuserbase())), 2107db96d56Sopenharmony_ci sysconfig.get_path('purelib', scheme)) 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci @unittest.skipUnless(site.ENABLE_USER_SITE, "requires access to PEP 370 " 2137db96d56Sopenharmony_ci "user-site (site.ENABLE_USER_SITE)") 2147db96d56Sopenharmony_ci @support.requires_subprocess() 2157db96d56Sopenharmony_ci def test_s_option(self): 2167db96d56Sopenharmony_ci # (ncoghlan) Change this to use script_helper... 2177db96d56Sopenharmony_ci usersite = os.path.normpath(site.USER_SITE) 2187db96d56Sopenharmony_ci self.assertIn(usersite, sys.path) 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci env = os.environ.copy() 2217db96d56Sopenharmony_ci rc = subprocess.call([sys.executable, '-c', 2227db96d56Sopenharmony_ci 'import sys; sys.exit(%r in sys.path)' % usersite], 2237db96d56Sopenharmony_ci env=env) 2247db96d56Sopenharmony_ci self.assertEqual(rc, 1) 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci env = os.environ.copy() 2277db96d56Sopenharmony_ci rc = subprocess.call([sys.executable, '-s', '-c', 2287db96d56Sopenharmony_ci 'import sys; sys.exit(%r in sys.path)' % usersite], 2297db96d56Sopenharmony_ci env=env) 2307db96d56Sopenharmony_ci if usersite == site.getsitepackages()[0]: 2317db96d56Sopenharmony_ci self.assertEqual(rc, 1) 2327db96d56Sopenharmony_ci else: 2337db96d56Sopenharmony_ci self.assertEqual(rc, 0, "User site still added to path with -s") 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci env = os.environ.copy() 2367db96d56Sopenharmony_ci env["PYTHONNOUSERSITE"] = "1" 2377db96d56Sopenharmony_ci rc = subprocess.call([sys.executable, '-c', 2387db96d56Sopenharmony_ci 'import sys; sys.exit(%r in sys.path)' % usersite], 2397db96d56Sopenharmony_ci env=env) 2407db96d56Sopenharmony_ci if usersite == site.getsitepackages()[0]: 2417db96d56Sopenharmony_ci self.assertEqual(rc, 1) 2427db96d56Sopenharmony_ci else: 2437db96d56Sopenharmony_ci self.assertEqual(rc, 0, 2447db96d56Sopenharmony_ci "User site still added to path with PYTHONNOUSERSITE") 2457db96d56Sopenharmony_ci 2467db96d56Sopenharmony_ci env = os.environ.copy() 2477db96d56Sopenharmony_ci env["PYTHONUSERBASE"] = "/tmp" 2487db96d56Sopenharmony_ci rc = subprocess.call([sys.executable, '-c', 2497db96d56Sopenharmony_ci 'import sys, site; sys.exit(site.USER_BASE.startswith("/tmp"))'], 2507db96d56Sopenharmony_ci env=env) 2517db96d56Sopenharmony_ci self.assertEqual(rc, 1, 2527db96d56Sopenharmony_ci "User base not set by PYTHONUSERBASE") 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci @unittest.skipUnless(HAS_USER_SITE, 'need user site') 2557db96d56Sopenharmony_ci def test_getuserbase(self): 2567db96d56Sopenharmony_ci site.USER_BASE = None 2577db96d56Sopenharmony_ci user_base = site.getuserbase() 2587db96d56Sopenharmony_ci 2597db96d56Sopenharmony_ci # the call sets site.USER_BASE 2607db96d56Sopenharmony_ci self.assertEqual(site.USER_BASE, user_base) 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci # let's set PYTHONUSERBASE and see if it uses it 2637db96d56Sopenharmony_ci site.USER_BASE = None 2647db96d56Sopenharmony_ci import sysconfig 2657db96d56Sopenharmony_ci sysconfig._CONFIG_VARS = None 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci with EnvironmentVarGuard() as environ: 2687db96d56Sopenharmony_ci environ['PYTHONUSERBASE'] = 'xoxo' 2697db96d56Sopenharmony_ci self.assertTrue(site.getuserbase().startswith('xoxo'), 2707db96d56Sopenharmony_ci site.getuserbase()) 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci @unittest.skipUnless(HAS_USER_SITE, 'need user site') 2737db96d56Sopenharmony_ci def test_getusersitepackages(self): 2747db96d56Sopenharmony_ci site.USER_SITE = None 2757db96d56Sopenharmony_ci site.USER_BASE = None 2767db96d56Sopenharmony_ci user_site = site.getusersitepackages() 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci # the call sets USER_BASE *and* USER_SITE 2797db96d56Sopenharmony_ci self.assertEqual(site.USER_SITE, user_site) 2807db96d56Sopenharmony_ci self.assertTrue(user_site.startswith(site.USER_BASE), user_site) 2817db96d56Sopenharmony_ci self.assertEqual(site.USER_BASE, site.getuserbase()) 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci def test_getsitepackages(self): 2847db96d56Sopenharmony_ci site.PREFIXES = ['xoxo'] 2857db96d56Sopenharmony_ci dirs = site.getsitepackages() 2867db96d56Sopenharmony_ci if os.sep == '/': 2877db96d56Sopenharmony_ci # OS X, Linux, FreeBSD, etc 2887db96d56Sopenharmony_ci if sys.platlibdir != "lib": 2897db96d56Sopenharmony_ci self.assertEqual(len(dirs), 2) 2907db96d56Sopenharmony_ci wanted = os.path.join('xoxo', sys.platlibdir, 2917db96d56Sopenharmony_ci 'python%d.%d' % sys.version_info[:2], 2927db96d56Sopenharmony_ci 'site-packages') 2937db96d56Sopenharmony_ci self.assertEqual(dirs[0], wanted) 2947db96d56Sopenharmony_ci else: 2957db96d56Sopenharmony_ci self.assertEqual(len(dirs), 1) 2967db96d56Sopenharmony_ci wanted = os.path.join('xoxo', 'lib', 2977db96d56Sopenharmony_ci 'python%d.%d' % sys.version_info[:2], 2987db96d56Sopenharmony_ci 'site-packages') 2997db96d56Sopenharmony_ci self.assertEqual(dirs[-1], wanted) 3007db96d56Sopenharmony_ci else: 3017db96d56Sopenharmony_ci # other platforms 3027db96d56Sopenharmony_ci self.assertEqual(len(dirs), 2) 3037db96d56Sopenharmony_ci self.assertEqual(dirs[0], 'xoxo') 3047db96d56Sopenharmony_ci wanted = os.path.join('xoxo', 'lib', 'site-packages') 3057db96d56Sopenharmony_ci self.assertEqual(os.path.normcase(dirs[1]), 3067db96d56Sopenharmony_ci os.path.normcase(wanted)) 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci @unittest.skipUnless(HAS_USER_SITE, 'need user site') 3097db96d56Sopenharmony_ci def test_no_home_directory(self): 3107db96d56Sopenharmony_ci # bpo-10496: getuserbase() and getusersitepackages() must not fail if 3117db96d56Sopenharmony_ci # the current user has no home directory (if expanduser() returns the 3127db96d56Sopenharmony_ci # path unchanged). 3137db96d56Sopenharmony_ci site.USER_SITE = None 3147db96d56Sopenharmony_ci site.USER_BASE = None 3157db96d56Sopenharmony_ci 3167db96d56Sopenharmony_ci with EnvironmentVarGuard() as environ, \ 3177db96d56Sopenharmony_ci mock.patch('os.path.expanduser', lambda path: path): 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci del environ['PYTHONUSERBASE'] 3207db96d56Sopenharmony_ci del environ['APPDATA'] 3217db96d56Sopenharmony_ci 3227db96d56Sopenharmony_ci user_base = site.getuserbase() 3237db96d56Sopenharmony_ci self.assertTrue(user_base.startswith('~' + os.sep), 3247db96d56Sopenharmony_ci user_base) 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci user_site = site.getusersitepackages() 3277db96d56Sopenharmony_ci self.assertTrue(user_site.startswith(user_base), user_site) 3287db96d56Sopenharmony_ci 3297db96d56Sopenharmony_ci with mock.patch('os.path.isdir', return_value=False) as mock_isdir, \ 3307db96d56Sopenharmony_ci mock.patch.object(site, 'addsitedir') as mock_addsitedir, \ 3317db96d56Sopenharmony_ci support.swap_attr(site, 'ENABLE_USER_SITE', True): 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci # addusersitepackages() must not add user_site to sys.path 3347db96d56Sopenharmony_ci # if it is not an existing directory 3357db96d56Sopenharmony_ci known_paths = set() 3367db96d56Sopenharmony_ci site.addusersitepackages(known_paths) 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci mock_isdir.assert_called_once_with(user_site) 3397db96d56Sopenharmony_ci mock_addsitedir.assert_not_called() 3407db96d56Sopenharmony_ci self.assertFalse(known_paths) 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_ci def test_trace(self): 3437db96d56Sopenharmony_ci message = "bla-bla-bla" 3447db96d56Sopenharmony_ci for verbose, out in (True, message + "\n"), (False, ""): 3457db96d56Sopenharmony_ci with mock.patch('sys.flags', mock.Mock(verbose=verbose)), \ 3467db96d56Sopenharmony_ci mock.patch('sys.stderr', io.StringIO()): 3477db96d56Sopenharmony_ci site._trace(message) 3487db96d56Sopenharmony_ci self.assertEqual(sys.stderr.getvalue(), out) 3497db96d56Sopenharmony_ci 3507db96d56Sopenharmony_ci 3517db96d56Sopenharmony_ciclass PthFile(object): 3527db96d56Sopenharmony_ci """Helper class for handling testing of .pth files""" 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci def __init__(self, filename_base=TESTFN, imported="time", 3557db96d56Sopenharmony_ci good_dirname="__testdir__", bad_dirname="__bad"): 3567db96d56Sopenharmony_ci """Initialize instance variables""" 3577db96d56Sopenharmony_ci self.filename = filename_base + ".pth" 3587db96d56Sopenharmony_ci self.base_dir = os.path.abspath('') 3597db96d56Sopenharmony_ci self.file_path = os.path.join(self.base_dir, self.filename) 3607db96d56Sopenharmony_ci self.imported = imported 3617db96d56Sopenharmony_ci self.good_dirname = good_dirname 3627db96d56Sopenharmony_ci self.bad_dirname = bad_dirname 3637db96d56Sopenharmony_ci self.good_dir_path = os.path.join(self.base_dir, self.good_dirname) 3647db96d56Sopenharmony_ci self.bad_dir_path = os.path.join(self.base_dir, self.bad_dirname) 3657db96d56Sopenharmony_ci 3667db96d56Sopenharmony_ci def create(self): 3677db96d56Sopenharmony_ci """Create a .pth file with a comment, blank lines, an ``import 3687db96d56Sopenharmony_ci <self.imported>``, a line with self.good_dirname, and a line with 3697db96d56Sopenharmony_ci self.bad_dirname. 3707db96d56Sopenharmony_ci 3717db96d56Sopenharmony_ci Creation of the directory for self.good_dir_path (based off of 3727db96d56Sopenharmony_ci self.good_dirname) is also performed. 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ci Make sure to call self.cleanup() to undo anything done by this method. 3757db96d56Sopenharmony_ci 3767db96d56Sopenharmony_ci """ 3777db96d56Sopenharmony_ci FILE = open(self.file_path, 'w') 3787db96d56Sopenharmony_ci try: 3797db96d56Sopenharmony_ci print("#import @bad module name", file=FILE) 3807db96d56Sopenharmony_ci print("\n", file=FILE) 3817db96d56Sopenharmony_ci print("import %s" % self.imported, file=FILE) 3827db96d56Sopenharmony_ci print(self.good_dirname, file=FILE) 3837db96d56Sopenharmony_ci print(self.bad_dirname, file=FILE) 3847db96d56Sopenharmony_ci finally: 3857db96d56Sopenharmony_ci FILE.close() 3867db96d56Sopenharmony_ci os.mkdir(self.good_dir_path) 3877db96d56Sopenharmony_ci 3887db96d56Sopenharmony_ci def cleanup(self, prep=False): 3897db96d56Sopenharmony_ci """Make sure that the .pth file is deleted, self.imported is not in 3907db96d56Sopenharmony_ci sys.modules, and that both self.good_dirname and self.bad_dirname are 3917db96d56Sopenharmony_ci not existing directories.""" 3927db96d56Sopenharmony_ci if os.path.exists(self.file_path): 3937db96d56Sopenharmony_ci os.remove(self.file_path) 3947db96d56Sopenharmony_ci if prep: 3957db96d56Sopenharmony_ci self.imported_module = sys.modules.get(self.imported) 3967db96d56Sopenharmony_ci if self.imported_module: 3977db96d56Sopenharmony_ci del sys.modules[self.imported] 3987db96d56Sopenharmony_ci else: 3997db96d56Sopenharmony_ci if self.imported_module: 4007db96d56Sopenharmony_ci sys.modules[self.imported] = self.imported_module 4017db96d56Sopenharmony_ci if os.path.exists(self.good_dir_path): 4027db96d56Sopenharmony_ci os.rmdir(self.good_dir_path) 4037db96d56Sopenharmony_ci if os.path.exists(self.bad_dir_path): 4047db96d56Sopenharmony_ci os.rmdir(self.bad_dir_path) 4057db96d56Sopenharmony_ci 4067db96d56Sopenharmony_ciclass ImportSideEffectTests(unittest.TestCase): 4077db96d56Sopenharmony_ci """Test side-effects from importing 'site'.""" 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci def setUp(self): 4107db96d56Sopenharmony_ci """Make a copy of sys.path""" 4117db96d56Sopenharmony_ci self.sys_path = sys.path[:] 4127db96d56Sopenharmony_ci 4137db96d56Sopenharmony_ci def tearDown(self): 4147db96d56Sopenharmony_ci """Restore sys.path""" 4157db96d56Sopenharmony_ci sys.path[:] = self.sys_path 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci def test_abs_paths_cached_None(self): 4187db96d56Sopenharmony_ci """Test for __cached__ is None. 4197db96d56Sopenharmony_ci 4207db96d56Sopenharmony_ci Regarding to PEP 3147, __cached__ can be None. 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci See also: https://bugs.python.org/issue30167 4237db96d56Sopenharmony_ci """ 4247db96d56Sopenharmony_ci sys.modules['test'].__cached__ = None 4257db96d56Sopenharmony_ci site.abs_paths() 4267db96d56Sopenharmony_ci self.assertIsNone(sys.modules['test'].__cached__) 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci def test_no_duplicate_paths(self): 4297db96d56Sopenharmony_ci # No duplicate paths should exist in sys.path 4307db96d56Sopenharmony_ci # Handled by removeduppaths() 4317db96d56Sopenharmony_ci site.removeduppaths() 4327db96d56Sopenharmony_ci seen_paths = set() 4337db96d56Sopenharmony_ci for path in sys.path: 4347db96d56Sopenharmony_ci self.assertNotIn(path, seen_paths) 4357db96d56Sopenharmony_ci seen_paths.add(path) 4367db96d56Sopenharmony_ci 4377db96d56Sopenharmony_ci @unittest.skip('test not implemented') 4387db96d56Sopenharmony_ci def test_add_build_dir(self): 4397db96d56Sopenharmony_ci # Test that the build directory's Modules directory is used when it 4407db96d56Sopenharmony_ci # should be. 4417db96d56Sopenharmony_ci # XXX: implement 4427db96d56Sopenharmony_ci pass 4437db96d56Sopenharmony_ci 4447db96d56Sopenharmony_ci def test_setting_quit(self): 4457db96d56Sopenharmony_ci # 'quit' and 'exit' should be injected into builtins 4467db96d56Sopenharmony_ci self.assertTrue(hasattr(builtins, "quit")) 4477db96d56Sopenharmony_ci self.assertTrue(hasattr(builtins, "exit")) 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci def test_setting_copyright(self): 4507db96d56Sopenharmony_ci # 'copyright', 'credits', and 'license' should be in builtins 4517db96d56Sopenharmony_ci self.assertTrue(hasattr(builtins, "copyright")) 4527db96d56Sopenharmony_ci self.assertTrue(hasattr(builtins, "credits")) 4537db96d56Sopenharmony_ci self.assertTrue(hasattr(builtins, "license")) 4547db96d56Sopenharmony_ci 4557db96d56Sopenharmony_ci def test_setting_help(self): 4567db96d56Sopenharmony_ci # 'help' should be set in builtins 4577db96d56Sopenharmony_ci self.assertTrue(hasattr(builtins, "help")) 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ci def test_sitecustomize_executed(self): 4607db96d56Sopenharmony_ci # If sitecustomize is available, it should have been imported. 4617db96d56Sopenharmony_ci if "sitecustomize" not in sys.modules: 4627db96d56Sopenharmony_ci try: 4637db96d56Sopenharmony_ci import sitecustomize 4647db96d56Sopenharmony_ci except ImportError: 4657db96d56Sopenharmony_ci pass 4667db96d56Sopenharmony_ci else: 4677db96d56Sopenharmony_ci self.fail("sitecustomize not imported automatically") 4687db96d56Sopenharmony_ci 4697db96d56Sopenharmony_ci @test.support.requires_resource('network') 4707db96d56Sopenharmony_ci @test.support.system_must_validate_cert 4717db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(urllib.request, "HTTPSHandler"), 4727db96d56Sopenharmony_ci 'need SSL support to download license') 4737db96d56Sopenharmony_ci def test_license_exists_at_url(self): 4747db96d56Sopenharmony_ci # This test is a bit fragile since it depends on the format of the 4757db96d56Sopenharmony_ci # string displayed by license in the absence of a LICENSE file. 4767db96d56Sopenharmony_ci url = license._Printer__data.split()[1] 4777db96d56Sopenharmony_ci req = urllib.request.Request(url, method='HEAD') 4787db96d56Sopenharmony_ci # Reset global urllib.request._opener 4797db96d56Sopenharmony_ci self.addCleanup(urllib.request.urlcleanup) 4807db96d56Sopenharmony_ci try: 4817db96d56Sopenharmony_ci with socket_helper.transient_internet(url): 4827db96d56Sopenharmony_ci with urllib.request.urlopen(req) as data: 4837db96d56Sopenharmony_ci code = data.getcode() 4847db96d56Sopenharmony_ci except urllib.error.HTTPError as e: 4857db96d56Sopenharmony_ci code = e.code 4867db96d56Sopenharmony_ci self.assertEqual(code, 200, msg="Can't find " + url) 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_ciclass StartupImportTests(unittest.TestCase): 4907db96d56Sopenharmony_ci 4917db96d56Sopenharmony_ci @support.requires_subprocess() 4927db96d56Sopenharmony_ci def test_startup_imports(self): 4937db96d56Sopenharmony_ci # Get sys.path in isolated mode (python3 -I) 4947db96d56Sopenharmony_ci popen = subprocess.Popen([sys.executable, '-X', 'utf8', '-I', 4957db96d56Sopenharmony_ci '-c', 'import sys; print(repr(sys.path))'], 4967db96d56Sopenharmony_ci stdout=subprocess.PIPE, 4977db96d56Sopenharmony_ci encoding='utf-8', 4987db96d56Sopenharmony_ci errors='surrogateescape') 4997db96d56Sopenharmony_ci stdout = popen.communicate()[0] 5007db96d56Sopenharmony_ci self.assertEqual(popen.returncode, 0, repr(stdout)) 5017db96d56Sopenharmony_ci isolated_paths = ast.literal_eval(stdout) 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_ci # bpo-27807: Even with -I, the site module executes all .pth files 5047db96d56Sopenharmony_ci # found in sys.path (see site.addpackage()). Skip the test if at least 5057db96d56Sopenharmony_ci # one .pth file is found. 5067db96d56Sopenharmony_ci for path in isolated_paths: 5077db96d56Sopenharmony_ci pth_files = glob.glob(os.path.join(glob.escape(path), "*.pth")) 5087db96d56Sopenharmony_ci if pth_files: 5097db96d56Sopenharmony_ci self.skipTest(f"found {len(pth_files)} .pth files in: {path}") 5107db96d56Sopenharmony_ci 5117db96d56Sopenharmony_ci # This tests checks which modules are loaded by Python when it 5127db96d56Sopenharmony_ci # initially starts upon startup. 5137db96d56Sopenharmony_ci popen = subprocess.Popen([sys.executable, '-X', 'utf8', '-I', '-v', 5147db96d56Sopenharmony_ci '-c', 'import sys; print(set(sys.modules))'], 5157db96d56Sopenharmony_ci stdout=subprocess.PIPE, 5167db96d56Sopenharmony_ci stderr=subprocess.PIPE, 5177db96d56Sopenharmony_ci encoding='utf-8', 5187db96d56Sopenharmony_ci errors='surrogateescape') 5197db96d56Sopenharmony_ci stdout, stderr = popen.communicate() 5207db96d56Sopenharmony_ci self.assertEqual(popen.returncode, 0, (stdout, stderr)) 5217db96d56Sopenharmony_ci modules = ast.literal_eval(stdout) 5227db96d56Sopenharmony_ci 5237db96d56Sopenharmony_ci self.assertIn('site', modules) 5247db96d56Sopenharmony_ci 5257db96d56Sopenharmony_ci # http://bugs.python.org/issue19205 5267db96d56Sopenharmony_ci re_mods = {'re', '_sre', 're._compiler', 're._constants', 're._parser'} 5277db96d56Sopenharmony_ci self.assertFalse(modules.intersection(re_mods), stderr) 5287db96d56Sopenharmony_ci 5297db96d56Sopenharmony_ci # http://bugs.python.org/issue9548 5307db96d56Sopenharmony_ci self.assertNotIn('locale', modules, stderr) 5317db96d56Sopenharmony_ci 5327db96d56Sopenharmony_ci # http://bugs.python.org/issue19209 5337db96d56Sopenharmony_ci self.assertNotIn('copyreg', modules, stderr) 5347db96d56Sopenharmony_ci 5357db96d56Sopenharmony_ci # http://bugs.python.org/issue19218 5367db96d56Sopenharmony_ci collection_mods = {'_collections', 'collections', 'functools', 5377db96d56Sopenharmony_ci 'heapq', 'itertools', 'keyword', 'operator', 5387db96d56Sopenharmony_ci 'reprlib', 'types', 'weakref' 5397db96d56Sopenharmony_ci }.difference(sys.builtin_module_names) 5407db96d56Sopenharmony_ci self.assertFalse(modules.intersection(collection_mods), stderr) 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ci @support.requires_subprocess() 5437db96d56Sopenharmony_ci def test_startup_interactivehook(self): 5447db96d56Sopenharmony_ci r = subprocess.Popen([sys.executable, '-c', 5457db96d56Sopenharmony_ci 'import sys; sys.exit(hasattr(sys, "__interactivehook__"))']).wait() 5467db96d56Sopenharmony_ci self.assertTrue(r, "'__interactivehook__' not added by site") 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ci @support.requires_subprocess() 5497db96d56Sopenharmony_ci def test_startup_interactivehook_isolated(self): 5507db96d56Sopenharmony_ci # issue28192 readline is not automatically enabled in isolated mode 5517db96d56Sopenharmony_ci r = subprocess.Popen([sys.executable, '-I', '-c', 5527db96d56Sopenharmony_ci 'import sys; sys.exit(hasattr(sys, "__interactivehook__"))']).wait() 5537db96d56Sopenharmony_ci self.assertFalse(r, "'__interactivehook__' added in isolated mode") 5547db96d56Sopenharmony_ci 5557db96d56Sopenharmony_ci @support.requires_subprocess() 5567db96d56Sopenharmony_ci def test_startup_interactivehook_isolated_explicit(self): 5577db96d56Sopenharmony_ci # issue28192 readline can be explicitly enabled in isolated mode 5587db96d56Sopenharmony_ci r = subprocess.Popen([sys.executable, '-I', '-c', 5597db96d56Sopenharmony_ci 'import site, sys; site.enablerlcompleter(); sys.exit(hasattr(sys, "__interactivehook__"))']).wait() 5607db96d56Sopenharmony_ci self.assertTrue(r, "'__interactivehook__' not added by enablerlcompleter()") 5617db96d56Sopenharmony_ci 5627db96d56Sopenharmony_ciclass _pthFileTests(unittest.TestCase): 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci if sys.platform == 'win32': 5657db96d56Sopenharmony_ci def _create_underpth_exe(self, lines, exe_pth=True): 5667db96d56Sopenharmony_ci import _winapi 5677db96d56Sopenharmony_ci temp_dir = tempfile.mkdtemp() 5687db96d56Sopenharmony_ci self.addCleanup(os_helper.rmtree, temp_dir) 5697db96d56Sopenharmony_ci exe_file = os.path.join(temp_dir, os.path.split(sys.executable)[1]) 5707db96d56Sopenharmony_ci dll_src_file = _winapi.GetModuleFileName(sys.dllhandle) 5717db96d56Sopenharmony_ci dll_file = os.path.join(temp_dir, os.path.split(dll_src_file)[1]) 5727db96d56Sopenharmony_ci shutil.copy(sys.executable, exe_file) 5737db96d56Sopenharmony_ci shutil.copy(dll_src_file, dll_file) 5747db96d56Sopenharmony_ci for fn in glob.glob(os.path.join(os.path.split(dll_src_file)[0], "vcruntime*.dll")): 5757db96d56Sopenharmony_ci shutil.copy(fn, os.path.join(temp_dir, os.path.split(fn)[1])) 5767db96d56Sopenharmony_ci if exe_pth: 5777db96d56Sopenharmony_ci _pth_file = os.path.splitext(exe_file)[0] + '._pth' 5787db96d56Sopenharmony_ci else: 5797db96d56Sopenharmony_ci _pth_file = os.path.splitext(dll_file)[0] + '._pth' 5807db96d56Sopenharmony_ci with open(_pth_file, 'w') as f: 5817db96d56Sopenharmony_ci for line in lines: 5827db96d56Sopenharmony_ci print(line, file=f) 5837db96d56Sopenharmony_ci return exe_file 5847db96d56Sopenharmony_ci else: 5857db96d56Sopenharmony_ci def _create_underpth_exe(self, lines, exe_pth=True): 5867db96d56Sopenharmony_ci if not exe_pth: 5877db96d56Sopenharmony_ci raise unittest.SkipTest("library ._pth file not supported on this platform") 5887db96d56Sopenharmony_ci temp_dir = tempfile.mkdtemp() 5897db96d56Sopenharmony_ci self.addCleanup(os_helper.rmtree, temp_dir) 5907db96d56Sopenharmony_ci exe_file = os.path.join(temp_dir, os.path.split(sys.executable)[1]) 5917db96d56Sopenharmony_ci os.symlink(sys.executable, exe_file) 5927db96d56Sopenharmony_ci _pth_file = exe_file + '._pth' 5937db96d56Sopenharmony_ci with open(_pth_file, 'w') as f: 5947db96d56Sopenharmony_ci for line in lines: 5957db96d56Sopenharmony_ci print(line, file=f) 5967db96d56Sopenharmony_ci return exe_file 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci def _calc_sys_path_for_underpth_nosite(self, sys_prefix, lines): 5997db96d56Sopenharmony_ci sys_path = [] 6007db96d56Sopenharmony_ci for line in lines: 6017db96d56Sopenharmony_ci if not line or line[0] == '#': 6027db96d56Sopenharmony_ci continue 6037db96d56Sopenharmony_ci abs_path = os.path.abspath(os.path.join(sys_prefix, line)) 6047db96d56Sopenharmony_ci sys_path.append(abs_path) 6057db96d56Sopenharmony_ci return sys_path 6067db96d56Sopenharmony_ci 6077db96d56Sopenharmony_ci @support.requires_subprocess() 6087db96d56Sopenharmony_ci def test_underpth_basic(self): 6097db96d56Sopenharmony_ci libpath = test.support.STDLIB_DIR 6107db96d56Sopenharmony_ci exe_prefix = os.path.dirname(sys.executable) 6117db96d56Sopenharmony_ci pth_lines = ['#.', '# ..', *sys.path, '.', '..'] 6127db96d56Sopenharmony_ci exe_file = self._create_underpth_exe(pth_lines) 6137db96d56Sopenharmony_ci sys_path = self._calc_sys_path_for_underpth_nosite( 6147db96d56Sopenharmony_ci os.path.dirname(exe_file), 6157db96d56Sopenharmony_ci pth_lines) 6167db96d56Sopenharmony_ci 6177db96d56Sopenharmony_ci output = subprocess.check_output([exe_file, '-c', 6187db96d56Sopenharmony_ci 'import sys; print("\\n".join(sys.path) if sys.flags.no_site else "")' 6197db96d56Sopenharmony_ci ], encoding='utf-8', errors='surrogateescape') 6207db96d56Sopenharmony_ci actual_sys_path = output.rstrip().split('\n') 6217db96d56Sopenharmony_ci self.assertTrue(actual_sys_path, "sys.flags.no_site was False") 6227db96d56Sopenharmony_ci self.assertEqual( 6237db96d56Sopenharmony_ci actual_sys_path, 6247db96d56Sopenharmony_ci sys_path, 6257db96d56Sopenharmony_ci "sys.path is incorrect" 6267db96d56Sopenharmony_ci ) 6277db96d56Sopenharmony_ci 6287db96d56Sopenharmony_ci @support.requires_subprocess() 6297db96d56Sopenharmony_ci def test_underpth_nosite_file(self): 6307db96d56Sopenharmony_ci libpath = test.support.STDLIB_DIR 6317db96d56Sopenharmony_ci exe_prefix = os.path.dirname(sys.executable) 6327db96d56Sopenharmony_ci pth_lines = [ 6337db96d56Sopenharmony_ci 'fake-path-name', 6347db96d56Sopenharmony_ci *[libpath for _ in range(200)], 6357db96d56Sopenharmony_ci '', 6367db96d56Sopenharmony_ci '# comment', 6377db96d56Sopenharmony_ci ] 6387db96d56Sopenharmony_ci exe_file = self._create_underpth_exe(pth_lines) 6397db96d56Sopenharmony_ci sys_path = self._calc_sys_path_for_underpth_nosite( 6407db96d56Sopenharmony_ci os.path.dirname(exe_file), 6417db96d56Sopenharmony_ci pth_lines) 6427db96d56Sopenharmony_ci 6437db96d56Sopenharmony_ci env = os.environ.copy() 6447db96d56Sopenharmony_ci env['PYTHONPATH'] = 'from-env' 6457db96d56Sopenharmony_ci env['PATH'] = '{}{}{}'.format(exe_prefix, os.pathsep, os.getenv('PATH')) 6467db96d56Sopenharmony_ci output = subprocess.check_output([exe_file, '-c', 6477db96d56Sopenharmony_ci 'import sys; print("\\n".join(sys.path) if sys.flags.no_site else "")' 6487db96d56Sopenharmony_ci ], env=env, encoding='utf-8', errors='surrogateescape') 6497db96d56Sopenharmony_ci actual_sys_path = output.rstrip().split('\n') 6507db96d56Sopenharmony_ci self.assertTrue(actual_sys_path, "sys.flags.no_site was False") 6517db96d56Sopenharmony_ci self.assertEqual( 6527db96d56Sopenharmony_ci actual_sys_path, 6537db96d56Sopenharmony_ci sys_path, 6547db96d56Sopenharmony_ci "sys.path is incorrect" 6557db96d56Sopenharmony_ci ) 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci @support.requires_subprocess() 6587db96d56Sopenharmony_ci def test_underpth_file(self): 6597db96d56Sopenharmony_ci libpath = test.support.STDLIB_DIR 6607db96d56Sopenharmony_ci exe_prefix = os.path.dirname(sys.executable) 6617db96d56Sopenharmony_ci exe_file = self._create_underpth_exe([ 6627db96d56Sopenharmony_ci 'fake-path-name', 6637db96d56Sopenharmony_ci *[libpath for _ in range(200)], 6647db96d56Sopenharmony_ci '', 6657db96d56Sopenharmony_ci '# comment', 6667db96d56Sopenharmony_ci 'import site' 6677db96d56Sopenharmony_ci ]) 6687db96d56Sopenharmony_ci sys_prefix = os.path.dirname(exe_file) 6697db96d56Sopenharmony_ci env = os.environ.copy() 6707db96d56Sopenharmony_ci env['PYTHONPATH'] = 'from-env' 6717db96d56Sopenharmony_ci env['PATH'] = '{};{}'.format(exe_prefix, os.getenv('PATH')) 6727db96d56Sopenharmony_ci rc = subprocess.call([exe_file, '-c', 6737db96d56Sopenharmony_ci 'import sys; sys.exit(not sys.flags.no_site and ' 6747db96d56Sopenharmony_ci '%r in sys.path and %r in sys.path and %r not in sys.path and ' 6757db96d56Sopenharmony_ci 'all("\\r" not in p and "\\n" not in p for p in sys.path))' % ( 6767db96d56Sopenharmony_ci os.path.join(sys_prefix, 'fake-path-name'), 6777db96d56Sopenharmony_ci libpath, 6787db96d56Sopenharmony_ci os.path.join(sys_prefix, 'from-env'), 6797db96d56Sopenharmony_ci )], env=env) 6807db96d56Sopenharmony_ci self.assertTrue(rc, "sys.path is incorrect") 6817db96d56Sopenharmony_ci 6827db96d56Sopenharmony_ci @support.requires_subprocess() 6837db96d56Sopenharmony_ci def test_underpth_dll_file(self): 6847db96d56Sopenharmony_ci libpath = test.support.STDLIB_DIR 6857db96d56Sopenharmony_ci exe_prefix = os.path.dirname(sys.executable) 6867db96d56Sopenharmony_ci exe_file = self._create_underpth_exe([ 6877db96d56Sopenharmony_ci 'fake-path-name', 6887db96d56Sopenharmony_ci *[libpath for _ in range(200)], 6897db96d56Sopenharmony_ci '', 6907db96d56Sopenharmony_ci '# comment', 6917db96d56Sopenharmony_ci 'import site' 6927db96d56Sopenharmony_ci ], exe_pth=False) 6937db96d56Sopenharmony_ci sys_prefix = os.path.dirname(exe_file) 6947db96d56Sopenharmony_ci env = os.environ.copy() 6957db96d56Sopenharmony_ci env['PYTHONPATH'] = 'from-env' 6967db96d56Sopenharmony_ci env['PATH'] = '{};{}'.format(exe_prefix, os.getenv('PATH')) 6977db96d56Sopenharmony_ci rc = subprocess.call([exe_file, '-c', 6987db96d56Sopenharmony_ci 'import sys; sys.exit(not sys.flags.no_site and ' 6997db96d56Sopenharmony_ci '%r in sys.path and %r in sys.path and %r not in sys.path and ' 7007db96d56Sopenharmony_ci 'all("\\r" not in p and "\\n" not in p for p in sys.path))' % ( 7017db96d56Sopenharmony_ci os.path.join(sys_prefix, 'fake-path-name'), 7027db96d56Sopenharmony_ci libpath, 7037db96d56Sopenharmony_ci os.path.join(sys_prefix, 'from-env'), 7047db96d56Sopenharmony_ci )], env=env) 7057db96d56Sopenharmony_ci self.assertTrue(rc, "sys.path is incorrect") 7067db96d56Sopenharmony_ci 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ciif __name__ == "__main__": 7097db96d56Sopenharmony_ci unittest.main() 710