1# A test suite for pdb; not very comprehensive at the moment.
2
3import doctest
4import os
5import pdb
6import sys
7import types
8import unittest
9import subprocess
10import textwrap
11
12from test import support
13# This little helper class is essential for testing pdb under doctest.
14from test.test_doctest import _FakeInput
15
16
17class 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
34def 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
63def 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
173def 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
283def do_nothing():
284    pass
285
286def do_something():
287    print(42)
288
289def 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
385def 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
447def 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
471mod = types.ModuleType('module_to_skip')
472exec('def foo_pony(callback): x = 1; callback(); return None', mod.__dict__)
473
474
475def 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
518def 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
560def pdb_invoke(method, arg):
561    """Run pdb.method(arg)."""
562    getattr(pdb.Pdb(nosigint=True, readrc=False), method)(arg)
563
564
565def 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
581def 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
603def 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
668def 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
727def 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
782def 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
826def 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
867def 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
914def 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
938class 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
1117def 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
1123if __name__ == '__main__':
1124    unittest.main()
1125