1 # Testing the line trace facility.
3 from test
import test_support
8 # A very basic example. If this fails, we're in deep trouble.
12 basic
.events
= [(0, 'call'),
16 # Armin Rigo's failing example:
24 arigo_example
.events
= [(0, 'call'),
31 # check that lines consisting of just one instruction get traced:
37 one_instr_line
.events
= [(0, 'call'),
43 def no_pop_tops(): # 0
45 for a
in range(2): # 2
51 no_pop_tops
.events
= [(0, 'call'),
67 no_pop_blocks
.events
= [(0, 'call'),
72 def called(): # line -3
78 call
.events
= [(0, 'call'),
91 except Exception, exc
:
94 test_raise
.events
= [(0, 'call'),
105 def _settrace_and_return(tracefunc
):
106 sys
.settrace(tracefunc
)
107 sys
._getframe
().f_back
.f_trace
= tracefunc
108 def settrace_and_return(tracefunc
):
109 _settrace_and_return(tracefunc
)
111 settrace_and_return
.events
= [(1, 'return')]
113 def _settrace_and_raise(tracefunc
):
114 sys
.settrace(tracefunc
)
115 sys
._getframe
().f_back
.f_trace
= tracefunc
117 def settrace_and_raise(tracefunc
):
119 _settrace_and_raise(tracefunc
)
120 except RuntimeError, exc
:
123 settrace_and_raise
.events
= [(2, 'exception'),
131 def trace(self
, frame
, event
, arg
):
132 self
.events
.append((frame
.f_lineno
, event
))
135 class TraceTestCase(unittest
.TestCase
):
136 def compare_events(self
, line_offset
, events
, expected_events
):
137 events
= [(l
- line_offset
, e
) for (l
, e
) in events
]
138 if events
!= expected_events
:
140 "events did not match expectation:\n" +
141 "\n".join(difflib
.ndiff(map(str, expected_events
),
145 def run_test(self
, func
):
147 sys
.settrace(tracer
.trace
)
150 self
.compare_events(func
.func_code
.co_firstlineno
,
151 tracer
.events
, func
.events
)
153 def run_test2(self
, func
):
157 self
.compare_events(func
.func_code
.co_firstlineno
,
158 tracer
.events
, func
.events
)
160 def test_1_basic(self
):
162 def test_2_arigo(self
):
163 self
.run_test(arigo_example
)
164 def test_3_one_instr(self
):
165 self
.run_test(one_instr_line
)
166 def test_4_no_pop_blocks(self
):
167 self
.run_test(no_pop_blocks
)
168 def test_5_no_pop_tops(self
):
169 self
.run_test(no_pop_tops
)
170 def test_6_call(self
):
172 def test_7_raise(self
):
173 self
.run_test(test_raise
)
175 def test_8_settrace_and_return(self
):
176 self
.run_test2(settrace_and_return
)
177 def test_9_settrace_and_raise(self
):
178 self
.run_test2(settrace_and_raise
)
180 class RaisingTraceFuncTestCase(unittest
.TestCase
):
182 def tr(frame
, event
, arg
):
183 raise ValueError # just something that isn't RuntimeError
187 for i
in xrange(sys
.getrecursionlimit() + 1):
194 self
.fail("exception not thrown!")
196 self
.fail("recursion counter not reset")
200 test_support
.run_unittest(TraceTestCase
)
201 test_support
.run_unittest(RaisingTraceFuncTestCase
)
203 if __name__
== "__main__":