summaryrefslogtreecommitdiffstats
path: root/Lib/test/support
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2024-07-02 08:34:13 (GMT)
committerGitHub <noreply@github.com>2024-07-02 08:34:13 (GMT)
commit7435f053b4a54372a2c43dee7a15c4b973f09209 (patch)
treec6cbc234f02555bfb676c2e9e8e16c0e7d3a4c64 /Lib/test/support
parentbfe0e4d7696647a546110328510bdb98146ad2f2 (diff)
downloadcpython-7435f053b4a54372a2c43dee7a15c4b973f09209.zip
cpython-7435f053b4a54372a2c43dee7a15c4b973f09209.tar.gz
cpython-7435f053b4a54372a2c43dee7a15c4b973f09209.tar.bz2
Move get_signal_name() to test.support (#121251)
* Move get_signal_name() from test.libregrtest to test.support. * Use get_signal_name() in support.script_helper. * support.script_helper now decodes stdout and stderr from UTF-8, instead of ASCII, if a command failed.
Diffstat (limited to 'Lib/test/support')
-rw-r--r--Lib/test/support/__init__.py32
-rw-r--r--Lib/test/support/script_helper.py36
2 files changed, 51 insertions, 17 deletions
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index dbea070..18455bb 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -2632,3 +2632,35 @@ def initialized_with_pyrepl():
"""Detect whether PyREPL was used during Python initialization."""
# If the main module has a __file__ attribute it's a Python module, which means PyREPL.
return hasattr(sys.modules["__main__"], "__file__")
+
+
+WINDOWS_STATUS = {
+ 0xC0000005: "STATUS_ACCESS_VIOLATION",
+ 0xC00000FD: "STATUS_STACK_OVERFLOW",
+ 0xC000013A: "STATUS_CONTROL_C_EXIT",
+}
+
+def get_signal_name(exitcode):
+ import signal
+
+ if exitcode < 0:
+ signum = -exitcode
+ try:
+ return signal.Signals(signum).name
+ except ValueError:
+ pass
+
+ # Shell exit code (ex: WASI build)
+ if 128 < exitcode < 256:
+ signum = exitcode - 128
+ try:
+ return signal.Signals(signum).name
+ except ValueError:
+ pass
+
+ try:
+ return WINDOWS_STATUS[exitcode]
+ except KeyError:
+ pass
+
+ return None
diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
index 65e0bc1..d0be317 100644
--- a/Lib/test/support/script_helper.py
+++ b/Lib/test/support/script_helper.py
@@ -70,23 +70,25 @@ class _PythonRunResult(collections.namedtuple("_PythonRunResult",
out = b'(... truncated stdout ...)' + out[-maxlen:]
if len(err) > maxlen:
err = b'(... truncated stderr ...)' + err[-maxlen:]
- out = out.decode('ascii', 'replace').rstrip()
- err = err.decode('ascii', 'replace').rstrip()
- raise AssertionError("Process return code is %d\n"
- "command line: %r\n"
- "\n"
- "stdout:\n"
- "---\n"
- "%s\n"
- "---\n"
- "\n"
- "stderr:\n"
- "---\n"
- "%s\n"
- "---"
- % (self.rc, cmd_line,
- out,
- err))
+ out = out.decode('utf8', 'replace').rstrip()
+ err = err.decode('utf8', 'replace').rstrip()
+
+ exitcode = self.rc
+ signame = support.get_signal_name(exitcode)
+ if signame:
+ exitcode = f"{exitcode} ({signame})"
+ raise AssertionError(f"Process return code is {exitcode}\n"
+ f"command line: {cmd_line!r}\n"
+ f"\n"
+ f"stdout:\n"
+ f"---\n"
+ f"{out}\n"
+ f"---\n"
+ f"\n"
+ f"stderr:\n"
+ f"---\n"
+ f"{err}\n"
+ f"---")
# Executing the interpreter in a subprocess