Skip to content

Commit 498e352

Browse files
malinahdpgeorge
authored andcommitted
tests: Add tests for sys.settrace feature.
1 parent 310b3d1 commit 498e352

9 files changed

Lines changed: 584 additions & 0 deletions

tests/cmdline/cmd_showbc.py.exp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ arg names:
417417
(N_STATE 1)
418418
(N_EXC_STACK 0)
419419
bc=-1 line=1
420+
########
420421
bc=13 line=149
421422
00 LOAD_NAME __name__ (cache=0)
422423
04 STORE_NAME __module__
@@ -450,6 +451,7 @@ arg names: * * *
450451
(N_EXC_STACK 0)
451452
bc=-\\d\+ line=1
452453
bc=0 line=59
454+
########
453455
00 LOAD_NULL
454456
01 LOAD_FAST 2
455457
02 LOAD_NULL
@@ -473,6 +475,7 @@ arg names: * * *
473475
(N_EXC_STACK 0)
474476
bc=-\\d\+ line=1
475477
bc=0 line=60
478+
########
476479
00 BUILD_LIST 0
477480
02 LOAD_FAST 2
478481
03 GET_ITER_STACK
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import sys
2+
3+
try:
4+
sys.settrace
5+
except AttributeError:
6+
print("SKIP")
7+
raise SystemExit
8+
9+
def print_stacktrace(frame, level=0):
10+
# Ignore CPython specific helpers.
11+
if frame.f_globals['__name__'].find('importlib') != -1:
12+
print_stacktrace(frame.f_back, level)
13+
return
14+
15+
print("%2d: %s@%s:%s => %s:%d" % (
16+
level, " ",
17+
frame.f_globals['__name__'],
18+
frame.f_code.co_name,
19+
# reduce full path to some pseudo-relative
20+
'misc' + ''.join(frame.f_code.co_filename.split('tests/misc')[-1:]),
21+
frame.f_lineno,
22+
))
23+
24+
if frame.f_back:
25+
print_stacktrace(frame.f_back, level + 1)
26+
27+
class _Prof:
28+
trace_count = 0;
29+
30+
def trace_tick(self, frame, event, arg):
31+
self.trace_count += 1
32+
print_stacktrace(frame)
33+
34+
__prof__ = _Prof()
35+
36+
alice_handler_set = False
37+
def trace_tick_handler_alice(frame, event, arg):
38+
print("### trace_handler::Alice event:", event)
39+
__prof__.trace_tick(frame, event, arg)
40+
return trace_tick_handler_alice
41+
42+
bob_handler_set = False
43+
def trace_tick_handler_bob(frame, event, arg):
44+
print("### trace_handler::Bob event:", event)
45+
__prof__.trace_tick(frame, event, arg)
46+
return trace_tick_handler_bob
47+
48+
def trace_tick_handler(frame, event, arg):
49+
# Ignore CPython specific helpers.
50+
if frame.f_globals['__name__'].find('importlib') != -1:
51+
return
52+
53+
print("### trace_handler::main event:", event)
54+
__prof__.trace_tick(frame, event, arg)
55+
56+
if frame.f_code.co_name != 'factorial':
57+
return trace_tick_handler
58+
59+
global alice_handler_set
60+
if event == 'call' and not alice_handler_set:
61+
alice_handler_set = True
62+
return trace_tick_handler_alice
63+
64+
global bob_handler_set
65+
if event == 'call' and not bob_handler_set:
66+
bob_handler_set = True
67+
return trace_tick_handler_bob
68+
69+
return trace_tick_handler
70+
71+
def factorial(n):
72+
if n == 0:
73+
return 1
74+
else:
75+
return n * factorial(n - 1)
76+
77+
def do_tests():
78+
# These commands are here to demonstrate some execution being traced.
79+
print("Who loves the sun?")
80+
print("Not every-", factorial(3))
81+
82+
from sys_settrace_subdir import trace_generic
83+
trace_generic.run_tests()
84+
return
85+
86+
sys.settrace(trace_tick_handler)
87+
do_tests()
88+
sys.settrace(None)
89+
90+
print("\n------------------ script exited ------------------")
91+
print("Total traces executed: ", __prof__.trace_count)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# test sys.settrace with generators
2+
3+
import sys
4+
5+
try:
6+
sys.settrace
7+
except AttributeError:
8+
print("SKIP")
9+
raise SystemExit
10+
11+
def print_stacktrace(frame, level=0):
12+
print("%2d: %s@%s:%s => %s:%d" % (
13+
level, " ",
14+
frame.f_globals['__name__'],
15+
frame.f_code.co_name,
16+
# reduce full path to some pseudo-relative
17+
'misc' + ''.join(frame.f_code.co_filename.split('tests/misc')[-1:]),
18+
frame.f_lineno,
19+
))
20+
21+
if frame.f_back:
22+
print_stacktrace(frame.f_back, level + 1)
23+
24+
trace_count = 0
25+
26+
def trace_tick_handler(frame, event, arg):
27+
global trace_count
28+
print("### trace_handler::main event:", event)
29+
trace_count += 1
30+
print_stacktrace(frame)
31+
return trace_tick_handler
32+
33+
def test_generator():
34+
def make_gen():
35+
yield 1<<0
36+
yield 1<<1
37+
yield 1<<2
38+
return 1<<3
39+
40+
gen = make_gen()
41+
r = 0
42+
try:
43+
44+
r += gen.send(None)
45+
46+
while True:
47+
48+
r += gen.send(None)
49+
50+
except StopIteration as e:
51+
print("test_generator", r, e)
52+
53+
gen = make_gen()
54+
r = 0
55+
for i in gen:
56+
r += i
57+
print(r)
58+
59+
sys.settrace(trace_tick_handler)
60+
test_generator()
61+
sys.settrace(None)
62+
print("Total traces executed: ", trace_count)
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
### trace_handler::main event: call
2+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:33
3+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
4+
### trace_handler::main event: line
5+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:34
6+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
7+
### trace_handler::main event: line
8+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:40
9+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
10+
### trace_handler::main event: line
11+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:41
12+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
13+
### trace_handler::main event: line
14+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:42
15+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
16+
### trace_handler::main event: line
17+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:44
18+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
19+
### trace_handler::main event: call
20+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:34
21+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:44
22+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
23+
### trace_handler::main event: line
24+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
25+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:44
26+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
27+
### trace_handler::main event: return
28+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
29+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:44
30+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
31+
### trace_handler::main event: line
32+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
33+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
34+
### trace_handler::main event: call
35+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
36+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
37+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
38+
### trace_handler::main event: line
39+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
40+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
41+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
42+
### trace_handler::main event: line
43+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
44+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
45+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
46+
### trace_handler::main event: return
47+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
48+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
49+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
50+
### trace_handler::main event: call
51+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
52+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
53+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
54+
### trace_handler::main event: line
55+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
56+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
57+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
58+
### trace_handler::main event: line
59+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
60+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
61+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
62+
### trace_handler::main event: return
63+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
64+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
65+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
66+
### trace_handler::main event: call
67+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
68+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
69+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
70+
### trace_handler::main event: line
71+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
72+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
73+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
74+
### trace_handler::main event: line
75+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:38
76+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
77+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
78+
### trace_handler::main event: return
79+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:38
80+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
81+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
82+
### trace_handler::main event: exception
83+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
84+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
85+
### trace_handler::main event: line
86+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:50
87+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
88+
### trace_handler::main event: line
89+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:51
90+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
91+
test_generator 7 8
92+
### trace_handler::main event: line
93+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:53
94+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
95+
### trace_handler::main event: line
96+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:54
97+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
98+
### trace_handler::main event: line
99+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
100+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
101+
### trace_handler::main event: call
102+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:34
103+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
104+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
105+
### trace_handler::main event: line
106+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
107+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
108+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
109+
### trace_handler::main event: return
110+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
111+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
112+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
113+
### trace_handler::main event: line
114+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
115+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
116+
### trace_handler::main event: line
117+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:56
118+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
119+
### trace_handler::main event: line
120+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
121+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
122+
### trace_handler::main event: call
123+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
124+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
125+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
126+
### trace_handler::main event: line
127+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
128+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
129+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
130+
### trace_handler::main event: line
131+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
132+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
133+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
134+
### trace_handler::main event: return
135+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
136+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
137+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
138+
### trace_handler::main event: line
139+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
140+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
141+
### trace_handler::main event: line
142+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:56
143+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
144+
### trace_handler::main event: line
145+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
146+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
147+
### trace_handler::main event: call
148+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
149+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
150+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
151+
### trace_handler::main event: line
152+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
153+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
154+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
155+
### trace_handler::main event: line
156+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
157+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
158+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
159+
### trace_handler::main event: return
160+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
161+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
162+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
163+
### trace_handler::main event: line
164+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
165+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
166+
### trace_handler::main event: line
167+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:56
168+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
169+
### trace_handler::main event: line
170+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
171+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
172+
### trace_handler::main event: call
173+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
174+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
175+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
176+
### trace_handler::main event: line
177+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
178+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
179+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
180+
### trace_handler::main event: line
181+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:38
182+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
183+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
184+
### trace_handler::main event: return
185+
0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:38
186+
1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
187+
2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
188+
### trace_handler::main event: line
189+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:57
190+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
191+
7
192+
### trace_handler::main event: return
193+
0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:57
194+
1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
195+
Total traces executed: 54

0 commit comments

Comments
 (0)