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