Makes test_underpth* tests more robust by copying the executable.

This commit is contained in:
Steve Dower 2016-10-29 08:50:31 -07:00
parent 0eacef3ecf
commit 1da055ee0d
2 changed files with 51 additions and 25 deletions

View File

@ -14,6 +14,7 @@ import re
import encodings
import urllib.request
import urllib.error
import shutil
import subprocess
import sysconfig
from copy import copy
@ -488,22 +489,44 @@ class StartupImportTests(unittest.TestCase):
'import site, sys; site.enablerlcompleter(); sys.exit(hasattr(sys, "__interactivehook__"))']).wait()
self.assertTrue(r, "'__interactivehook__' not added by enablerlcompleter()")
@classmethod
def _create_underpth_exe(self, lines):
exe_file = os.path.join(os.getenv('TEMP'), os.path.split(sys.executable)[1])
shutil.copy(sys.executable, exe_file)
_pth_file = os.path.splitext(exe_file)[0] + '._pth'
try:
with open(_pth_file, 'w') as f:
for line in lines:
print(line, file=f)
return exe_file
except:
os.unlink(_pth_file)
os.unlink(exe_file)
raise
@classmethod
def _cleanup_underpth_exe(self, exe_file):
_pth_file = os.path.splitext(exe_file)[0] + '._pth'
os.unlink(_pth_file)
os.unlink(exe_file)
@unittest.skipUnless(sys.platform == 'win32', "only supported on Windows")
def test_underpth_nosite_file(self):
_pth_file = os.path.splitext(sys.executable)[0] + '._pth'
try:
libpath = os.path.dirname(os.path.dirname(encodings.__file__))
with open(_pth_file, 'w') as f:
print('fake-path-name', file=f)
# Ensure the generated path is very long so that buffer
# resizing in getpathp.c is exercised
for _ in range(200):
print(libpath, file=f)
print('# comment', file=f)
libpath = os.path.dirname(os.path.dirname(encodings.__file__))
exe_prefix = os.path.dirname(sys.executable)
exe_file = self._create_underpth_exe([
'fake-path-name',
*[libpath for _ in range(200)],
'# comment',
'import site'
])
try:
env = os.environ.copy()
env['PYTHONPATH'] = 'from-env'
rc = subprocess.call([sys.executable, '-c',
env['PATH'] = '{};{}'.format(exe_prefix, os.getenv('PATH'))
rc = subprocess.call([exe_file, '-c',
'import sys; sys.exit(sys.flags.no_site and '
'len(sys.path) > 200 and '
'%r in sys.path and %r in sys.path and %r not in sys.path)' % (
@ -511,34 +534,34 @@ class StartupImportTests(unittest.TestCase):
libpath,
os.path.join(sys.prefix, 'from-env'),
)], env=env)
self.assertEqual(rc, 0)
finally:
os.unlink(_pth_file)
self._cleanup_underpth_exe(exe_file)
self.assertEqual(rc, 0)
@unittest.skipUnless(sys.platform == 'win32', "only supported on Windows")
def test_underpth_file(self):
_pth_file = os.path.splitext(sys.executable)[0] + '._pth'
libpath = os.path.dirname(os.path.dirname(encodings.__file__))
exe_prefix = os.path.dirname(sys.executable)
exe_file = self._create_underpth_exe([
'fake-path-name',
*[libpath for _ in range(200)],
'# comment',
'import site'
])
try:
libpath = os.path.dirname(os.path.dirname(encodings.__file__))
with open(_pth_file, 'w') as f:
print('fake-path-name', file=f)
for _ in range(200):
print(libpath, file=f)
print('# comment', file=f)
print('import site', file=f)
env = os.environ.copy()
env['PYTHONPATH'] = 'from-env'
rc = subprocess.call([sys.executable, '-c',
env['PATH'] = '{};{}'.format(exe_prefix, os.getenv('PATH'))
rc = subprocess.call([exe_file, '-c',
'import sys; sys.exit(not sys.flags.no_site and '
'%r in sys.path and %r in sys.path and %r not in sys.path)' % (
os.path.join(sys.prefix, 'fake-path-name'),
libpath,
os.path.join(sys.prefix, 'from-env'),
)], env=env)
self.assertEqual(rc, 0)
finally:
os.unlink(_pth_file)
self._cleanup_underpth_exe(exe_file)
self.assertEqual(rc, 0)
if __name__ == "__main__":

View File

@ -48,6 +48,9 @@ if defined qmode goto Qmode
echo Deleting .pyc/.pyo files ...
"%exe%" "%pcbuild%rmpyc.py"
echo Cleaning _pth files ...
if exist %prefix%*._pth del %prefix%*._pth
echo on
%cmd%
@echo off