summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorItamar Oren <itamarost@gmail.com>2024-01-03 00:30:53 (GMT)
committerGitHub <noreply@github.com>2024-01-03 00:30:53 (GMT)
commit5dc79e3d7f26a6a871a89ce3efc9f1bcee7bb447 (patch)
treefbdf80b450e83b231eff8d7980a3071c048cd2f5
parentb0fb074d5983f07517cec76a37268f13c986d314 (diff)
downloadcpython-5dc79e3d7f26a6a871a89ce3efc9f1bcee7bb447.zip
cpython-5dc79e3d7f26a6a871a89ce3efc9f1bcee7bb447.tar.gz
cpython-5dc79e3d7f26a6a871a89ce3efc9f1bcee7bb447.tar.bz2
gh-113628: Fix test_site test with long stdlib paths (#113640)
-rw-r--r--Lib/test/test_site.py43
1 files changed, 21 insertions, 22 deletions
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
index 33d0975..9f199d9 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -641,10 +641,24 @@ class _pthFileTests(unittest.TestCase):
sys_path.append(abs_path)
return sys_path
+ def _get_pth_lines(self, libpath: str, *, import_site: bool):
+ pth_lines = ['fake-path-name']
+ # include 200 lines of `libpath` in _pth lines (or fewer
+ # if the `libpath` is long enough to get close to 32KB
+ # see https://github.com/python/cpython/issues/113628)
+ encoded_libpath_length = len(libpath.encode("utf-8"))
+ repetitions = min(200, 30000 // encoded_libpath_length)
+ if repetitions <= 2:
+ self.skipTest(
+ f"Python stdlib path is too long ({encoded_libpath_length:,} bytes)")
+ pth_lines.extend(libpath for _ in range(repetitions))
+ pth_lines.extend(['', '# comment'])
+ if import_site:
+ pth_lines.append('import site')
+ return pth_lines
+
@support.requires_subprocess()
def test_underpth_basic(self):
- libpath = test.support.STDLIB_DIR
- exe_prefix = os.path.dirname(sys.executable)
pth_lines = ['#.', '# ..', *sys.path, '.', '..']
exe_file = self._create_underpth_exe(pth_lines)
sys_path = self._calc_sys_path_for_underpth_nosite(
@@ -666,12 +680,7 @@ class _pthFileTests(unittest.TestCase):
def test_underpth_nosite_file(self):
libpath = test.support.STDLIB_DIR
exe_prefix = os.path.dirname(sys.executable)
- pth_lines = [
- 'fake-path-name',
- *[libpath for _ in range(200)],
- '',
- '# comment',
- ]
+ pth_lines = self._get_pth_lines(libpath, import_site=False)
exe_file = self._create_underpth_exe(pth_lines)
sys_path = self._calc_sys_path_for_underpth_nosite(
os.path.dirname(exe_file),
@@ -695,13 +704,8 @@ class _pthFileTests(unittest.TestCase):
def test_underpth_file(self):
libpath = test.support.STDLIB_DIR
exe_prefix = os.path.dirname(sys.executable)
- exe_file = self._create_underpth_exe([
- 'fake-path-name',
- *[libpath for _ in range(200)],
- '',
- '# comment',
- 'import site'
- ])
+ exe_file = self._create_underpth_exe(
+ self._get_pth_lines(libpath, import_site=True))
sys_prefix = os.path.dirname(exe_file)
env = os.environ.copy()
env['PYTHONPATH'] = 'from-env'
@@ -720,13 +724,8 @@ class _pthFileTests(unittest.TestCase):
def test_underpth_dll_file(self):
libpath = test.support.STDLIB_DIR
exe_prefix = os.path.dirname(sys.executable)
- exe_file = self._create_underpth_exe([
- 'fake-path-name',
- *[libpath for _ in range(200)],
- '',
- '# comment',
- 'import site'
- ], exe_pth=False)
+ exe_file = self._create_underpth_exe(
+ self._get_pth_lines(libpath, import_site=True), exe_pth=False)
sys_prefix = os.path.dirname(exe_file)
env = os.environ.copy()
env['PYTHONPATH'] = 'from-env'