Skip to content

Commit

Permalink
Perform a "unicode aware" check for maximum recursion depth error
Browse files Browse the repository at this point in the history
Avoid errors `UnicodeErrosr`s due non maximum recursion depth errors
when checking for those errors.
  • Loading branch information
prusse-martin committed Apr 9, 2016
1 parent 0eb80bc commit 7ce5873
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 4 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ Marc Schlaich
Mark Abramowitz
Markus Unterwaditzer
Martijn Faassen
Martin Prusse
Matt Bachmann
Michael Aquilina
Michael Birtwell
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@

*

* Fix maximum recursion depth detection when raised error class is not aware
of unicode/encoded bytes.
Thanks `@prusse-martin`_ for the PR (`#1506`_).

* Fix ``pytest.mark.skip`` mark when used in strict mode.
Thanks `@pquentin`_ for the PR and `@RonnyPfannschmidt`_ for
showing how to fix the bug.
Expand All @@ -15,6 +19,11 @@
Thanks `@omarkohl`_ for the PR.


.. _#1506: https://github.com/pytest-dev/pytest/pull/1506

.. _@prusse-martin: https://github.com/prusse-martin


2.9.1
=====

Expand Down
16 changes: 13 additions & 3 deletions _pytest/_code/code.py
Original file line number Diff line number Diff line change
Expand Up @@ -579,9 +579,8 @@ def repr_traceback(self, excinfo):
if self.tbfilter:
traceback = traceback.filter()
recursionindex = None
if excinfo.errisinstance(RuntimeError):
if "maximum recursion depth exceeded" in str(excinfo.value):
recursionindex = traceback.recursionindex()
if is_recursion_error(excinfo):
recursionindex = traceback.recursionindex()
last = traceback[-1]
entries = []
extraline = None
Expand Down Expand Up @@ -793,3 +792,14 @@ def getrawcode(obj, trycall=True):
return x
return obj

if sys.version_info[:2] >= (3, 5): # RecursionError introduced in 3.5
def is_recursion_error(excinfo):
return excinfo.errisinstance(RecursionError) # noqa
else:
def is_recursion_error(excinfo):
if not excinfo.errisinstance(RuntimeError):
return False
try:
return "maximum recursion depth exceeded" in str(excinfo.value)
except UnicodeError:
return False
18 changes: 17 additions & 1 deletion testing/code/test_excinfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import _pytest
import py
import pytest
from _pytest._code.code import FormattedExcinfo, ReprExceptionInfo
from _pytest._code.code import ExceptionInfo, FormattedExcinfo, ReprExceptionInfo

queue = py.builtin._tryimport('queue', 'Queue')

Expand Down Expand Up @@ -909,3 +909,19 @@ def i():
assert tw.lines[14] == "E ValueError"
assert tw.lines[15] == ""
assert tw.lines[16].endswith("mod.py:9: ValueError")


@pytest.mark.parametrize("style", ["short", "long"])
@pytest.mark.parametrize("encoding", [None, "utf8", "utf16"])
def test_repr_traceback_with_unicode(style, encoding):
msg = u'☹'
if encoding is not None:
msg = msg.encode(encoding)
try:
raise RuntimeError(msg)
except RuntimeError:
e_info = ExceptionInfo()
formatter = FormattedExcinfo(style=style)
repr_traceback = formatter.repr_traceback(e_info)
assert repr_traceback is not None

0 comments on commit 7ce5873

Please sign in to comment.