blob: e17f933d80e5f0a91af725bef91fd2c8b3f89f92 [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
603
Georg Brandl6cccb862010-07-30 14:16:43 +0000604class PdbTestCase(unittest.TestCase):
605
Senthil Kumaran42d70812012-05-01 10:07:49 +0800606 def run_pdb(self, script, commands):
607 """Run 'script' lines with pdb and the pdb 'commands'."""
608 filename = 'main.py'
609 with open(filename, 'w') as f:
610 f.write(textwrap.dedent(script))
Georg Brandl4bde9ca2012-05-01 09:21:16 +0200611 self.addCleanup(support.unlink, filename)
Senthil Kumaran42d70812012-05-01 10:07:49 +0800612 cmd = [sys.executable, '-m', 'pdb', filename]
613 stdout = stderr = None
614 with subprocess.Popen(cmd, stdout=subprocess.PIPE,
615 stdin=subprocess.PIPE,
616 stderr=subprocess.STDOUT,
617 ) as proc:
618 stdout, stderr = proc.communicate(str.encode(commands))
619 stdout = stdout and bytes.decode(stdout)
620 stderr = stderr and bytes.decode(stderr)
621 return stdout, stderr
622
Georg Brandl6cccb862010-07-30 14:16:43 +0000623 def test_issue7964(self):
624 # open the file as binary so we can force \r\n newline
625 with open(support.TESTFN, 'wb') as f:
626 f.write(b'print("testing my pdb")\r\n')
627 cmd = [sys.executable, '-m', 'pdb', support.TESTFN]
628 proc = subprocess.Popen(cmd,
629 stdout=subprocess.PIPE,
630 stdin=subprocess.PIPE,
631 stderr=subprocess.STDOUT,
632 )
Brian Curtin994ad6c2010-11-05 15:38:47 +0000633 self.addCleanup(proc.stdout.close)
Georg Brandl6cccb862010-07-30 14:16:43 +0000634 stdout, stderr = proc.communicate(b'quit\n')
635 self.assertNotIn(b'SyntaxError', stdout,
636 "Got a syntax error running test script under PDB")
637
Senthil Kumaran42d70812012-05-01 10:07:49 +0800638 def test_issue13183(self):
639 script = """
640 from bar import bar
641
642 def foo():
643 bar()
644
645 def nope():
646 pass
647
648 def foobar():
649 foo()
650 nope()
651
652 foobar()
653 """
654 commands = """
655 from bar import bar
656 break bar
657 continue
658 step
659 step
660 quit
661 """
662 bar = """
663 def bar():
Senthil Kumarancb172042012-05-02 08:00:22 +0800664 pass
Senthil Kumaran42d70812012-05-01 10:07:49 +0800665 """
666 with open('bar.py', 'w') as f:
667 f.write(textwrap.dedent(bar))
Georg Brandl4bde9ca2012-05-01 09:21:16 +0200668 self.addCleanup(support.unlink, 'bar.py')
Senthil Kumaran42d70812012-05-01 10:07:49 +0800669 stdout, stderr = self.run_pdb(script, commands)
Georg Brandl4bde9ca2012-05-01 09:21:16 +0200670 self.assertTrue(
671 any('main.py(5)foo()->None' in l for l in stdout.splitlines()),
672 'Fail to step into the caller after a return')
Senthil Kumaran42d70812012-05-01 10:07:49 +0800673
Andrew Svetlov539ee5d2012-12-04 21:08:28 +0200674 def test_issue13210(self):
675 # invoking "continue" on a non-main thread triggered an exception
676 # inside signal.signal
677
Andrew Svetlov96bc0432012-12-05 15:06:23 +0200678 # raises SkipTest if python was built without threads
679 support.import_module('threading')
680
Andrew Svetlov539ee5d2012-12-04 21:08:28 +0200681 with open(support.TESTFN, 'wb') as f:
682 f.write(textwrap.dedent("""
683 import threading
684 import pdb
685
686 def start_pdb():
687 pdb.Pdb().set_trace()
688 x = 1
689 y = 1
690
691 t = threading.Thread(target=start_pdb)
692 t.start()""").encode('ascii'))
693 cmd = [sys.executable, '-u', support.TESTFN]
694 proc = subprocess.Popen(cmd,
695 stdout=subprocess.PIPE,
696 stdin=subprocess.PIPE,
697 stderr=subprocess.STDOUT,
698 )
699 self.addCleanup(proc.stdout.close)
700 stdout, stderr = proc.communicate(b'cont\n')
701 self.assertNotIn('Error', stdout.decode(),
702 "Got an error running test script under PDB")
703
Georg Brandl6cccb862010-07-30 14:16:43 +0000704 def tearDown(self):
705 support.unlink(support.TESTFN)
706
707
Andrew Svetlovf0efea02013-03-18 10:09:50 -0700708def load_tests(*args):
Georg Brandl243ad662009-05-05 09:00:19 +0000709 from test import test_pdb
Andrew Svetlovf0efea02013-03-18 10:09:50 -0700710 suites = [unittest.makeSuite(PdbTestCase), doctest.DocTestSuite(test_pdb)]
711 return unittest.TestSuite(suites)
Georg Brandl243ad662009-05-05 09:00:19 +0000712
713
714if __name__ == '__main__':
Andrew Svetlovf0efea02013-03-18 10:09:50 -0700715 unittest.main()