Merge pull request #1093 from nicoddemus/relto-bug
Fix internal error when filtering tracebacks where one entry was generated by an exec() statement Fixes #995
This commit is contained in:
commit
b7fd3f0031
|
@ -1,6 +1,10 @@
|
||||||
2.8.2.dev
|
2.8.2.dev
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
- fix #995: fixed internal error when filtering tracebacks where one entry
|
||||||
|
was generated by an exec() statement.
|
||||||
|
Thanks Daniel Hahler, Ashley C Straw, Philippe Gauthier and Pavel Savchenko
|
||||||
|
for contributing and Bruno Oliveira for the PR.
|
||||||
|
|
||||||
2.8.1
|
2.8.1
|
||||||
-----
|
-----
|
||||||
|
|
|
@ -49,6 +49,13 @@ def _has_positional_arg(func):
|
||||||
|
|
||||||
|
|
||||||
def filter_traceback(entry):
|
def filter_traceback(entry):
|
||||||
|
# entry.path might sometimes return a str() object when the entry
|
||||||
|
# points to dynamically generated code
|
||||||
|
# see https://bitbucket.org/pytest-dev/py/issues/71
|
||||||
|
raw_filename = entry.frame.code.raw.co_filename
|
||||||
|
is_generated = '<' in raw_filename and '>' in raw_filename
|
||||||
|
if is_generated:
|
||||||
|
return False
|
||||||
return entry.path != cutdir1 and not entry.path.relto(cutdir2)
|
return entry.path != cutdir1 and not entry.path.relto(cutdir2)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -733,6 +733,54 @@ class TestTracebackCutting:
|
||||||
"E*NameError*",
|
"E*NameError*",
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_traceback_filter_error_during_fixture_collection(self, testdir):
|
||||||
|
"""integration test for issue #995.
|
||||||
|
"""
|
||||||
|
testdir.makepyfile("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
def fail_me(func):
|
||||||
|
ns = {}
|
||||||
|
exec('def w(): raise ValueError("fail me")', ns)
|
||||||
|
return ns['w']
|
||||||
|
|
||||||
|
@pytest.fixture(scope='class')
|
||||||
|
@fail_me
|
||||||
|
def fail_fixture():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_failing_fixture(fail_fixture):
|
||||||
|
pass
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
assert result.ret != 0
|
||||||
|
out = result.stdout.str()
|
||||||
|
assert "INTERNALERROR>" not in out
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
"*ValueError: fail me*",
|
||||||
|
"* 1 error in *",
|
||||||
|
])
|
||||||
|
|
||||||
|
def test_filter_traceback_accepts_non_paths(self):
|
||||||
|
"""test that filter_traceback() works around py.code.Code bug
|
||||||
|
where sometimes its "path" attribute is not a py.path.local object:
|
||||||
|
https://bitbucket.org/pytest-dev/py/issues/71
|
||||||
|
This fixes #995.
|
||||||
|
"""
|
||||||
|
from _pytest.python import filter_traceback
|
||||||
|
try:
|
||||||
|
ns = {}
|
||||||
|
exec('def foo(): raise ValueError', ns)
|
||||||
|
ns['foo']()
|
||||||
|
except ValueError:
|
||||||
|
import sys
|
||||||
|
_, _, tb = sys.exc_info()
|
||||||
|
|
||||||
|
tb = py.code.Traceback(tb)
|
||||||
|
assert isinstance(tb[-1].path, str) # symptom of the py.code bug
|
||||||
|
assert not filter_traceback(tb[-1])
|
||||||
|
|
||||||
|
|
||||||
class TestReportInfo:
|
class TestReportInfo:
|
||||||
def test_itemreport_reportinfo(self, testdir, linecomp):
|
def test_itemreport_reportinfo(self, testdir, linecomp):
|
||||||
testdir.makeconftest("""
|
testdir.makeconftest("""
|
||||||
|
|
Loading…
Reference in New Issue