Skip to content

Commit

Permalink
Merge pull request #8259 from nicoddemus/backport-8250
Browse files Browse the repository at this point in the history
[6.2.x] Fix faulthandler for Twisted Logger when used with "--capture=no"
  • Loading branch information
nicoddemus committed Jan 20, 2021
2 parents 14e0c3e + 8d605b9 commit 8003fd2
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 1 deletion.
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -21,6 +21,7 @@ Anders Hovmöller
Andras Mitzki
Andras Tim
Andrea Cimatoribus
Andreas Motl
Andreas Zeidler
Andrey Paramonov
Andrzej Klajnert
Expand Down
1 change: 1 addition & 0 deletions changelog/8249.bugfix.rst
@@ -0,0 +1 @@
Fix the ``faulthandler`` plugin for occasions when running with ``twisted.logger`` and using ``pytest --capture=no``.
7 changes: 6 additions & 1 deletion src/_pytest/faulthandler.py
Expand Up @@ -69,7 +69,12 @@ def pytest_unconfigure(self, config: Config) -> None:
@staticmethod
def _get_stderr_fileno():
try:
return sys.stderr.fileno()
fileno = sys.stderr.fileno()
# The Twisted Logger will return an invalid file descriptor since it is not backed
# by an FD. So, let's also forward this to the same code path as with pytest-xdist.
if fileno == -1:
raise AttributeError()
return fileno
except (AttributeError, io.UnsupportedOperation):
# 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
Expand Down
25 changes: 25 additions & 0 deletions testing/test_faulthandler.py
@@ -1,3 +1,4 @@
import io
import sys

import pytest
Expand Down Expand Up @@ -135,3 +136,27 @@ def test():
result.stdout.no_fnmatch_line(warning_line)
result.stdout.fnmatch_lines("*1 passed*")
assert result.ret == 0


def test_get_stderr_fileno_invalid_fd() -> None:
"""Test for faulthandler being able to handle invalid file descriptors for stderr (#8249)."""
from _pytest.faulthandler import FaultHandlerHooks

class StdErrWrapper(io.StringIO):
"""
Mimic ``twisted.logger.LoggingFile`` to simulate returning an invalid file descriptor.
https://github.com/twisted/twisted/blob/twisted-20.3.0/src/twisted/logger/_io.py#L132-L139
"""

def fileno(self):
return -1

wrapper = StdErrWrapper()

with pytest.MonkeyPatch.context() as mp:
mp.setattr("sys.stderr", wrapper)

# Even when the stderr wrapper signals an invalid file descriptor,
# ``_get_stderr_fileno()`` should return the real one.
assert FaultHandlerHooks._get_stderr_fileno() == 2

0 comments on commit 8003fd2

Please sign in to comment.