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: do not raise outcomes.Exit with quit in debug #4968

Merged
merged 1 commit into from
Mar 29, 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
3 changes: 3 additions & 0 deletions changelog/4968.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The pdb ``quit`` command is handled properly when used after the ``debug`` command with `pdb++`_.

.. _pdb++: https://pypi.org/project/pdbpp/
9 changes: 8 additions & 1 deletion src/_pytest/debugging.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,15 @@ def do_continue(self, arg):
do_c = do_cont = do_continue

def set_quit(self):
"""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(_PdbWrapper, self).set_quit()
outcomes.exit("Quitting debugger")
if cls._recursive_debug == 0:
outcomes.exit("Quitting debugger")

def setup(self, f, tb):
"""Suspend on setup().
Expand Down
15 changes: 12 additions & 3 deletions testing/test_pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -519,16 +519,17 @@ def test_1():
assert "1 failed" in rest
self.flush(child)

def test_pdb_interaction_continue_recursive(self, testdir):
def test_pdb_with_injected_do_debug(self, testdir):
"""Simulates pdbpp, which injects Pdb into do_debug, and uses
self.__class__ in do_continue.
"""
p1 = testdir.makepyfile(
mytest="""
import pdb
import pytest

count_continue = 0

# Simulates pdbpp, which injects Pdb into do_debug, and uses
# self.__class__ in do_continue.
class CustomPdb(pdb.Pdb, object):
def do_debug(self, arg):
import sys
Expand Down Expand Up @@ -578,6 +579,14 @@ def test_1():
assert b"PDB continue" not in child.before
# No extra newline.
assert child.before.endswith(b"c\r\nprint_from_foo\r\n")

# set_debug should not raise outcomes.Exit, if used recrursively.
child.sendline("debug 42")
child.sendline("q")
child.expect("LEAVING RECURSIVE DEBUGGER")
assert b"ENTERING RECURSIVE DEBUGGER" in child.before
assert b"Quitting debugger" not in child.before

child.sendline("c")
child.expect(r"PDB continue \(IO-capturing resumed\)")
rest = child.read().decode("utf8")
Expand Down