summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2001-09-26 21:00:33 (GMT)
committerFred Drake <fdrake@acm.org>2001-09-26 21:00:33 (GMT)
commit39cd603fc884b60b8c7a6dad0346f819ea181f4a (patch)
treeaec7704dc64116358cc656339ae4087dc630caba
parent38a50f9065ab27d5b5fcff5d01192ed1dd767e23 (diff)
downloadcpython-39cd603fc884b60b8c7a6dad0346f819ea181f4a.zip
cpython-39cd603fc884b60b8c7a6dad0346f819ea181f4a.tar.gz
cpython-39cd603fc884b60b8c7a6dad0346f819ea181f4a.tar.bz2
More test cases, including something that simulates what the profiler
probably *should* be doing.
-rw-r--r--Lib/test/test_profilehooks.py71
1 files changed, 66 insertions, 5 deletions
diff --git a/Lib/test/test_profilehooks.py b/Lib/test/test_profilehooks.py
index b620a9c..579443e 100644
--- a/Lib/test/test_profilehooks.py
+++ b/Lib/test/test_profilehooks.py
@@ -34,14 +34,48 @@ class HookWatcher:
return [item for item in self.events if item[2] not in disallowed]
-class ProfileHookTestCase(unittest.TestCase):
+class ProfileSimulator(HookWatcher):
+ def __init__(self):
+ self.stack = []
+ HookWatcher.__init__(self)
+
+ def callback(self, frame, event, arg):
+ self.dispatch[event](self, frame)
+
+ def trace_call(self, frame):
+ self.add_event('call', frame)
+ self.stack.append(frame)
+
+ def trace_return(self, frame):
+ self.add_event('return', frame)
+ self.stack.pop()
+
+ def trace_exception(self, frame):
+ if len(self.stack) >= 2 and frame is self.stack[-2]:
+ self.add_event('propogate-from', self.stack[-1])
+ self.stack.pop()
+ else:
+ self.add_event('ignore', frame)
+
+ dispatch = {
+ 'call': trace_call,
+ 'exception': trace_exception,
+ 'return': trace_return,
+ }
+
+class TestCaseBase(unittest.TestCase):
def check_events(self, callable, expected):
- events = capture_events(callable)
+ events = capture_events(callable, self.new_watcher())
if events != expected:
self.fail("Expected events:\n%s\nReceived events:\n%s"
% (pprint.pformat(expected), pprint.pformat(events)))
+
+class ProfileHookTestCase(TestCaseBase):
+ def new_watcher(self):
+ return HookWatcher()
+
def test_simple(self):
def f(p):
pass
@@ -159,6 +193,28 @@ class ProfileHookTestCase(unittest.TestCase):
])
+class ProfileSimulatorTestCase(TestCaseBase):
+ def new_watcher(self):
+ return ProfileSimulator()
+
+ def test_simple(self):
+ def f(p):
+ pass
+ f_ident = ident(f)
+ self.check_events(f, [(1, 'call', f_ident),
+ (1, 'return', f_ident),
+ ])
+
+ def test_basic_exception(self):
+ def f(p):
+ 1/0
+ f_ident = ident(f)
+ self.check_events(f, [(1, 'call', f_ident),
+ (1, 'ignore', f_ident),
+ (1, 'propogate-from', f_ident),
+ ])
+
+
def ident(function):
if hasattr(function, "f_code"):
code = function.f_code
@@ -174,8 +230,9 @@ def protect(f, p):
protect_ident = ident(protect)
-def capture_events(callable):
- p = HookWatcher()
+def capture_events(callable, p=None):
+ if p is None:
+ p = HookWatcher()
sys.setprofile(p.callback)
protect(callable, p)
sys.setprofile(None)
@@ -188,7 +245,11 @@ def show_events(callable):
def test_main():
- test_support.run_unittest(ProfileHookTestCase)
+ loader = unittest.TestLoader()
+ suite = unittest.TestSuite()
+ suite.addTest(loader.loadTestsFromTestCase(ProfileHookTestCase))
+ suite.addTest(loader.loadTestsFromTestCase(ProfileSimulatorTestCase))
+ test_support.run_suite(suite)
if __name__ == "__main__":