]> granicus.if.org Git - python/commitdiff
Makes test_underpth* tests more robust by copying the executable.
authorSteve Dower <steve.dower@microsoft.com>
Sat, 29 Oct 2016 15:50:31 +0000 (08:50 -0700)
committerSteve Dower <steve.dower@microsoft.com>
Sat, 29 Oct 2016 15:50:31 +0000 (08:50 -0700)
Lib/test/test_site.py
PCbuild/rt.bat

index 5aedbdb801bec34939a9c7a089954757a80e9060..d245fd5e1bc8acbf178e1ffc2f362658eaeab9a2 100644 (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()")
 
-    @unittest.skipUnless(sys.platform == 'win32', "only supported on Windows")
-    def test_underpth_nosite_file(self):
-        _pth_file = os.path.splitext(sys.executable)[0] + '._pth'
+    @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:
-            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)
+                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):
+        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__":
index 7d4d0719ce45e375dc6702485b32e0e69d9dc385..35826727f3fa279da3b952e0d7c22120bc52e425 100644 (file)
@@ -48,6 +48,9 @@ if defined qmode goto Qmode
 echo Deleting .pyc/.pyo files ...\r
 "%exe%" "%pcbuild%rmpyc.py"\r
 \r
+echo Cleaning _pth files ...\r
+if exist %prefix%*._pth del %prefix%*._pth \r
+\r
 echo on\r
 %cmd%\r
 @echo off\r