summaryrefslogtreecommitdiffstats
path: root/contrib/python/pytest/py3/_pytest/faulthandler.py
diff options
context:
space:
mode:
authorAlexSm <[email protected]>2024-01-09 18:56:40 +0100
committerGitHub <[email protected]>2024-01-09 18:56:40 +0100
commite95f266d2a3e48e62015220588a4fd73d5d5a5cb (patch)
treea8a784b6931fe52ad5f511cfef85af14e5f63991 /contrib/python/pytest/py3/_pytest/faulthandler.py
parent50a65e3b48a82d5b51f272664da389f2e0b0c99a (diff)
Library import 6 (#888)
Diffstat (limited to 'contrib/python/pytest/py3/_pytest/faulthandler.py')
-rw-r--r--contrib/python/pytest/py3/_pytest/faulthandler.py23
1 files changed, 15 insertions, 8 deletions
diff --git a/contrib/python/pytest/py3/_pytest/faulthandler.py b/contrib/python/pytest/py3/_pytest/faulthandler.py
index af879aa44cf..d8c7e9fd3b6 100644
--- a/contrib/python/pytest/py3/_pytest/faulthandler.py
+++ b/contrib/python/pytest/py3/_pytest/faulthandler.py
@@ -1,4 +1,3 @@
-import io
import os
import sys
from typing import Generator
@@ -10,8 +9,8 @@ from _pytest.nodes import Item
from _pytest.stash import StashKey
+fault_handler_original_stderr_fd_key = StashKey[int]()
fault_handler_stderr_fd_key = StashKey[int]()
-fault_handler_originally_enabled_key = StashKey[bool]()
def pytest_addoption(parser: Parser) -> None:
@@ -25,8 +24,15 @@ def pytest_addoption(parser: Parser) -> None:
def pytest_configure(config: Config) -> None:
import faulthandler
- config.stash[fault_handler_stderr_fd_key] = os.dup(get_stderr_fileno())
- config.stash[fault_handler_originally_enabled_key] = faulthandler.is_enabled()
+ # at teardown we want to restore the original faulthandler fileno
+ # but faulthandler has no api to return the original fileno
+ # so here we stash the stderr fileno to be used at teardown
+ # sys.stderr and sys.__stderr__ may be closed or patched during the session
+ # so we can't rely on their values being good at that point (#11572).
+ stderr_fileno = get_stderr_fileno()
+ if faulthandler.is_enabled():
+ config.stash[fault_handler_original_stderr_fd_key] = stderr_fileno
+ config.stash[fault_handler_stderr_fd_key] = os.dup(stderr_fileno)
faulthandler.enable(file=config.stash[fault_handler_stderr_fd_key])
@@ -38,9 +44,10 @@ def pytest_unconfigure(config: Config) -> None:
if fault_handler_stderr_fd_key in config.stash:
os.close(config.stash[fault_handler_stderr_fd_key])
del config.stash[fault_handler_stderr_fd_key]
- if config.stash.get(fault_handler_originally_enabled_key, False):
- # Re-enable the faulthandler if it was originally enabled.
- faulthandler.enable(file=get_stderr_fileno())
+ # Re-enable the faulthandler if it was originally enabled.
+ if fault_handler_original_stderr_fd_key in config.stash:
+ faulthandler.enable(config.stash[fault_handler_original_stderr_fd_key])
+ del config.stash[fault_handler_original_stderr_fd_key]
def get_stderr_fileno() -> int:
@@ -51,7 +58,7 @@ def get_stderr_fileno() -> int:
if fileno == -1:
raise AttributeError()
return fileno
- except (AttributeError, io.UnsupportedOperation):
+ except (AttributeError, ValueError):
# pytest-xdist monkeypatches sys.stderr with an object that is not an actual file.
# https://docs.python.org/3/library/faulthandler.html#issue-with-file-descriptors
# This is potentially dangerous, but the best we can do.