Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pdb: only use outcomes.exit via do_quit #5236

Merged
merged 1 commit into from
May 9, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/5235.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
``outcome.exit`` is not used with ``EOF`` in the pdb wrapper anymore, but only with ``quit``.
10 changes: 8 additions & 2 deletions src/_pytest/debugging.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,17 +181,23 @@ def do_continue(self, arg):

do_c = do_cont = do_continue

def set_quit(self):
def do_quit(self, arg):
"""Raise Exit outcome when quit command is used in pdb.

This is a bit of a hack - it would be better if BdbQuit
could be handled, but this would require to wrap the
whole pytest run, and adjust the report etc.
"""
super(PytestPdbWrapper, self).set_quit()
ret = super(PytestPdbWrapper, self).do_quit(arg)

if cls._recursive_debug == 0:
outcomes.exit("Quitting debugger")

return ret

do_q = do_quit
do_exit = do_quit

def setup(self, f, tb):
"""Suspend on setup().

Expand Down
32 changes: 30 additions & 2 deletions testing/test_pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import platform
import sys

import six

import _pytest._code
import pytest
from _pytest.debugging import _validate_usepdb_cls
Expand Down Expand Up @@ -395,7 +397,7 @@ def test_1():
child = testdir.spawn_pytest(str(p1))
child.expect("test_1")
child.expect("Pdb")
child.sendeof()
child.sendline("q")
rest = child.read().decode("utf8")
assert "no tests ran" in rest
assert "reading from stdin while output" not in rest
Expand Down Expand Up @@ -957,7 +959,7 @@ def test_1():
child = testdir.spawn_pytest(str(p1))
child.expect("test_1")
child.expect("Pdb")
child.sendeof()
child.sendline("quit")
rest = child.read().decode("utf8")
assert "Quitting debugger" in rest
assert "reading from stdin while output" not in rest
Expand Down Expand Up @@ -1163,3 +1165,29 @@ def runcall(self, *args, **kwds):
)
assert result.ret == 0
result.stdout.fnmatch_lines(["*runcall_called*", "* 1 passed in *"])


def test_raises_bdbquit_with_eoferror(testdir):
"""It is not guaranteed that DontReadFromInput's read is called."""
if six.PY2:
builtin_module = "__builtin__"
input_func = "raw_input"
else:
builtin_module = "builtins"
input_func = "input"
p1 = testdir.makepyfile(
"""
def input_without_read(*args, **kwargs):
raise EOFError()

def test(monkeypatch):
import {builtin_module}
monkeypatch.setattr({builtin_module}, {input_func!r}, input_without_read)
__import__('pdb').set_trace()
""".format(
builtin_module=builtin_module, input_func=input_func
)
)
result = testdir.runpytest(str(p1))
result.stdout.fnmatch_lines(["E *BdbQuit", "*= 1 failed in*"])
assert result.ret == 1