]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_sys_setprofile.py
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Lib / test / test_sys_setprofile.py
CommitLineData
4710c53d 1import gc\r
2import pprint\r
3import sys\r
4import unittest\r
5\r
6from test import test_support\r
7\r
8class TestGetProfile(unittest.TestCase):\r
9 def setUp(self):\r
10 sys.setprofile(None)\r
11\r
12 def tearDown(self):\r
13 sys.setprofile(None)\r
14\r
15 def test_empty(self):\r
16 self.assertIsNone(sys.getprofile())\r
17\r
18 def test_setget(self):\r
19 def fn(*args):\r
20 pass\r
21\r
22 sys.setprofile(fn)\r
23 self.assertIs(sys.getprofile(), fn)\r
24\r
25class HookWatcher:\r
26 def __init__(self):\r
27 self.frames = []\r
28 self.events = []\r
29\r
30 def callback(self, frame, event, arg):\r
31 if (event == "call"\r
32 or event == "return"\r
33 or event == "exception"):\r
34 self.add_event(event, frame)\r
35\r
36 def add_event(self, event, frame=None):\r
37 """Add an event to the log."""\r
38 if frame is None:\r
39 frame = sys._getframe(1)\r
40\r
41 try:\r
42 frameno = self.frames.index(frame)\r
43 except ValueError:\r
44 frameno = len(self.frames)\r
45 self.frames.append(frame)\r
46\r
47 self.events.append((frameno, event, ident(frame)))\r
48\r
49 def get_events(self):\r
50 """Remove calls to add_event()."""\r
51 disallowed = [ident(self.add_event.im_func), ident(ident)]\r
52 self.frames = None\r
53\r
54 return [item for item in self.events if item[2] not in disallowed]\r
55\r
56\r
57class ProfileSimulator(HookWatcher):\r
58 def __init__(self, testcase):\r
59 self.testcase = testcase\r
60 self.stack = []\r
61 HookWatcher.__init__(self)\r
62\r
63 def callback(self, frame, event, arg):\r
64 # Callback registered with sys.setprofile()/sys.settrace()\r
65 self.dispatch[event](self, frame)\r
66\r
67 def trace_call(self, frame):\r
68 self.add_event('call', frame)\r
69 self.stack.append(frame)\r
70\r
71 def trace_return(self, frame):\r
72 self.add_event('return', frame)\r
73 self.stack.pop()\r
74\r
75 def trace_exception(self, frame):\r
76 self.testcase.fail(\r
77 "the profiler should never receive exception events")\r
78\r
79 def trace_pass(self, frame):\r
80 pass\r
81\r
82 dispatch = {\r
83 'call': trace_call,\r
84 'exception': trace_exception,\r
85 'return': trace_return,\r
86 'c_call': trace_pass,\r
87 'c_return': trace_pass,\r
88 'c_exception': trace_pass,\r
89 }\r
90\r
91\r
92class TestCaseBase(unittest.TestCase):\r
93 def check_events(self, callable, expected):\r
94 events = capture_events(callable, self.new_watcher())\r
95 if events != expected:\r
96 self.fail("Expected events:\n%s\nReceived events:\n%s"\r
97 % (pprint.pformat(expected), pprint.pformat(events)))\r
98\r
99\r
100class ProfileHookTestCase(TestCaseBase):\r
101 def new_watcher(self):\r
102 return HookWatcher()\r
103\r
104 def test_simple(self):\r
105 def f(p):\r
106 pass\r
107 f_ident = ident(f)\r
108 self.check_events(f, [(1, 'call', f_ident),\r
109 (1, 'return', f_ident),\r
110 ])\r
111\r
112 def test_exception(self):\r
113 def f(p):\r
114 1./0\r
115 f_ident = ident(f)\r
116 self.check_events(f, [(1, 'call', f_ident),\r
117 (1, 'return', f_ident),\r
118 ])\r
119\r
120 def test_caught_exception(self):\r
121 def f(p):\r
122 try: 1./0\r
123 except: pass\r
124 f_ident = ident(f)\r
125 self.check_events(f, [(1, 'call', f_ident),\r
126 (1, 'return', f_ident),\r
127 ])\r
128\r
129 def test_caught_nested_exception(self):\r
130 def f(p):\r
131 try: 1./0\r
132 except: pass\r
133 f_ident = ident(f)\r
134 self.check_events(f, [(1, 'call', f_ident),\r
135 (1, 'return', f_ident),\r
136 ])\r
137\r
138 def test_nested_exception(self):\r
139 def f(p):\r
140 1./0\r
141 f_ident = ident(f)\r
142 self.check_events(f, [(1, 'call', f_ident),\r
143 # This isn't what I expected:\r
144 # (0, 'exception', protect_ident),\r
145 # I expected this again:\r
146 (1, 'return', f_ident),\r
147 ])\r
148\r
149 def test_exception_in_except_clause(self):\r
150 def f(p):\r
151 1./0\r
152 def g(p):\r
153 try:\r
154 f(p)\r
155 except:\r
156 try: f(p)\r
157 except: pass\r
158 f_ident = ident(f)\r
159 g_ident = ident(g)\r
160 self.check_events(g, [(1, 'call', g_ident),\r
161 (2, 'call', f_ident),\r
162 (2, 'return', f_ident),\r
163 (3, 'call', f_ident),\r
164 (3, 'return', f_ident),\r
165 (1, 'return', g_ident),\r
166 ])\r
167\r
168 def test_exception_propogation(self):\r
169 def f(p):\r
170 1./0\r
171 def g(p):\r
172 try: f(p)\r
173 finally: p.add_event("falling through")\r
174 f_ident = ident(f)\r
175 g_ident = ident(g)\r
176 self.check_events(g, [(1, 'call', g_ident),\r
177 (2, 'call', f_ident),\r
178 (2, 'return', f_ident),\r
179 (1, 'falling through', g_ident),\r
180 (1, 'return', g_ident),\r
181 ])\r
182\r
183 def test_raise_twice(self):\r
184 def f(p):\r
185 try: 1./0\r
186 except: 1./0\r
187 f_ident = ident(f)\r
188 self.check_events(f, [(1, 'call', f_ident),\r
189 (1, 'return', f_ident),\r
190 ])\r
191\r
192 def test_raise_reraise(self):\r
193 def f(p):\r
194 try: 1./0\r
195 except: raise\r
196 f_ident = ident(f)\r
197 self.check_events(f, [(1, 'call', f_ident),\r
198 (1, 'return', f_ident),\r
199 ])\r
200\r
201 def test_raise(self):\r
202 def f(p):\r
203 raise Exception()\r
204 f_ident = ident(f)\r
205 self.check_events(f, [(1, 'call', f_ident),\r
206 (1, 'return', f_ident),\r
207 ])\r
208\r
209 def test_distant_exception(self):\r
210 def f():\r
211 1./0\r
212 def g():\r
213 f()\r
214 def h():\r
215 g()\r
216 def i():\r
217 h()\r
218 def j(p):\r
219 i()\r
220 f_ident = ident(f)\r
221 g_ident = ident(g)\r
222 h_ident = ident(h)\r
223 i_ident = ident(i)\r
224 j_ident = ident(j)\r
225 self.check_events(j, [(1, 'call', j_ident),\r
226 (2, 'call', i_ident),\r
227 (3, 'call', h_ident),\r
228 (4, 'call', g_ident),\r
229 (5, 'call', f_ident),\r
230 (5, 'return', f_ident),\r
231 (4, 'return', g_ident),\r
232 (3, 'return', h_ident),\r
233 (2, 'return', i_ident),\r
234 (1, 'return', j_ident),\r
235 ])\r
236\r
237 def test_generator(self):\r
238 def f():\r
239 for i in range(2):\r
240 yield i\r
241 def g(p):\r
242 for i in f():\r
243 pass\r
244 f_ident = ident(f)\r
245 g_ident = ident(g)\r
246 self.check_events(g, [(1, 'call', g_ident),\r
247 # call the iterator twice to generate values\r
248 (2, 'call', f_ident),\r
249 (2, 'return', f_ident),\r
250 (2, 'call', f_ident),\r
251 (2, 'return', f_ident),\r
252 # once more; returns end-of-iteration with\r
253 # actually raising an exception\r
254 (2, 'call', f_ident),\r
255 (2, 'return', f_ident),\r
256 (1, 'return', g_ident),\r
257 ])\r
258\r
259 def test_stop_iteration(self):\r
260 def f():\r
261 for i in range(2):\r
262 yield i\r
263 raise StopIteration\r
264 def g(p):\r
265 for i in f():\r
266 pass\r
267 f_ident = ident(f)\r
268 g_ident = ident(g)\r
269 self.check_events(g, [(1, 'call', g_ident),\r
270 # call the iterator twice to generate values\r
271 (2, 'call', f_ident),\r
272 (2, 'return', f_ident),\r
273 (2, 'call', f_ident),\r
274 (2, 'return', f_ident),\r
275 # once more to hit the raise:\r
276 (2, 'call', f_ident),\r
277 (2, 'return', f_ident),\r
278 (1, 'return', g_ident),\r
279 ])\r
280\r
281\r
282class ProfileSimulatorTestCase(TestCaseBase):\r
283 def new_watcher(self):\r
284 return ProfileSimulator(self)\r
285\r
286 def test_simple(self):\r
287 def f(p):\r
288 pass\r
289 f_ident = ident(f)\r
290 self.check_events(f, [(1, 'call', f_ident),\r
291 (1, 'return', f_ident),\r
292 ])\r
293\r
294 def test_basic_exception(self):\r
295 def f(p):\r
296 1./0\r
297 f_ident = ident(f)\r
298 self.check_events(f, [(1, 'call', f_ident),\r
299 (1, 'return', f_ident),\r
300 ])\r
301\r
302 def test_caught_exception(self):\r
303 def f(p):\r
304 try: 1./0\r
305 except: pass\r
306 f_ident = ident(f)\r
307 self.check_events(f, [(1, 'call', f_ident),\r
308 (1, 'return', f_ident),\r
309 ])\r
310\r
311 def test_distant_exception(self):\r
312 def f():\r
313 1./0\r
314 def g():\r
315 f()\r
316 def h():\r
317 g()\r
318 def i():\r
319 h()\r
320 def j(p):\r
321 i()\r
322 f_ident = ident(f)\r
323 g_ident = ident(g)\r
324 h_ident = ident(h)\r
325 i_ident = ident(i)\r
326 j_ident = ident(j)\r
327 self.check_events(j, [(1, 'call', j_ident),\r
328 (2, 'call', i_ident),\r
329 (3, 'call', h_ident),\r
330 (4, 'call', g_ident),\r
331 (5, 'call', f_ident),\r
332 (5, 'return', f_ident),\r
333 (4, 'return', g_ident),\r
334 (3, 'return', h_ident),\r
335 (2, 'return', i_ident),\r
336 (1, 'return', j_ident),\r
337 ])\r
338\r
339\r
340def ident(function):\r
341 if hasattr(function, "f_code"):\r
342 code = function.f_code\r
343 else:\r
344 code = function.func_code\r
345 return code.co_firstlineno, code.co_name\r
346\r
347\r
348def protect(f, p):\r
349 try: f(p)\r
350 except: pass\r
351\r
352protect_ident = ident(protect)\r
353\r
354\r
355def capture_events(callable, p=None):\r
356 if p is None:\r
357 p = HookWatcher()\r
358 # Disable the garbage collector. This prevents __del__s from showing up in\r
359 # traces.\r
360 old_gc = gc.isenabled()\r
361 gc.disable()\r
362 try:\r
363 sys.setprofile(p.callback)\r
364 protect(callable, p)\r
365 sys.setprofile(None)\r
366 finally:\r
367 if old_gc:\r
368 gc.enable()\r
369 return p.get_events()[1:-1]\r
370\r
371\r
372def show_events(callable):\r
373 import pprint\r
374 pprint.pprint(capture_events(callable))\r
375\r
376\r
377def test_main():\r
378 test_support.run_unittest(\r
379 TestGetProfile,\r
380 ProfileHookTestCase,\r
381 ProfileSimulatorTestCase\r
382 )\r
383\r
384\r
385if __name__ == "__main__":\r
386 test_main()\r