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

This commit is contained in:
Steve Dower 2022-03-30 22:18:40 +01:00 committed by GitHub
parent 2ab609dd61
commit f3d5715492
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 32 additions and 6 deletions

View File

@ -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)