Home | History | Annotate | Download | only in test
      1 # A test suite for pdb; not very comprehensive at the moment.
      2 
      3 import doctest
      4 import os
      5 import pdb
      6 import sys
      7 import types
      8 import unittest
      9 import subprocess
     10 import textwrap
     11 
     12 from test import support
     13 # This little helper class is essential for testing pdb under doctest.
     14 from test.test_doctest import _FakeInput
     15 
     16 
     17 class PdbTestInput(object):
     18     """Context manager that makes testing Pdb in doctests easier."""
     19 
     20     def __init__(self, input):
     21         self.input = input
     22 
     23     def __enter__(self):
     24         self.real_stdin = sys.stdin
     25         sys.stdin = _FakeInput(self.input)
     26         self.orig_trace = sys.gettrace() if hasattr(sys, 'gettrace') else None
     27 
     28     def __exit__(self, *exc):
     29         sys.stdin = self.real_stdin
     30         if self.orig_trace:
     31             sys.settrace(self.orig_trace)
     32 
     33 
     34 def test_pdb_displayhook():
     35     """This tests the custom displayhook for pdb.
     36 
     37     >>> def test_function(foo, bar):
     38     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     39     ...     pass
     40 
     41     >>> with PdbTestInput([
     42     ...     'foo',
     43     ...     'bar',
     44     ...     'for i in range(5): print(i)',
     45     ...     'continue',
     46     ... ]):
     47     ...     test_function(1, None)
     48     > <doctest test.test_pdb.test_pdb_displayhook[0]>(3)test_function()
     49     -> pass
     50     (Pdb) foo
     51     1
     52     (Pdb) bar
     53     (Pdb) for i in range(5): print(i)
     54     0
     55     1
     56     2
     57     3
     58     4
     59     (Pdb) continue
     60     """
     61 
     62 
     63 def test_pdb_basic_commands():
     64     """Test the basic commands of pdb.
     65 
     66     >>> def test_function_2(foo, bar='default'):
     67     ...     print(foo)
     68     ...     for i in range(5):
     69     ...         print(i)
     70     ...     print(bar)
     71     ...     for i in range(10):
     72     ...         never_executed
     73     ...     print('after for')
     74     ...     print('...')
     75     ...     return foo.upper()
     76 
     77     >>> def test_function():
     78     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     79     ...     ret = test_function_2('baz')
     80     ...     print(ret)
     81 
     82     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
     83     ...     'step',       # entering the function call
     84     ...     'args',       # display function args
     85     ...     'list',       # list function source
     86     ...     'bt',         # display backtrace
     87     ...     'up',         # step up to test_function()
     88     ...     'down',       # step down to test_function_2() again
     89     ...     'next',       # stepping to print(foo)
     90     ...     'next',       # stepping to the for loop
     91     ...     'step',       # stepping into the for loop
     92     ...     'until',      # continuing until out of the for loop
     93     ...     'next',       # executing the print(bar)
     94     ...     'jump 8',     # jump over second for loop
     95     ...     'return',     # return out of function
     96     ...     'retval',     # display return value
     97     ...     'continue',
     98     ... ]):
     99     ...    test_function()
    100     > <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
    101     -> ret = test_function_2('baz')
    102     (Pdb) step
    103     --Call--
    104     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
    105     -> def test_function_2(foo, bar='default'):
    106     (Pdb) args
    107     foo = 'baz'
    108     bar = 'default'
    109     (Pdb) list
    110       1  ->     def test_function_2(foo, bar='default'):
    111       2             print(foo)
    112       3             for i in range(5):
    113       4                 print(i)
    114       5             print(bar)
    115       6             for i in range(10):
    116       7                 never_executed
    117       8             print('after for')
    118       9             print('...')
    119      10             return foo.upper()
    120     [EOF]
    121     (Pdb) bt
    122     ...
    123       <doctest test.test_pdb.test_pdb_basic_commands[2]>(18)<module>()
    124     -> test_function()
    125       <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
    126     -> ret = test_function_2('baz')
    127     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
    128     -> def test_function_2(foo, bar='default'):
    129     (Pdb) up
    130     > <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
    131     -> ret = test_function_2('baz')
    132     (Pdb) down
    133     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
    134     -> def test_function_2(foo, bar='default'):
    135     (Pdb) next
    136     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(2)test_function_2()
    137     -> print(foo)
    138     (Pdb) next
    139     baz
    140     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(3)test_function_2()
    141     -> for i in range(5):
    142     (Pdb) step
    143     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(4)test_function_2()
    144     -> print(i)
    145     (Pdb) until
    146     0
    147     1
    148     2
    149     3
    150     4
    151     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(5)test_function_2()
    152     -> print(bar)
    153     (Pdb) next
    154     default
    155     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(6)test_function_2()
    156     -> for i in range(10):
    157     (Pdb) jump 8
    158     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(8)test_function_2()
    159     -> print('after for')
    160     (Pdb) return
    161     after for
    162     ...
    163     --Return--
    164     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(10)test_function_2()->'BAZ'
    165     -> return foo.upper()
    166     (Pdb) retval
    167     'BAZ'
    168     (Pdb) continue
    169     BAZ
    170     """
    171 
    172 
    173 def test_pdb_breakpoint_commands():
    174     """Test basic commands related to breakpoints.
    175 
    176     >>> def test_function():
    177     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    178     ...     print(1)
    179     ...     print(2)
    180     ...     print(3)
    181     ...     print(4)
    182 
    183     First, need to clear bdb state that might be left over from previous tests.
    184     Otherwise, the new breakpoints might get assigned different numbers.
    185 
    186     >>> from bdb import Breakpoint
    187     >>> Breakpoint.next = 1
    188     >>> Breakpoint.bplist = {}
    189     >>> Breakpoint.bpbynumber = [None]
    190 
    191     Now test the breakpoint commands.  NORMALIZE_WHITESPACE is needed because
    192     the breakpoint list outputs a tab for the "stop only" and "ignore next"
    193     lines, which we don't want to put in here.
    194 
    195     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE
    196     ...     'break 3',
    197     ...     'disable 1',
    198     ...     'ignore 1 10',
    199     ...     'condition 1 1 < 2',
    200     ...     'break 4',
    201     ...     'break 4',
    202     ...     'break',
    203     ...     'clear 3',
    204     ...     'break',
    205     ...     'condition 1',
    206     ...     'enable 1',
    207     ...     'clear 1',
    208     ...     'commands 2',
    209     ...     'p "42"',
    210     ...     'print("42", 7*6)',     # Issue 18764 (not about breakpoints)
    211     ...     'end',
    212     ...     'continue',  # will stop at breakpoint 2 (line 4)
    213     ...     'clear',     # clear all!
    214     ...     'y',
    215     ...     'tbreak 5',
    216     ...     'continue',  # will stop at temporary breakpoint
    217     ...     'break',     # make sure breakpoint is gone
    218     ...     'continue',
    219     ... ]):
    220     ...    test_function()
    221     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(3)test_function()
    222     -> print(1)
    223     (Pdb) break 3
    224     Breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
    225     (Pdb) disable 1
    226     Disabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
    227     (Pdb) ignore 1 10
    228     Will ignore next 10 crossings of breakpoint 1.
    229     (Pdb) condition 1 1 < 2
    230     New condition set for breakpoint 1.
    231     (Pdb) break 4
    232     Breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
    233     (Pdb) break 4
    234     Breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
    235     (Pdb) break
    236     Num Type         Disp Enb   Where
    237     1   breakpoint   keep no    at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
    238             stop only if 1 < 2
    239             ignore next 10 hits
    240     2   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
    241     3   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
    242     (Pdb) clear 3
    243     Deleted breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
    244     (Pdb) break
    245     Num Type         Disp Enb   Where
    246     1   breakpoint   keep no    at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
    247             stop only if 1 < 2
    248             ignore next 10 hits
    249     2   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
    250     (Pdb) condition 1
    251     Breakpoint 1 is now unconditional.
    252     (Pdb) enable 1
    253     Enabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
    254     (Pdb) clear 1
    255     Deleted breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
    256     (Pdb) commands 2
    257     (com) p "42"
    258     (com) print("42", 7*6)
    259     (com) end
    260     (Pdb) continue
    261     1
    262     '42'
    263     42 42
    264     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(4)test_function()
    265     -> print(2)
    266     (Pdb) clear
    267     Clear all breaks? y
    268     Deleted breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
    269     (Pdb) tbreak 5
    270     Breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
    271     (Pdb) continue
    272     2
    273     Deleted breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
    274     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(5)test_function()
    275     -> print(3)
    276     (Pdb) break
    277     (Pdb) continue
    278     3
    279     4
    280     """
    281 
    282 
    283 def do_nothing():
    284     pass
    285 
    286 def do_something():
    287     print(42)
    288 
    289 def test_list_commands():
    290     """Test the list and source commands of pdb.
    291 
    292     >>> def test_function_2(foo):
    293     ...     import test.test_pdb
    294     ...     test.test_pdb.do_nothing()
    295     ...     'some...'
    296     ...     'more...'
    297     ...     'code...'
    298     ...     'to...'
    299     ...     'make...'
    300     ...     'a...'
    301     ...     'long...'
    302     ...     'listing...'
    303     ...     'useful...'
    304     ...     '...'
    305     ...     '...'
    306     ...     return foo
    307 
    308     >>> def test_function():
    309     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    310     ...     ret = test_function_2('baz')
    311 
    312     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
    313     ...     'list',      # list first function
    314     ...     'step',      # step into second function
    315     ...     'list',      # list second function
    316     ...     'list',      # continue listing to EOF
    317     ...     'list 1,3',  # list specific lines
    318     ...     'list x',    # invalid argument
    319     ...     'next',      # step to import
    320     ...     'next',      # step over import
    321     ...     'step',      # step into do_nothing
    322     ...     'longlist',  # list all lines
    323     ...     'source do_something',  # list all lines of function
    324     ...     'source fooxxx',        # something that doesn't exit
    325     ...     'continue',
    326     ... ]):
    327     ...    test_function()
    328     > <doctest test.test_pdb.test_list_commands[1]>(3)test_function()
    329     -> ret = test_function_2('baz')
    330     (Pdb) list
    331       1         def test_function():
    332       2             import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    333       3  ->         ret = test_function_2('baz')
    334     [EOF]
    335     (Pdb) step
    336     --Call--
    337     > <doctest test.test_pdb.test_list_commands[0]>(1)test_function_2()
    338     -> def test_function_2(foo):
    339     (Pdb) list
    340       1  ->     def test_function_2(foo):
    341       2             import test.test_pdb
    342       3             test.test_pdb.do_nothing()
    343       4             'some...'
    344       5             'more...'
    345       6             'code...'
    346       7             'to...'
    347       8             'make...'
    348       9             'a...'
    349      10             'long...'
    350      11             'listing...'
    351     (Pdb) list
    352      12             'useful...'
    353      13             '...'
    354      14             '...'
    355      15             return foo
    356     [EOF]
    357     (Pdb) list 1,3
    358       1  ->     def test_function_2(foo):
    359       2             import test.test_pdb
    360       3             test.test_pdb.do_nothing()
    361     (Pdb) list x
    362     *** ...
    363     (Pdb) next
    364     > <doctest test.test_pdb.test_list_commands[0]>(2)test_function_2()
    365     -> import test.test_pdb
    366     (Pdb) next
    367     > <doctest test.test_pdb.test_list_commands[0]>(3)test_function_2()
    368     -> test.test_pdb.do_nothing()
    369     (Pdb) step
    370     --Call--
    371     > ...test_pdb.py(...)do_nothing()
    372     -> def do_nothing():
    373     (Pdb) longlist
    374     ...  ->     def do_nothing():
    375     ...             pass
    376     (Pdb) source do_something
    377     ...         def do_something():
    378     ...             print(42)
    379     (Pdb) source fooxxx
    380     *** ...
    381     (Pdb) continue
    382     """
    383 
    384 
    385 def test_post_mortem():
    386     """Test post mortem traceback debugging.
    387 
    388     >>> def test_function_2():
    389     ...     try:
    390     ...         1/0
    391     ...     finally:
    392     ...         print('Exception!')
    393 
    394     >>> def test_function():
    395     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    396     ...     test_function_2()
    397     ...     print('Not reached.')
    398 
    399     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
    400     ...     'next',      # step over exception-raising call
    401     ...     'bt',        # get a backtrace
    402     ...     'list',      # list code of test_function()
    403     ...     'down',      # step into test_function_2()
    404     ...     'list',      # list code of test_function_2()
    405     ...     'continue',
    406     ... ]):
    407     ...    try:
    408     ...        test_function()
    409     ...    except ZeroDivisionError:
    410     ...        print('Correctly reraised.')
    411     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
    412     -> test_function_2()
    413     (Pdb) next
    414     Exception!
    415     ZeroDivisionError: division by zero
    416     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
    417     -> test_function_2()
    418     (Pdb) bt
    419     ...
    420       <doctest test.test_pdb.test_post_mortem[2]>(10)<module>()
    421     -> test_function()
    422     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
    423     -> test_function_2()
    424       <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2()
    425     -> 1/0
    426     (Pdb) list
    427       1         def test_function():
    428       2             import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    429       3  ->         test_function_2()
    430       4             print('Not reached.')
    431     [EOF]
    432     (Pdb) down
    433     > <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2()
    434     -> 1/0
    435     (Pdb) list
    436       1         def test_function_2():
    437       2             try:
    438       3  >>             1/0
    439       4             finally:
    440       5  ->             print('Exception!')
    441     [EOF]
    442     (Pdb) continue
    443     Correctly reraised.
    444     """
    445 
    446 
    447 def test_pdb_skip_modules():
    448     """This illustrates the simple case of module skipping.
    449 
    450     >>> def skip_module():
    451     ...     import string
    452     ...     import pdb; pdb.Pdb(skip=['stri*'], nosigint=True, readrc=False).set_trace()
    453     ...     string.capwords('FOO')
    454 
    455     >>> with PdbTestInput([
    456     ...     'step',
    457     ...     'continue',
    458     ... ]):
    459     ...     skip_module()
    460     > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()
    461     -> string.capwords('FOO')
    462     (Pdb) step
    463     --Return--
    464     > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()->None
    465     -> string.capwords('FOO')
    466     (Pdb) continue
    467     """
    468 
    469 
    470 # Module for testing skipping of module that makes a callback
    471 mod = types.ModuleType('module_to_skip')
    472 exec('def foo_pony(callback): x = 1; callback(); return None', mod.__dict__)
    473 
    474 
    475 def test_pdb_skip_modules_with_callback():
    476     """This illustrates skipping of modules that call into other code.
    477 
    478     >>> def skip_module():
    479     ...     def callback():
    480     ...         return None
    481     ...     import pdb; pdb.Pdb(skip=['module_to_skip*'], nosigint=True, readrc=False).set_trace()
    482     ...     mod.foo_pony(callback)
    483 
    484     >>> with PdbTestInput([
    485     ...     'step',
    486     ...     'step',
    487     ...     'step',
    488     ...     'step',
    489     ...     'step',
    490     ...     'continue',
    491     ... ]):
    492     ...     skip_module()
    493     ...     pass  # provides something to "step" to
    494     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()
    495     -> mod.foo_pony(callback)
    496     (Pdb) step
    497     --Call--
    498     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(2)callback()
    499     -> def callback():
    500     (Pdb) step
    501     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()
    502     -> return None
    503     (Pdb) step
    504     --Return--
    505     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()->None
    506     -> return None
    507     (Pdb) step
    508     --Return--
    509     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()->None
    510     -> mod.foo_pony(callback)
    511     (Pdb) step
    512     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[1]>(10)<module>()
    513     -> pass  # provides something to "step" to
    514     (Pdb) continue
    515     """
    516 
    517 
    518 def test_pdb_continue_in_bottomframe():
    519     """Test that "continue" and "next" work properly in bottom frame (issue #5294).
    520 
    521     >>> def test_function():
    522     ...     import pdb, sys; inst = pdb.Pdb(nosigint=True, readrc=False)
    523     ...     inst.set_trace()
    524     ...     inst.botframe = sys._getframe()  # hackery to get the right botframe
    525     ...     print(1)
    526     ...     print(2)
    527     ...     print(3)
    528     ...     print(4)
    529 
    530     >>> with PdbTestInput([  # doctest: +ELLIPSIS
    531     ...     'next',
    532     ...     'break 7',
    533     ...     'continue',
    534     ...     'next',
    535     ...     'continue',
    536     ...     'continue',
    537     ... ]):
    538     ...    test_function()
    539     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(4)test_function()
    540     -> inst.botframe = sys._getframe()  # hackery to get the right botframe
    541     (Pdb) next
    542     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(5)test_function()
    543     -> print(1)
    544     (Pdb) break 7
    545     Breakpoint ... at <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>:7
    546     (Pdb) continue
    547     1
    548     2
    549     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(7)test_function()
    550     -> print(3)
    551     (Pdb) next
    552     3
    553     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(8)test_function()
    554     -> print(4)
    555     (Pdb) continue
    556     4
    557     """
    558 
    559 
    560 def pdb_invoke(method, arg):
    561     """Run pdb.method(arg)."""
    562     getattr(pdb.Pdb(nosigint=True, readrc=False), method)(arg)
    563 
    564 
    565 def test_pdb_run_with_incorrect_argument():
    566     """Testing run and runeval with incorrect first argument.
    567 
    568     >>> pti = PdbTestInput(['continue',])
    569     >>> with pti:
    570     ...     pdb_invoke('run', lambda x: x)
    571     Traceback (most recent call last):
    572     TypeError: exec() arg 1 must be a string, bytes or code object
    573 
    574     >>> with pti:
    575     ...     pdb_invoke('runeval', lambda x: x)
    576     Traceback (most recent call last):
    577     TypeError: eval() arg 1 must be a string, bytes or code object
    578     """
    579 
    580 
    581 def test_pdb_run_with_code_object():
    582     """Testing run and runeval with code object as a first argument.
    583 
    584     >>> with PdbTestInput(['step','x', 'continue']):  # doctest: +ELLIPSIS
    585     ...     pdb_invoke('run', compile('x=1', '<string>', 'exec'))
    586     > <string>(1)<module>()...
    587     (Pdb) step
    588     --Return--
    589     > <string>(1)<module>()->None
    590     (Pdb) x
    591     1
    592     (Pdb) continue
    593 
    594     >>> with PdbTestInput(['x', 'continue']):
    595     ...     x=0
    596     ...     pdb_invoke('runeval', compile('x+1', '<string>', 'eval'))
    597     > <string>(1)<module>()->None
    598     (Pdb) x
    599     1
    600     (Pdb) continue
    601     """
    602 
    603 def test_next_until_return_at_return_event():
    604     """Test that pdb stops after a next/until/return issued at a return debug event.
    605 
    606     >>> def test_function_2():
    607     ...     x = 1
    608     ...     x = 2
    609 
    610     >>> def test_function():
    611     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    612     ...     test_function_2()
    613     ...     test_function_2()
    614     ...     test_function_2()
    615     ...     end = 1
    616 
    617     >>> from bdb import Breakpoint
    618     >>> Breakpoint.next = 1
    619     >>> with PdbTestInput(['break test_function_2',
    620     ...                    'continue',
    621     ...                    'return',
    622     ...                    'next',
    623     ...                    'continue',
    624     ...                    'return',
    625     ...                    'until',
    626     ...                    'continue',
    627     ...                    'return',
    628     ...                    'return',
    629     ...                    'continue']):
    630     ...     test_function()
    631     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(3)test_function()
    632     -> test_function_2()
    633     (Pdb) break test_function_2
    634     Breakpoint 1 at <doctest test.test_pdb.test_next_until_return_at_return_event[0]>:1
    635     (Pdb) continue
    636     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2()
    637     -> x = 1
    638     (Pdb) return
    639     --Return--
    640     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None
    641     -> x = 2
    642     (Pdb) next
    643     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(4)test_function()
    644     -> test_function_2()
    645     (Pdb) continue
    646     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2()
    647     -> x = 1
    648     (Pdb) return
    649     --Return--
    650     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None
    651     -> x = 2
    652     (Pdb) until
    653     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(5)test_function()
    654     -> test_function_2()
    655     (Pdb) continue
    656     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2()
    657     -> x = 1
    658     (Pdb) return
    659     --Return--
    660     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None
    661     -> x = 2
    662     (Pdb) return
    663     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(6)test_function()
    664     -> end = 1
    665     (Pdb) continue
    666     """
    667 
    668 def test_pdb_next_command_for_generator():
    669     """Testing skip unwindng stack on yield for generators for "next" command
    670 
    671     >>> def test_gen():
    672     ...     yield 0
    673     ...     return 1
    674     ...     yield 2
    675 
    676     >>> def test_function():
    677     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    678     ...     it = test_gen()
    679     ...     try:
    680     ...         if next(it) != 0:
    681     ...             raise AssertionError
    682     ...         next(it)
    683     ...     except StopIteration as ex:
    684     ...         if ex.value != 1:
    685     ...             raise AssertionError
    686     ...     print("finished")
    687 
    688     >>> with PdbTestInput(['step',
    689     ...                    'step',
    690     ...                    'step',
    691     ...                    'next',
    692     ...                    'next',
    693     ...                    'step',
    694     ...                    'step',
    695     ...                    'continue']):
    696     ...     test_function()
    697     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(3)test_function()
    698     -> it = test_gen()
    699     (Pdb) step
    700     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(4)test_function()
    701     -> try:
    702     (Pdb) step
    703     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(5)test_function()
    704     -> if next(it) != 0:
    705     (Pdb) step
    706     --Call--
    707     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(1)test_gen()
    708     -> def test_gen():
    709     (Pdb) next
    710     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(2)test_gen()
    711     -> yield 0
    712     (Pdb) next
    713     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen()
    714     -> return 1
    715     (Pdb) step
    716     --Return--
    717     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen()->1
    718     -> return 1
    719     (Pdb) step
    720     StopIteration: 1
    721     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(7)test_function()
    722     -> next(it)
    723     (Pdb) continue
    724     finished
    725     """
    726 
    727 def test_pdb_return_command_for_generator():
    728     """Testing no unwindng stack on yield for generators
    729        for "return" command
    730 
    731     >>> def test_gen():
    732     ...     yield 0
    733     ...     return 1
    734     ...     yield 2
    735 
    736     >>> def test_function():
    737     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    738     ...     it = test_gen()
    739     ...     try:
    740     ...         if next(it) != 0:
    741     ...             raise AssertionError
    742     ...         next(it)
    743     ...     except StopIteration as ex:
    744     ...         if ex.value != 1:
    745     ...             raise AssertionError
    746     ...     print("finished")
    747 
    748     >>> with PdbTestInput(['step',
    749     ...                    'step',
    750     ...                    'step',
    751     ...                    'return',
    752     ...                    'step',
    753     ...                    'step',
    754     ...                    'continue']):
    755     ...     test_function()
    756     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(3)test_function()
    757     -> it = test_gen()
    758     (Pdb) step
    759     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(4)test_function()
    760     -> try:
    761     (Pdb) step
    762     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(5)test_function()
    763     -> if next(it) != 0:
    764     (Pdb) step
    765     --Call--
    766     > <doctest test.test_pdb.test_pdb_return_command_for_generator[0]>(1)test_gen()
    767     -> def test_gen():
    768     (Pdb) return
    769     StopIteration: 1
    770     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(7)test_function()
    771     -> next(it)
    772     (Pdb) step
    773     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(8)test_function()
    774     -> except StopIteration as ex:
    775     (Pdb) step
    776     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(9)test_function()
    777     -> if ex.value != 1:
    778     (Pdb) continue
    779     finished
    780     """
    781 
    782 def test_pdb_until_command_for_generator():
    783     """Testing no unwindng stack on yield for generators
    784        for "until" command if target breakpoing is not reached
    785 
    786     >>> def test_gen():
    787     ...     yield 0
    788     ...     yield 1
    789     ...     yield 2
    790 
    791     >>> def test_function():
    792     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    793     ...     for i in test_gen():
    794     ...         print(i)
    795     ...     print("finished")
    796 
    797     >>> with PdbTestInput(['step',
    798     ...                    'until 4',
    799     ...                    'step',
    800     ...                    'step',
    801     ...                    'continue']):
    802     ...     test_function()
    803     > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(3)test_function()
    804     -> for i in test_gen():
    805     (Pdb) step
    806     --Call--
    807     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(1)test_gen()
    808     -> def test_gen():
    809     (Pdb) until 4
    810     0
    811     1
    812     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen()
    813     -> yield 2
    814     (Pdb) step
    815     --Return--
    816     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen()->2
    817     -> yield 2
    818     (Pdb) step
    819     > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(4)test_function()
    820     -> print(i)
    821     (Pdb) continue
    822     2
    823     finished
    824     """
    825 
    826 def test_pdb_next_command_in_generator_for_loop():
    827     """The next command on returning from a generator controlled by a for loop.
    828 
    829     >>> def test_gen():
    830     ...     yield 0
    831     ...     return 1
    832 
    833     >>> def test_function():
    834     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    835     ...     for i in test_gen():
    836     ...         print('value', i)
    837     ...     x = 123
    838 
    839     >>> with PdbTestInput(['break test_gen',
    840     ...                    'continue',
    841     ...                    'next',
    842     ...                    'next',
    843     ...                    'next',
    844     ...                    'continue']):
    845     ...     test_function()
    846     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function()
    847     -> for i in test_gen():
    848     (Pdb) break test_gen
    849     Breakpoint 6 at <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>:1
    850     (Pdb) continue
    851     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(2)test_gen()
    852     -> yield 0
    853     (Pdb) next
    854     value 0
    855     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(3)test_gen()
    856     -> return 1
    857     (Pdb) next
    858     Internal StopIteration: 1
    859     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function()
    860     -> for i in test_gen():
    861     (Pdb) next
    862     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(5)test_function()
    863     -> x = 123
    864     (Pdb) continue
    865     """
    866 
    867 def test_pdb_next_command_subiterator():
    868     """The next command in a generator with a subiterator.
    869 
    870     >>> def test_subgenerator():
    871     ...     yield 0
    872     ...     return 1
    873 
    874     >>> def test_gen():
    875     ...     x = yield from test_subgenerator()
    876     ...     return x
    877 
    878     >>> def test_function():
    879     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
    880     ...     for i in test_gen():
    881     ...         print('value', i)
    882     ...     x = 123
    883 
    884     >>> with PdbTestInput(['step',
    885     ...                    'step',
    886     ...                    'next',
    887     ...                    'next',
    888     ...                    'next',
    889     ...                    'continue']):
    890     ...     test_function()
    891     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function()
    892     -> for i in test_gen():
    893     (Pdb) step
    894     --Call--
    895     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(1)test_gen()
    896     -> def test_gen():
    897     (Pdb) step
    898     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(2)test_gen()
    899     -> x = yield from test_subgenerator()
    900     (Pdb) next
    901     value 0
    902     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(3)test_gen()
    903     -> return x
    904     (Pdb) next
    905     Internal StopIteration: 1
    906     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function()
    907     -> for i in test_gen():
    908     (Pdb) next
    909     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(5)test_function()
    910     -> x = 123
    911     (Pdb) continue
    912     """
    913 
    914 def test_pdb_issue_20766():
    915     """Test for reference leaks when the SIGINT handler is set.
    916 
    917     >>> def test_function():
    918     ...     i = 1
    919     ...     while i <= 2:
    920     ...         sess = pdb.Pdb()
    921     ...         sess.set_trace(sys._getframe())
    922     ...         print('pdb %d: %s' % (i, sess._previous_sigint_handler))
    923     ...         i += 1
    924 
    925     >>> with PdbTestInput(['continue',
    926     ...                    'continue']):
    927     ...     test_function()
    928     > <doctest test.test_pdb.test_pdb_issue_20766[0]>(6)test_function()
    929     -> print('pdb %d: %s' % (i, sess._previous_sigint_handler))
    930     (Pdb) continue
    931     pdb 1: <built-in function default_int_handler>
    932     > <doctest test.test_pdb.test_pdb_issue_20766[0]>(5)test_function()
    933     -> sess.set_trace(sys._getframe())
    934     (Pdb) continue
    935     pdb 2: <built-in function default_int_handler>
    936     """
    937 
    938 class PdbTestCase(unittest.TestCase):
    939 
    940     def run_pdb(self, script, commands):
    941         """Run 'script' lines with pdb and the pdb 'commands'."""
    942         filename = 'main.py'
    943         with open(filename, 'w') as f:
    944             f.write(textwrap.dedent(script))
    945         self.addCleanup(support.unlink, filename)
    946         self.addCleanup(support.rmtree, '__pycache__')
    947         cmd = [sys.executable, '-m', 'pdb', filename]
    948         stdout = stderr = None
    949         with subprocess.Popen(cmd, stdout=subprocess.PIPE,
    950                                    stdin=subprocess.PIPE,
    951                                    stderr=subprocess.STDOUT,
    952                                    ) as proc:
    953             stdout, stderr = proc.communicate(str.encode(commands))
    954         stdout = stdout and bytes.decode(stdout)
    955         stderr = stderr and bytes.decode(stderr)
    956         return stdout, stderr
    957 
    958     def _assert_find_function(self, file_content, func_name, expected):
    959         file_content = textwrap.dedent(file_content)
    960 
    961         with open(support.TESTFN, 'w') as f:
    962             f.write(file_content)
    963 
    964         expected = None if not expected else (
    965             expected[0], support.TESTFN, expected[1])
    966         self.assertEqual(
    967             expected, pdb.find_function(func_name, support.TESTFN))
    968 
    969     def test_find_function_empty_file(self):
    970         self._assert_find_function('', 'foo', None)
    971 
    972     def test_find_function_found(self):
    973         self._assert_find_function(
    974             """\
    975             def foo():
    976                 pass
    977 
    978             def bar():
    979                 pass
    980 
    981             def quux():
    982                 pass
    983             """,
    984             'bar',
    985             ('bar', 4),
    986         )
    987 
    988     def test_issue7964(self):
    989         # open the file as binary so we can force \r\n newline
    990         with open(support.TESTFN, 'wb') as f:
    991             f.write(b'print("testing my pdb")\r\n')
    992         cmd = [sys.executable, '-m', 'pdb', support.TESTFN]
    993         proc = subprocess.Popen(cmd,
    994             stdout=subprocess.PIPE,
    995             stdin=subprocess.PIPE,
    996             stderr=subprocess.STDOUT,
    997             )
    998         self.addCleanup(proc.stdout.close)
    999         stdout, stderr = proc.communicate(b'quit\n')
   1000         self.assertNotIn(b'SyntaxError', stdout,
   1001                          "Got a syntax error running test script under PDB")
   1002 
   1003     def test_issue13183(self):
   1004         script = """
   1005             from bar import bar
   1006 
   1007             def foo():
   1008                 bar()
   1009 
   1010             def nope():
   1011                 pass
   1012 
   1013             def foobar():
   1014                 foo()
   1015                 nope()
   1016 
   1017             foobar()
   1018         """
   1019         commands = """
   1020             from bar import bar
   1021             break bar
   1022             continue
   1023             step
   1024             step
   1025             quit
   1026         """
   1027         bar = """
   1028             def bar():
   1029                 pass
   1030         """
   1031         with open('bar.py', 'w') as f:
   1032             f.write(textwrap.dedent(bar))
   1033         self.addCleanup(support.unlink, 'bar.py')
   1034         stdout, stderr = self.run_pdb(script, commands)
   1035         self.assertTrue(
   1036             any('main.py(5)foo()->None' in l for l in stdout.splitlines()),
   1037             'Fail to step into the caller after a return')
   1038 
   1039     def test_issue13210(self):
   1040         # invoking "continue" on a non-main thread triggered an exception
   1041         # inside signal.signal
   1042 
   1043         # raises SkipTest if python was built without threads
   1044         support.import_module('threading')
   1045 
   1046         with open(support.TESTFN, 'wb') as f:
   1047             f.write(textwrap.dedent("""
   1048                 import threading
   1049                 import pdb
   1050 
   1051                 def start_pdb():
   1052                     pdb.Pdb(readrc=False).set_trace()
   1053                     x = 1
   1054                     y = 1
   1055 
   1056                 t = threading.Thread(target=start_pdb)
   1057                 t.start()""").encode('ascii'))
   1058         cmd = [sys.executable, '-u', support.TESTFN]
   1059         proc = subprocess.Popen(cmd,
   1060             stdout=subprocess.PIPE,
   1061             stdin=subprocess.PIPE,
   1062             stderr=subprocess.STDOUT,
   1063             )
   1064         self.addCleanup(proc.stdout.close)
   1065         stdout, stderr = proc.communicate(b'cont\n')
   1066         self.assertNotIn('Error', stdout.decode(),
   1067                          "Got an error running test script under PDB")
   1068 
   1069     def test_issue16180(self):
   1070         # A syntax error in the debuggee.
   1071         script = "def f: pass\n"
   1072         commands = ''
   1073         expected = "SyntaxError:"
   1074         stdout, stderr = self.run_pdb(script, commands)
   1075         self.assertIn(expected, stdout,
   1076             '\n\nExpected:\n{}\nGot:\n{}\n'
   1077             'Fail to handle a syntax error in the debuggee.'
   1078             .format(expected, stdout))
   1079 
   1080 
   1081     def test_readrc_kwarg(self):
   1082         script = textwrap.dedent("""
   1083             import pdb; pdb.Pdb(readrc=False).set_trace()
   1084 
   1085             print('hello')
   1086         """)
   1087 
   1088         save_home = os.environ.pop('HOME', None)
   1089         try:
   1090             with support.temp_cwd():
   1091                 with open('.pdbrc', 'w') as f:
   1092                     f.write("invalid\n")
   1093 
   1094                 with open('main.py', 'w') as f:
   1095                     f.write(script)
   1096 
   1097                 cmd = [sys.executable, 'main.py']
   1098                 proc = subprocess.Popen(
   1099                     cmd,
   1100                     stdout=subprocess.PIPE,
   1101                     stdin=subprocess.PIPE,
   1102                     stderr=subprocess.PIPE,
   1103                 )
   1104                 with proc:
   1105                     stdout, stderr = proc.communicate(b'q\n')
   1106                     self.assertNotIn("NameError: name 'invalid' is not defined",
   1107                                   stdout.decode())
   1108 
   1109         finally:
   1110             if save_home is not None:
   1111                 os.environ['HOME'] = save_home
   1112 
   1113     def tearDown(self):
   1114         support.unlink(support.TESTFN)
   1115 
   1116 
   1117 def load_tests(*args):
   1118     from test import test_pdb
   1119     suites = [unittest.makeSuite(PdbTestCase), doctest.DocTestSuite(test_pdb)]
   1120     return unittest.TestSuite(suites)
   1121 
   1122 
   1123 if __name__ == '__main__':
   1124     unittest.main()
   1125