[Python-checkins] bpo-46566: Make test_launcher more robust to a variety of installs (GH-32204)

zooba webhook-mailer at python.org
Wed Mar 30 17:18:48 EDT 2022


https://github.com/python/cpython/commit/f3d5715492195fd2532fc1a5d73be07923cdf2e1
commit: f3d5715492195fd2532fc1a5d73be07923cdf2e1
branch: main
author: Steve Dower <steve.dower at python.org>
committer: zooba <steve.dower at microsoft.com>
date: 2022-03-30T22:18:40+01:00
summary:

bpo-46566: Make test_launcher more robust to a variety of installs (GH-32204)

files:
M Lib/test/test_launcher.py

diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py
index 2fb5aae628a67..52b1cfa212b88 100644
--- a/Lib/test/test_launcher.py
+++ b/Lib/test/test_launcher.py
@@ -151,6 +151,30 @@ def find_py(cls):
                     py_exe = Path(p) / PY_EXE
                     if py_exe.is_file():
                         break
+            else:
+                py_exe = None
+
+        # Test launch and check version, to exclude installs of older
+        # releases when running outside of a source tree
+        if py_exe:
+            try:
+                with subprocess.Popen(
+                    [py_exe, "-h"],
+                    stdin=subprocess.PIPE,
+                    stdout=subprocess.PIPE,
+                    stderr=subprocess.PIPE,
+                    encoding="ascii",
+                    errors="ignore",
+                ) as p:
+                    p.stdin.close()
+                    version = next(p.stdout).splitlines()[0].rpartition(" ")[2]
+                    p.stdout.read()
+                    p.wait(10)
+                if not sys.version.startswith(version):
+                    py_exe = None
+            except OSError:
+                py_exe = None
+
         if not py_exe:
             raise unittest.SkipTest(
                 "cannot locate '{}' for test".format(PY_EXE)
@@ -162,6 +186,7 @@ def run_py(self, args, env=None, allow_fail=False, expect_returncode=0):
             self.py_exe = self.find_py()
 
         env = {**os.environ, **(env or {}), "PYLAUNCHER_DEBUG": "1", "PYLAUNCHER_DRYRUN": "1"}
+        env.pop("VIRTUAL_ENV", None)
         with subprocess.Popen(
             [self.py_exe, *args],
             env=env,
@@ -216,7 +241,7 @@ def setUpClass(cls):
 
         if support.verbose:
             p = subprocess.check_output("reg query HKCU\\Software\\Python /s")
-            print(p.decode('mbcs'))
+            #print(p.decode('mbcs'))
 
 
     @classmethod
@@ -251,9 +276,9 @@ def test_list(self):
         found = {}
         expect = {}
         for line in data["stdout"].splitlines():
-            m = re.match(r"\s*(.+?)\s+(.+)$", line)
+            m = re.match(r"\s*(.+?)\s+?(\*\s+)?(.+)$", line)
             if m:
-                found[m.group(1)] = m.group(2)
+                found[m.group(1)] = m.group(3)
         for company in TEST_DATA:
             company_data = TEST_DATA[company]
             tags = [t for t in company_data if isinstance(company_data[t], dict)]
@@ -276,9 +301,9 @@ def test_list_paths(self):
         found = {}
         expect = {}
         for line in data["stdout"].splitlines():
-            m = re.match(r"\s*(.+?)\s+(.+)$", line)
+            m = re.match(r"\s*(.+?)\s+?(\*\s+)?(.+)$", line)
             if m:
-                found[m.group(1)] = m.group(2)
+                found[m.group(1)] = m.group(3)
         for company in TEST_DATA:
             company_data = TEST_DATA[company]
             tags = [t for t in company_data if isinstance(company_data[t], dict)]
@@ -415,9 +440,10 @@ def test_install(self):
         # If winget is runnable, we should find it. Otherwise, we'll be trying
         # to open the Store.
         try:
-            subprocess.check_call(["winget.exe", "--version"])
+            subprocess.check_call(["winget.exe", "--version"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
         except FileNotFoundError:
             self.assertIn("ms-windows-store://", cmd)
         else:
             self.assertIn("winget.exe", cmd)
+        # Both command lines include the store ID
         self.assertIn("9PJPW5LDXLZ5", cmd)



More information about the Python-checkins mailing list