| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  | import os | 
					
						
							|  |  |  | import pprint | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2009-02-07 14:53:31 +00:00
										 |  |  | import tempfile | 
					
						
							| 
									
										
										
										
											2008-12-15 21:47:57 +00:00
										 |  |  | import _hotshot | 
					
						
							|  |  |  | import gc | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-23 19:04:11 +00:00
										 |  |  | from test import test_support | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-30 07:22:54 +00:00
										 |  |  | # Silence Py3k warning | 
					
						
							|  |  |  | hotshot = test_support.import_module('hotshot', deprecated=True) | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  | from hotshot.log import ENTER, EXIT, LINE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def shortfilename(fn): | 
					
						
							|  |  |  |     # We use a really shortened filename since an exact match is made, | 
					
						
							|  |  |  |     # and the source may be either a Python source file or a | 
					
						
							|  |  |  |     # pre-compiled bytecode file. | 
					
						
							|  |  |  |     if fn: | 
					
						
							|  |  |  |         return os.path.splitext(os.path.basename(fn))[0] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return fn | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-13 03:00:11 +00:00
										 |  |  | class UnlinkingLogReader(hotshot.log.LogReader): | 
					
						
							|  |  |  |     """Extend the LogReader so the log file is unlinked when we're
 | 
					
						
							|  |  |  |     done with it."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, logfn): | 
					
						
							|  |  |  |         self.__logfn = logfn | 
					
						
							|  |  |  |         hotshot.log.LogReader.__init__(self, logfn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def next(self, index=None): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             return hotshot.log.LogReader.next(self) | 
					
						
							| 
									
										
										
										
											2002-08-05 22:16:40 +00:00
										 |  |  |         except StopIteration: | 
					
						
							| 
									
										
										
										
											2002-07-18 14:54:28 +00:00
										 |  |  |             self.close() | 
					
						
							| 
									
										
										
										
											2001-10-13 03:00:11 +00:00
										 |  |  |             os.unlink(self.__logfn) | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  | class HotShotTestCase(unittest.TestCase): | 
					
						
							|  |  |  |     def new_profiler(self, lineevents=0, linetimings=1): | 
					
						
							|  |  |  |         self.logfn = test_support.TESTFN | 
					
						
							|  |  |  |         return hotshot.Profile(self.logfn, lineevents, linetimings) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_logreader(self): | 
					
						
							| 
									
										
										
										
											2001-10-29 20:54:01 +00:00
										 |  |  |         return UnlinkingLogReader(self.logfn) | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_events_wotime(self): | 
					
						
							|  |  |  |         L = [] | 
					
						
							|  |  |  |         for event in self.get_logreader(): | 
					
						
							|  |  |  |             what, (filename, lineno, funcname), tdelta = event | 
					
						
							|  |  |  |             L.append((what, (shortfilename(filename), lineno, funcname))) | 
					
						
							|  |  |  |         return L | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def check_events(self, expected): | 
					
						
							|  |  |  |         events = self.get_events_wotime() | 
					
						
							|  |  |  |         if events != expected: | 
					
						
							|  |  |  |             self.fail( | 
					
						
							|  |  |  |                 "events did not match expectation; got:\n%s\nexpected:\n%s" | 
					
						
							|  |  |  |                 % (pprint.pformat(events), pprint.pformat(expected))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def run_test(self, callable, events, profiler=None): | 
					
						
							|  |  |  |         if profiler is None: | 
					
						
							|  |  |  |             profiler = self.new_profiler() | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(not profiler._prof.closed) | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  |         profiler.runcall(callable) | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(not profiler._prof.closed) | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  |         profiler.close() | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(profiler._prof.closed) | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  |         self.check_events(events) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-29 20:54:01 +00:00
										 |  |  |     def test_addinfo(self): | 
					
						
							|  |  |  |         def f(p): | 
					
						
							|  |  |  |             p.addinfo("test-key", "test-value") | 
					
						
							|  |  |  |         profiler = self.new_profiler() | 
					
						
							|  |  |  |         profiler.runcall(f, profiler) | 
					
						
							|  |  |  |         profiler.close() | 
					
						
							|  |  |  |         log = self.get_logreader() | 
					
						
							|  |  |  |         info = log._info | 
					
						
							|  |  |  |         list(log) | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(info["test-key"] == ["test-value"]) | 
					
						
							| 
									
										
										
										
											2001-10-29 20:54:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  |     def test_line_numbers(self): | 
					
						
							|  |  |  |         def f(): | 
					
						
							|  |  |  |             y = 2 | 
					
						
							|  |  |  |             x = 1 | 
					
						
							|  |  |  |         def g(): | 
					
						
							|  |  |  |             f() | 
					
						
							|  |  |  |         f_lineno = f.func_code.co_firstlineno | 
					
						
							|  |  |  |         g_lineno = g.func_code.co_firstlineno | 
					
						
							|  |  |  |         events = [(ENTER, ("test_hotshot", g_lineno, "g")), | 
					
						
							|  |  |  |                   (LINE,  ("test_hotshot", g_lineno+1, "g")), | 
					
						
							|  |  |  |                   (ENTER, ("test_hotshot", f_lineno, "f")), | 
					
						
							|  |  |  |                   (LINE,  ("test_hotshot", f_lineno+1, "f")), | 
					
						
							|  |  |  |                   (LINE,  ("test_hotshot", f_lineno+2, "f")), | 
					
						
							|  |  |  |                   (EXIT,  ("test_hotshot", f_lineno, "f")), | 
					
						
							|  |  |  |                   (EXIT,  ("test_hotshot", g_lineno, "g")), | 
					
						
							|  |  |  |                   ] | 
					
						
							|  |  |  |         self.run_test(g, events, self.new_profiler(lineevents=1)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-08 21:29:22 +00:00
										 |  |  |     def test_start_stop(self): | 
					
						
							|  |  |  |         # Make sure we don't return NULL in the start() and stop() | 
					
						
							|  |  |  |         # methods when there isn't an error.  Bug in 2.2 noted by | 
					
						
							|  |  |  |         # Anthony Baxter. | 
					
						
							|  |  |  |         profiler = self.new_profiler() | 
					
						
							|  |  |  |         profiler.start() | 
					
						
							|  |  |  |         profiler.stop() | 
					
						
							|  |  |  |         profiler.close() | 
					
						
							|  |  |  |         os.unlink(self.logfn) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-07 04:48:24 +00:00
										 |  |  |     def test_bad_sys_path(self): | 
					
						
							|  |  |  |         import sys | 
					
						
							| 
									
										
										
										
											2006-03-07 23:53:32 +00:00
										 |  |  |         import os | 
					
						
							| 
									
										
										
										
											2006-03-07 04:48:24 +00:00
										 |  |  |         orig_path = sys.path | 
					
						
							|  |  |  |         coverage = hotshot._hotshot.coverage | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             # verify we require a list for sys.path | 
					
						
							|  |  |  |             sys.path = 'abc' | 
					
						
							|  |  |  |             self.assertRaises(RuntimeError, coverage, test_support.TESTFN) | 
					
						
							| 
									
										
										
										
											2006-03-07 23:53:32 +00:00
										 |  |  |             # verify that we require sys.path exists | 
					
						
							| 
									
										
										
										
											2006-03-07 04:48:24 +00:00
										 |  |  |             del sys.path | 
					
						
							|  |  |  |             self.assertRaises(RuntimeError, coverage, test_support.TESTFN) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             sys.path = orig_path | 
					
						
							| 
									
										
										
										
											2006-03-07 23:53:32 +00:00
										 |  |  |             if os.path.exists(test_support.TESTFN): | 
					
						
							|  |  |  |                 os.remove(test_support.TESTFN) | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-15 21:47:57 +00:00
										 |  |  |     def test_logreader_eof_error(self): | 
					
						
							| 
									
										
										
										
											2009-02-07 14:53:31 +00:00
										 |  |  |         emptyfile = tempfile.NamedTemporaryFile() | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             self.assertRaises((IOError, EOFError), _hotshot.logreader, | 
					
						
							|  |  |  |                               emptyfile.name) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             emptyfile.close() | 
					
						
							| 
									
										
										
										
											2008-12-15 21:47:57 +00:00
										 |  |  |         gc.collect() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-12 20:53:59 +00:00
										 |  |  | def test_main(): | 
					
						
							|  |  |  |     test_support.run_unittest(HotShotTestCase) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |