blob: edc9e75438c799948f2b99e8b56a0f876f271fb9 [file] [log] [blame]
Georg Brandl46b9afc2010-07-30 09:14:20 +00001# A test suite for pdb; not very comprehensive at the moment.
Martin v. Löwis67880cc2012-05-02 07:41:22 +02002
Andrew Svetlovf0efea02013-03-18 10:09:50 -07003import doctest
Georg Brandl6cccb862010-07-30 14:16:43 +00004import pdb
Georg Brandl243ad662009-05-05 09:00:19 +00005import sys
Brett Cannon9529fbf2013-06-15 17:11:25 -04006import types
Georg Brandl6cccb862010-07-30 14:16:43 +00007import unittest
8import subprocess
Senthil Kumaran42d70812012-05-01 10:07:49 +08009import textwrap
Georg Brandl243ad662009-05-05 09:00:19 +000010
11from test import support
12# This little helper class is essential for testing pdb under doctest.
13from test.test_doctest import _FakeInput
14
15
Georg Brandl9fa2e022009-09-16 16:40:45 +000016class PdbTestInput(object):
17 """Context manager that makes testing Pdb in doctests easier."""
18
19 def __init__(self, input):
20 self.input = input
21
22 def __enter__(self):
23 self.real_stdin = sys.stdin
24 sys.stdin = _FakeInput(self.input)
Brett Cannon31f59292011-02-21 19:29:56 +000025 self.orig_trace = sys.gettrace() if hasattr(sys, 'gettrace') else None
Georg Brandl9fa2e022009-09-16 16:40:45 +000026
27 def __exit__(self, *exc):
28 sys.stdin = self.real_stdin
Brett Cannon31f59292011-02-21 19:29:56 +000029 if self.orig_trace:
30 sys.settrace(self.orig_trace)
Georg Brandl9fa2e022009-09-16 16:40:45 +000031
32
33def test_pdb_displayhook():
34 """This tests the custom displayhook for pdb.
35
36 >>> def test_function(foo, bar):
Georg Brandl34748cd2010-12-04 17:11:36 +000037 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl9fa2e022009-09-16 16:40:45 +000038 ... pass
39
40 >>> with PdbTestInput([
41 ... 'foo',
42 ... 'bar',
43 ... 'for i in range(5): print(i)',
44 ... 'continue',
45 ... ]):
46 ... test_function(1, None)
47 > <doctest test.test_pdb.test_pdb_displayhook[0]>(3)test_function()
48 -> pass
49 (Pdb) foo
50 1
51 (Pdb) bar
52 (Pdb) for i in range(5): print(i)
53 0
54 1
55 2
56 3
57 4
58 (Pdb) continue
59 """
60
61
Georg Brandl0d089622010-07-30 16:00:46 +000062def test_pdb_basic_commands():
63 """Test the basic commands of pdb.
64
65 >>> def test_function_2(foo, bar='default'):
66 ... print(foo)
67 ... for i in range(5):
68 ... print(i)
69 ... print(bar)
70 ... for i in range(10):
71 ... never_executed
72 ... print('after for')
73 ... print('...')
74 ... return foo.upper()
75
76 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +000077 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl0d089622010-07-30 16:00:46 +000078 ... ret = test_function_2('baz')
79 ... print(ret)
80
81 >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
82 ... 'step', # entering the function call
83 ... 'args', # display function args
84 ... 'list', # list function source
85 ... 'bt', # display backtrace
86 ... 'up', # step up to test_function()
87 ... 'down', # step down to test_function_2() again
88 ... 'next', # stepping to print(foo)
89 ... 'next', # stepping to the for loop
90 ... 'step', # stepping into the for loop
91 ... 'until', # continuing until out of the for loop
92 ... 'next', # executing the print(bar)
93 ... 'jump 8', # jump over second for loop
94 ... 'return', # return out of function
95 ... 'retval', # display return value
96 ... 'continue',
97 ... ]):
98 ... test_function()
99 > <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
100 -> ret = test_function_2('baz')
101 (Pdb) step
102 --Call--
103 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
104 -> def test_function_2(foo, bar='default'):
105 (Pdb) args
106 foo = 'baz'
107 bar = 'default'
108 (Pdb) list
109 1 -> def test_function_2(foo, bar='default'):
110 2 print(foo)
111 3 for i in range(5):
112 4 print(i)
113 5 print(bar)
114 6 for i in range(10):
115 7 never_executed
116 8 print('after for')
117 9 print('...')
118 10 return foo.upper()
119 [EOF]
120 (Pdb) bt
121 ...
122 <doctest test.test_pdb.test_pdb_basic_commands[2]>(18)<module>()
123 -> test_function()
124 <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
125 -> ret = test_function_2('baz')
126 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
127 -> def test_function_2(foo, bar='default'):
128 (Pdb) up
129 > <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
130 -> ret = test_function_2('baz')
131 (Pdb) down
132 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
133 -> def test_function_2(foo, bar='default'):
134 (Pdb) next
135 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(2)test_function_2()
136 -> print(foo)
137 (Pdb) next
138 baz
139 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(3)test_function_2()
140 -> for i in range(5):
141 (Pdb) step
142 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(4)test_function_2()
143 -> print(i)
144 (Pdb) until
145 0
146 1
147 2
148 3
149 4
150 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(5)test_function_2()
151 -> print(bar)
152 (Pdb) next
153 default
154 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(6)test_function_2()
155 -> for i in range(10):
156 (Pdb) jump 8
157 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(8)test_function_2()
158 -> print('after for')
159 (Pdb) return
160 after for
161 ...
162 --Return--
163 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(10)test_function_2()->'BAZ'
164 -> return foo.upper()
165 (Pdb) retval
166 'BAZ'
167 (Pdb) continue
168 BAZ
169 """
170
171
172def test_pdb_breakpoint_commands():
173 """Test basic commands related to breakpoints.
174
175 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000176 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl0d089622010-07-30 16:00:46 +0000177 ... print(1)
178 ... print(2)
179 ... print(3)
180 ... print(4)
181
182 First, need to clear bdb state that might be left over from previous tests.
183 Otherwise, the new breakpoints might get assigned different numbers.
184
185 >>> from bdb import Breakpoint
186 >>> Breakpoint.next = 1
187 >>> Breakpoint.bplist = {}
188 >>> Breakpoint.bpbynumber = [None]
189
190 Now test the breakpoint commands. NORMALIZE_WHITESPACE is needed because
191 the breakpoint list outputs a tab for the "stop only" and "ignore next"
192 lines, which we don't want to put in here.
193
194 >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
195 ... 'break 3',
196 ... 'disable 1',
197 ... 'ignore 1 10',
198 ... 'condition 1 1 < 2',
199 ... 'break 4',
Senthil Kumaran6f107042010-11-29 11:54:17 +0000200 ... 'break 4',
201 ... 'break',
202 ... 'clear 3',
Georg Brandl0d089622010-07-30 16:00:46 +0000203 ... 'break',
204 ... 'condition 1',
205 ... 'enable 1',
206 ... 'clear 1',
207 ... 'commands 2',
R David Murray78d692f2013-10-10 17:23:26 -0400208 ... 'p "42"',
209 ... 'print("42", 7*6)', # Issue 18764 (not about breakpoints)
Georg Brandl0d089622010-07-30 16:00:46 +0000210 ... 'end',
211 ... 'continue', # will stop at breakpoint 2 (line 4)
212 ... 'clear', # clear all!
213 ... 'y',
214 ... 'tbreak 5',
215 ... 'continue', # will stop at temporary breakpoint
216 ... 'break', # make sure breakpoint is gone
217 ... 'continue',
218 ... ]):
219 ... test_function()
220 > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(3)test_function()
221 -> print(1)
222 (Pdb) break 3
223 Breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
224 (Pdb) disable 1
225 Disabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
226 (Pdb) ignore 1 10
227 Will ignore next 10 crossings of breakpoint 1.
228 (Pdb) condition 1 1 < 2
229 New condition set for breakpoint 1.
230 (Pdb) break 4
231 Breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
Senthil Kumaran6f107042010-11-29 11:54:17 +0000232 (Pdb) break 4
233 Breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
234 (Pdb) break
235 Num Type Disp Enb Where
236 1 breakpoint keep no at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
237 stop only if 1 < 2
238 ignore next 10 hits
239 2 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
240 3 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
241 (Pdb) clear 3
242 Deleted breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
Georg Brandl0d089622010-07-30 16:00:46 +0000243 (Pdb) break
244 Num Type Disp Enb Where
245 1 breakpoint keep no at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
246 stop only if 1 < 2
247 ignore next 10 hits
248 2 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
249 (Pdb) condition 1
250 Breakpoint 1 is now unconditional.
251 (Pdb) enable 1
252 Enabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
253 (Pdb) clear 1
254 Deleted breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
255 (Pdb) commands 2
R David Murray78d692f2013-10-10 17:23:26 -0400256 (com) p "42"
257 (com) print("42", 7*6)
Georg Brandl0d089622010-07-30 16:00:46 +0000258 (com) end
259 (Pdb) continue
260 1
R David Murray78d692f2013-10-10 17:23:26 -0400261 '42'
262 42 42
Georg Brandl0d089622010-07-30 16:00:46 +0000263 > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(4)test_function()
264 -> print(2)
265 (Pdb) clear
266 Clear all breaks? y
267 Deleted breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
268 (Pdb) tbreak 5
Senthil Kumaran6f107042010-11-29 11:54:17 +0000269 Breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
Georg Brandl0d089622010-07-30 16:00:46 +0000270 (Pdb) continue
271 2
Senthil Kumaran6f107042010-11-29 11:54:17 +0000272 Deleted breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
Georg Brandl0d089622010-07-30 16:00:46 +0000273 > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(5)test_function()
274 -> print(3)
275 (Pdb) break
276 (Pdb) continue
277 3
278 4
279 """
280
281
Georg Brandle59ca2a2010-07-30 17:04:28 +0000282def do_nothing():
283 pass
284
285def do_something():
286 print(42)
287
288def test_list_commands():
289 """Test the list and source commands of pdb.
290
291 >>> def test_function_2(foo):
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000292 ... import test.test_pdb
293 ... test.test_pdb.do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000294 ... 'some...'
295 ... 'more...'
296 ... 'code...'
297 ... 'to...'
298 ... 'make...'
299 ... 'a...'
300 ... 'long...'
301 ... 'listing...'
302 ... 'useful...'
303 ... '...'
304 ... '...'
305 ... return foo
306
307 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000308 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000309 ... ret = test_function_2('baz')
310
311 >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
312 ... 'list', # list first function
313 ... 'step', # step into second function
314 ... 'list', # list second function
315 ... 'list', # continue listing to EOF
316 ... 'list 1,3', # list specific lines
317 ... 'list x', # invalid argument
318 ... 'next', # step to import
319 ... 'next', # step over import
320 ... 'step', # step into do_nothing
321 ... 'longlist', # list all lines
322 ... 'source do_something', # list all lines of function
Georg Brandlcdf66a92010-07-30 18:15:16 +0000323 ... 'source fooxxx', # something that doesn't exit
Georg Brandle59ca2a2010-07-30 17:04:28 +0000324 ... 'continue',
325 ... ]):
326 ... test_function()
327 > <doctest test.test_pdb.test_list_commands[1]>(3)test_function()
328 -> ret = test_function_2('baz')
329 (Pdb) list
330 1 def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000331 2 import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000332 3 -> ret = test_function_2('baz')
333 [EOF]
334 (Pdb) step
335 --Call--
336 > <doctest test.test_pdb.test_list_commands[0]>(1)test_function_2()
337 -> def test_function_2(foo):
338 (Pdb) list
339 1 -> def test_function_2(foo):
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000340 2 import test.test_pdb
341 3 test.test_pdb.do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000342 4 'some...'
343 5 'more...'
344 6 'code...'
345 7 'to...'
346 8 'make...'
347 9 'a...'
348 10 'long...'
349 11 'listing...'
350 (Pdb) list
351 12 'useful...'
352 13 '...'
353 14 '...'
354 15 return foo
355 [EOF]
356 (Pdb) list 1,3
357 1 -> def test_function_2(foo):
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000358 2 import test.test_pdb
359 3 test.test_pdb.do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000360 (Pdb) list x
361 *** ...
362 (Pdb) next
363 > <doctest test.test_pdb.test_list_commands[0]>(2)test_function_2()
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000364 -> import test.test_pdb
Georg Brandle59ca2a2010-07-30 17:04:28 +0000365 (Pdb) next
366 > <doctest test.test_pdb.test_list_commands[0]>(3)test_function_2()
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000367 -> test.test_pdb.do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000368 (Pdb) step
369 --Call--
Georg Brandle1e8df12010-07-31 08:14:16 +0000370 > ...test_pdb.py(...)do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000371 -> def do_nothing():
372 (Pdb) longlist
373 ... -> def do_nothing():
374 ... pass
375 (Pdb) source do_something
376 ... def do_something():
377 ... print(42)
Georg Brandlcdf66a92010-07-30 18:15:16 +0000378 (Pdb) source fooxxx
379 *** ...
Georg Brandle59ca2a2010-07-30 17:04:28 +0000380 (Pdb) continue
381 """
382
383
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000384def test_post_mortem():
385 """Test post mortem traceback debugging.
386
387 >>> def test_function_2():
388 ... try:
389 ... 1/0
390 ... finally:
391 ... print('Exception!')
392
393 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000394 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000395 ... test_function_2()
396 ... print('Not reached.')
397
398 >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
399 ... 'next', # step over exception-raising call
400 ... 'bt', # get a backtrace
401 ... 'list', # list code of test_function()
402 ... 'down', # step into test_function_2()
403 ... 'list', # list code of test_function_2()
404 ... 'continue',
405 ... ]):
406 ... try:
407 ... test_function()
408 ... except ZeroDivisionError:
409 ... print('Correctly reraised.')
410 > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
411 -> test_function_2()
412 (Pdb) next
413 Exception!
414 ZeroDivisionError: division by zero
415 > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
416 -> test_function_2()
417 (Pdb) bt
418 ...
419 <doctest test.test_pdb.test_post_mortem[2]>(10)<module>()
420 -> test_function()
421 > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
422 -> test_function_2()
423 <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2()
424 -> 1/0
425 (Pdb) list
426 1 def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000427 2 import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000428 3 -> test_function_2()
429 4 print('Not reached.')
430 [EOF]
431 (Pdb) down
432 > <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2()
433 -> 1/0
434 (Pdb) list
435 1 def test_function_2():
436 2 try:
437 3 >> 1/0
438 4 finally:
439 5 -> print('Exception!')
440 [EOF]
441 (Pdb) continue
442 Correctly reraised.
443 """
444
445
Georg Brandl243ad662009-05-05 09:00:19 +0000446def test_pdb_skip_modules():
447 """This illustrates the simple case of module skipping.
448
449 >>> def skip_module():
450 ... import string
Georg Brandl34748cd2010-12-04 17:11:36 +0000451 ... import pdb; pdb.Pdb(skip=['stri*'], nosigint=True).set_trace()
Georg Brandl243ad662009-05-05 09:00:19 +0000452 ... string.capwords('FOO')
Georg Brandl243ad662009-05-05 09:00:19 +0000453
Georg Brandl9fa2e022009-09-16 16:40:45 +0000454 >>> with PdbTestInput([
455 ... 'step',
456 ... 'continue',
457 ... ]):
Georg Brandl243ad662009-05-05 09:00:19 +0000458 ... skip_module()
Georg Brandl243ad662009-05-05 09:00:19 +0000459 > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()
460 -> string.capwords('FOO')
461 (Pdb) step
462 --Return--
463 > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()->None
464 -> string.capwords('FOO')
465 (Pdb) continue
Georg Brandl9fa2e022009-09-16 16:40:45 +0000466 """
Georg Brandl243ad662009-05-05 09:00:19 +0000467
468
469# Module for testing skipping of module that makes a callback
Brett Cannon9529fbf2013-06-15 17:11:25 -0400470mod = types.ModuleType('module_to_skip')
Georg Brandl243ad662009-05-05 09:00:19 +0000471exec('def foo_pony(callback): x = 1; callback(); return None', mod.__dict__)
472
473
474def test_pdb_skip_modules_with_callback():
475 """This illustrates skipping of modules that call into other code.
476
477 >>> def skip_module():
478 ... def callback():
479 ... return None
Georg Brandl34748cd2010-12-04 17:11:36 +0000480 ... import pdb; pdb.Pdb(skip=['module_to_skip*'], nosigint=True).set_trace()
Georg Brandl243ad662009-05-05 09:00:19 +0000481 ... mod.foo_pony(callback)
Georg Brandl243ad662009-05-05 09:00:19 +0000482
Georg Brandl9fa2e022009-09-16 16:40:45 +0000483 >>> with PdbTestInput([
484 ... 'step',
485 ... 'step',
486 ... 'step',
487 ... 'step',
488 ... 'step',
489 ... 'continue',
490 ... ]):
Georg Brandl243ad662009-05-05 09:00:19 +0000491 ... skip_module()
Georg Brandl9fa2e022009-09-16 16:40:45 +0000492 ... pass # provides something to "step" to
Georg Brandl243ad662009-05-05 09:00:19 +0000493 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()
494 -> mod.foo_pony(callback)
495 (Pdb) step
496 --Call--
497 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(2)callback()
498 -> def callback():
499 (Pdb) step
500 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()
501 -> return None
502 (Pdb) step
503 --Return--
504 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()->None
505 -> return None
506 (Pdb) step
507 --Return--
508 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()->None
509 -> mod.foo_pony(callback)
510 (Pdb) step
Georg Brandl9fa2e022009-09-16 16:40:45 +0000511 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[1]>(10)<module>()
512 -> pass # provides something to "step" to
Georg Brandl243ad662009-05-05 09:00:19 +0000513 (Pdb) continue
Georg Brandl9fa2e022009-09-16 16:40:45 +0000514 """
Georg Brandl243ad662009-05-05 09:00:19 +0000515
516
Georg Brandl3f940892010-07-30 10:29:19 +0000517def test_pdb_continue_in_bottomframe():
518 """Test that "continue" and "next" work properly in bottom frame (issue #5294).
519
520 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000521 ... import pdb, sys; inst = pdb.Pdb(nosigint=True)
Georg Brandl3f940892010-07-30 10:29:19 +0000522 ... inst.set_trace()
523 ... inst.botframe = sys._getframe() # hackery to get the right botframe
524 ... print(1)
525 ... print(2)
526 ... print(3)
527 ... print(4)
528
Georg Brandl7410dd12010-07-30 12:01:20 +0000529 >>> with PdbTestInput([ # doctest: +ELLIPSIS
Georg Brandl3f940892010-07-30 10:29:19 +0000530 ... 'next',
531 ... 'break 7',
532 ... 'continue',
533 ... 'next',
534 ... 'continue',
535 ... 'continue',
536 ... ]):
537 ... test_function()
538 > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(4)test_function()
539 -> inst.botframe = sys._getframe() # hackery to get the right botframe
540 (Pdb) next
541 > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(5)test_function()
542 -> print(1)
543 (Pdb) break 7
Georg Brandl7410dd12010-07-30 12:01:20 +0000544 Breakpoint ... at <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>:7
Georg Brandl3f940892010-07-30 10:29:19 +0000545 (Pdb) continue
546 1
547 2
548 > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(7)test_function()
549 -> print(3)
550 (Pdb) next
551 3
552 > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(8)test_function()
553 -> print(4)
554 (Pdb) continue
555 4
556 """
557
558
Georg Brandl46b9afc2010-07-30 09:14:20 +0000559def pdb_invoke(method, arg):
560 """Run pdb.method(arg)."""
Georg Brandl34748cd2010-12-04 17:11:36 +0000561 import pdb
562 getattr(pdb.Pdb(nosigint=True), method)(arg)
Georg Brandl46b9afc2010-07-30 09:14:20 +0000563
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
Georg Brandle1e8df12010-07-31 08:14:16 +0000584 >>> with PdbTestInput(['step','x', 'continue']): # doctest: +ELLIPSIS
Georg Brandl46b9afc2010-07-30 09:14:20 +0000585 ... pdb_invoke('run', compile('x=1', '<string>', 'exec'))
Georg Brandle1e8df12010-07-31 08:14:16 +0000586 > <string>(1)<module>()...
Georg Brandl46b9afc2010-07-30 09:14:20 +0000587 (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
Guido van Rossum8820c232013-11-21 11:30:06 -0800603def 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).set_trace()
612 ... test_function_2()
613 ... test_function_2()
614 ... test_function_2()
615 ... end = 1
616
Antoine Pitrouc04d4682014-08-11 21:40:38 -0400617 >>> from bdb import Breakpoint
618 >>> Breakpoint.next = 1
Guido van Rossum8820c232013-11-21 11:30:06 -0800619 >>> 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).set_trace()
678 ... it = test_gen()
679 ... try:
680 ... assert next(it) == 0
681 ... next(it)
682 ... except StopIteration as ex:
683 ... assert ex.value == 1
684 ... print("finished")
685
686 >>> with PdbTestInput(['step',
687 ... 'step',
688 ... 'step',
689 ... 'next',
690 ... 'next',
691 ... 'step',
692 ... 'step',
693 ... 'continue']):
694 ... test_function()
695 > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(3)test_function()
696 -> it = test_gen()
697 (Pdb) step
698 > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(4)test_function()
699 -> try:
700 (Pdb) step
701 > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(5)test_function()
702 -> assert next(it) == 0
703 (Pdb) step
704 --Call--
705 > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(1)test_gen()
706 -> def test_gen():
707 (Pdb) next
708 > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(2)test_gen()
709 -> yield 0
710 (Pdb) next
711 > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen()
712 -> return 1
713 (Pdb) step
714 --Return--
715 > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen()->1
716 -> return 1
717 (Pdb) step
718 StopIteration: 1
719 > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(6)test_function()
720 -> next(it)
721 (Pdb) continue
722 finished
723 """
724
725def test_pdb_return_command_for_generator():
726 """Testing no unwindng stack on yield for generators
727 for "return" command
728
729 >>> def test_gen():
730 ... yield 0
731 ... return 1
732 ... yield 2
733
734 >>> def test_function():
735 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
736 ... it = test_gen()
737 ... try:
738 ... assert next(it) == 0
739 ... next(it)
740 ... except StopIteration as ex:
741 ... assert ex.value == 1
742 ... print("finished")
743
744 >>> with PdbTestInput(['step',
745 ... 'step',
746 ... 'step',
747 ... 'return',
748 ... 'step',
749 ... 'step',
750 ... 'continue']):
751 ... test_function()
752 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(3)test_function()
753 -> it = test_gen()
754 (Pdb) step
755 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(4)test_function()
756 -> try:
757 (Pdb) step
758 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(5)test_function()
759 -> assert next(it) == 0
760 (Pdb) step
761 --Call--
762 > <doctest test.test_pdb.test_pdb_return_command_for_generator[0]>(1)test_gen()
763 -> def test_gen():
764 (Pdb) return
765 StopIteration: 1
766 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(6)test_function()
767 -> next(it)
768 (Pdb) step
769 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(7)test_function()
770 -> except StopIteration as ex:
771 (Pdb) step
772 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(8)test_function()
773 -> assert ex.value == 1
774 (Pdb) continue
775 finished
776 """
777
778def test_pdb_until_command_for_generator():
779 """Testing no unwindng stack on yield for generators
780 for "until" command if target breakpoing is not reached
781
782 >>> def test_gen():
783 ... yield 0
784 ... yield 1
785 ... yield 2
786
787 >>> def test_function():
788 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
789 ... for i in test_gen():
790 ... print(i)
791 ... print("finished")
792
793 >>> with PdbTestInput(['step',
794 ... 'until 4',
795 ... 'step',
796 ... 'step',
797 ... 'continue']):
798 ... test_function()
799 > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(3)test_function()
800 -> for i in test_gen():
801 (Pdb) step
802 --Call--
803 > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(1)test_gen()
804 -> def test_gen():
805 (Pdb) until 4
806 0
807 1
808 > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen()
809 -> yield 2
810 (Pdb) step
811 --Return--
812 > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen()->2
813 -> yield 2
814 (Pdb) step
815 > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(4)test_function()
816 -> print(i)
817 (Pdb) continue
818 2
819 finished
820 """
821
822def test_pdb_next_command_in_generator_for_loop():
823 """The next command on returning from a generator controled by a for loop.
824
825 >>> def test_gen():
826 ... yield 0
827 ... return 1
828
829 >>> def test_function():
830 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
831 ... for i in test_gen():
832 ... print('value', i)
833 ... x = 123
834
835 >>> with PdbTestInput(['break test_gen',
836 ... 'continue',
837 ... 'next',
838 ... 'next',
839 ... 'next',
840 ... 'continue']):
841 ... test_function()
842 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function()
843 -> for i in test_gen():
844 (Pdb) break test_gen
845 Breakpoint 6 at <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>:1
846 (Pdb) continue
847 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(2)test_gen()
848 -> yield 0
849 (Pdb) next
850 value 0
851 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(3)test_gen()
852 -> return 1
853 (Pdb) next
854 Internal StopIteration: 1
855 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function()
856 -> for i in test_gen():
857 (Pdb) next
858 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(5)test_function()
859 -> x = 123
860 (Pdb) continue
861 """
862
863def test_pdb_next_command_subiterator():
864 """The next command in a generator with a subiterator.
865
866 >>> def test_subgenerator():
867 ... yield 0
868 ... return 1
869
870 >>> def test_gen():
871 ... x = yield from test_subgenerator()
872 ... return x
873
874 >>> def test_function():
875 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
876 ... for i in test_gen():
877 ... print('value', i)
878 ... x = 123
879
880 >>> with PdbTestInput(['step',
881 ... 'step',
882 ... 'next',
883 ... 'next',
884 ... 'next',
885 ... 'continue']):
886 ... test_function()
887 > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function()
888 -> for i in test_gen():
889 (Pdb) step
890 --Call--
891 > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(1)test_gen()
892 -> def test_gen():
893 (Pdb) step
894 > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(2)test_gen()
895 -> x = yield from test_subgenerator()
896 (Pdb) next
897 value 0
898 > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(3)test_gen()
899 -> return x
900 (Pdb) next
901 Internal StopIteration: 1
902 > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function()
903 -> for i in test_gen():
904 (Pdb) next
905 > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(5)test_function()
906 -> x = 123
907 (Pdb) continue
908 """
909
Georg Brandl46b9afc2010-07-30 09:14:20 +0000910
Georg Brandl6cccb862010-07-30 14:16:43 +0000911class PdbTestCase(unittest.TestCase):
912
Senthil Kumaran42d70812012-05-01 10:07:49 +0800913 def run_pdb(self, script, commands):
914 """Run 'script' lines with pdb and the pdb 'commands'."""
915 filename = 'main.py'
916 with open(filename, 'w') as f:
917 f.write(textwrap.dedent(script))
Georg Brandl4bde9ca2012-05-01 09:21:16 +0200918 self.addCleanup(support.unlink, filename)
Victor Stinner047b7ae2014-10-05 17:37:41 +0200919 self.addCleanup(support.rmtree, '__pycache__')
Senthil Kumaran42d70812012-05-01 10:07:49 +0800920 cmd = [sys.executable, '-m', 'pdb', filename]
921 stdout = stderr = None
922 with subprocess.Popen(cmd, stdout=subprocess.PIPE,
923 stdin=subprocess.PIPE,
924 stderr=subprocess.STDOUT,
925 ) as proc:
926 stdout, stderr = proc.communicate(str.encode(commands))
927 stdout = stdout and bytes.decode(stdout)
928 stderr = stderr and bytes.decode(stderr)
929 return stdout, stderr
930
Georg Brandl6e220552013-10-13 20:51:47 +0200931 def _assert_find_function(self, file_content, func_name, expected):
932 file_content = textwrap.dedent(file_content)
933
934 with open(support.TESTFN, 'w') as f:
935 f.write(file_content)
936
937 expected = None if not expected else (
938 expected[0], support.TESTFN, expected[1])
939 self.assertEqual(
940 expected, pdb.find_function(func_name, support.TESTFN))
941
942 def test_find_function_empty_file(self):
943 self._assert_find_function('', 'foo', None)
944
945 def test_find_function_found(self):
946 self._assert_find_function(
947 """\
948 def foo():
949 pass
950
951 def bar():
952 pass
953
954 def quux():
955 pass
956 """,
957 'bar',
958 ('bar', 4),
959 )
960
Georg Brandl6cccb862010-07-30 14:16:43 +0000961 def test_issue7964(self):
962 # open the file as binary so we can force \r\n newline
963 with open(support.TESTFN, 'wb') as f:
964 f.write(b'print("testing my pdb")\r\n')
965 cmd = [sys.executable, '-m', 'pdb', support.TESTFN]
966 proc = subprocess.Popen(cmd,
967 stdout=subprocess.PIPE,
968 stdin=subprocess.PIPE,
969 stderr=subprocess.STDOUT,
970 )
Brian Curtin994ad6c2010-11-05 15:38:47 +0000971 self.addCleanup(proc.stdout.close)
Georg Brandl6cccb862010-07-30 14:16:43 +0000972 stdout, stderr = proc.communicate(b'quit\n')
973 self.assertNotIn(b'SyntaxError', stdout,
974 "Got a syntax error running test script under PDB")
975
Senthil Kumaran42d70812012-05-01 10:07:49 +0800976 def test_issue13183(self):
977 script = """
978 from bar import bar
979
980 def foo():
981 bar()
982
983 def nope():
984 pass
985
986 def foobar():
987 foo()
988 nope()
989
990 foobar()
991 """
992 commands = """
993 from bar import bar
994 break bar
995 continue
996 step
997 step
998 quit
999 """
1000 bar = """
1001 def bar():
Senthil Kumarancb172042012-05-02 08:00:22 +08001002 pass
Senthil Kumaran42d70812012-05-01 10:07:49 +08001003 """
1004 with open('bar.py', 'w') as f:
1005 f.write(textwrap.dedent(bar))
Georg Brandl4bde9ca2012-05-01 09:21:16 +02001006 self.addCleanup(support.unlink, 'bar.py')
Senthil Kumaran42d70812012-05-01 10:07:49 +08001007 stdout, stderr = self.run_pdb(script, commands)
Georg Brandl4bde9ca2012-05-01 09:21:16 +02001008 self.assertTrue(
1009 any('main.py(5)foo()->None' in l for l in stdout.splitlines()),
1010 'Fail to step into the caller after a return')
Senthil Kumaran42d70812012-05-01 10:07:49 +08001011
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001012 def test_issue13210(self):
1013 # invoking "continue" on a non-main thread triggered an exception
1014 # inside signal.signal
1015
Andrew Svetlov96bc0432012-12-05 15:06:23 +02001016 # raises SkipTest if python was built without threads
1017 support.import_module('threading')
1018
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001019 with open(support.TESTFN, 'wb') as f:
1020 f.write(textwrap.dedent("""
1021 import threading
1022 import pdb
1023
1024 def start_pdb():
1025 pdb.Pdb().set_trace()
1026 x = 1
1027 y = 1
1028
1029 t = threading.Thread(target=start_pdb)
1030 t.start()""").encode('ascii'))
1031 cmd = [sys.executable, '-u', support.TESTFN]
1032 proc = subprocess.Popen(cmd,
1033 stdout=subprocess.PIPE,
1034 stdin=subprocess.PIPE,
1035 stderr=subprocess.STDOUT,
1036 )
1037 self.addCleanup(proc.stdout.close)
1038 stdout, stderr = proc.communicate(b'cont\n')
1039 self.assertNotIn('Error', stdout.decode(),
1040 "Got an error running test script under PDB")
1041
Georg Brandl6cccb862010-07-30 14:16:43 +00001042 def tearDown(self):
1043 support.unlink(support.TESTFN)
1044
1045
Andrew Svetlovf0efea02013-03-18 10:09:50 -07001046def load_tests(*args):
Georg Brandl243ad662009-05-05 09:00:19 +00001047 from test import test_pdb
Andrew Svetlovf0efea02013-03-18 10:09:50 -07001048 suites = [unittest.makeSuite(PdbTestCase), doctest.DocTestSuite(test_pdb)]
1049 return unittest.TestSuite(suites)
Georg Brandl243ad662009-05-05 09:00:19 +00001050
1051
1052if __name__ == '__main__':
Andrew Svetlovf0efea02013-03-18 10:09:50 -07001053 unittest.main()