1"""Test suite for the cProfile module."""
2
3import sys
4from test.test_support import run_unittest, TESTFN, unlink
5
6# rip off all interesting stuff from test_profile
7import cProfile
8from test.test_profile import ProfileTest, regenerate_expected_output
9
10class CProfileTest(ProfileTest):
11    profilerclass = cProfile.Profile
12    expected_list_sort_output = "{method 'sort' of 'list' objects}"
13
14    # Issue 3895.
15    def test_bad_counter_during_dealloc(self):
16        import _lsprof
17        # Must use a file as StringIO doesn't trigger the bug.
18        sys.stderr = open(TESTFN, 'w')
19        try:
20            obj = _lsprof.Profiler(lambda: int)
21            obj.enable()
22            obj = _lsprof.Profiler(1)
23            obj.disable()
24        finally:
25            sys.stderr = sys.__stderr__
26            unlink(TESTFN)
27
28
29def test_main():
30    run_unittest(CProfileTest)
31
32def main():
33    if '-r' not in sys.argv:
34        test_main()
35    else:
36        regenerate_expected_output(__file__, CProfileTest)
37
38
39# Don't remove this comment. Everything below it is auto-generated.
40#--cut--------------------------------------------------------------------------
41CProfileTest.expected_output['print_stats'] = """\
42         126 function calls (106 primitive calls) in 1.000 seconds
43
44   Ordered by: standard name
45
46   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
47        1    0.000    0.000    1.000    1.000 <string>:1(<module>)
48       28    0.028    0.001    0.028    0.001 profilee.py:110(__getattr__)
49        1    0.270    0.270    1.000    1.000 profilee.py:25(testfunc)
50     23/3    0.150    0.007    0.170    0.057 profilee.py:35(factorial)
51       20    0.020    0.001    0.020    0.001 profilee.py:48(mul)
52        2    0.040    0.020    0.600    0.300 profilee.py:55(helper)
53        4    0.116    0.029    0.120    0.030 profilee.py:73(helper1)
54        2    0.000    0.000    0.140    0.070 profilee.py:84(helper2_indirect)
55        8    0.312    0.039    0.400    0.050 profilee.py:88(helper2)
56        8    0.064    0.008    0.080    0.010 profilee.py:98(subhelper)
57       12    0.000    0.000    0.012    0.001 {hasattr}
58        4    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}
59        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
60        8    0.000    0.000    0.000    0.000 {range}
61        4    0.000    0.000    0.000    0.000 {sys.exc_info}
62
63
64"""
65CProfileTest.expected_output['print_callers'] = """\
66   Ordered by: standard name
67
68Function                                          was called by...
69                                                      ncalls  tottime  cumtime
70<string>:1(<module>)                              <-
71profilee.py:110(__getattr__)                      <-      16    0.016    0.016  profilee.py:98(subhelper)
72                                                          12    0.012    0.012  {hasattr}
73profilee.py:25(testfunc)                          <-       1    0.270    1.000  <string>:1(<module>)
74profilee.py:35(factorial)                         <-       1    0.014    0.130  profilee.py:25(testfunc)
75                                                        20/3    0.130    0.147  profilee.py:35(factorial)
76                                                           2    0.006    0.040  profilee.py:84(helper2_indirect)
77profilee.py:48(mul)                               <-      20    0.020    0.020  profilee.py:35(factorial)
78profilee.py:55(helper)                            <-       2    0.040    0.600  profilee.py:25(testfunc)
79profilee.py:73(helper1)                           <-       4    0.116    0.120  profilee.py:55(helper)
80profilee.py:84(helper2_indirect)                  <-       2    0.000    0.140  profilee.py:55(helper)
81profilee.py:88(helper2)                           <-       6    0.234    0.300  profilee.py:55(helper)
82                                                           2    0.078    0.100  profilee.py:84(helper2_indirect)
83profilee.py:98(subhelper)                         <-       8    0.064    0.080  profilee.py:88(helper2)
84{hasattr}                                         <-       4    0.000    0.004  profilee.py:73(helper1)
85                                                           8    0.000    0.008  profilee.py:88(helper2)
86{method 'append' of 'list' objects}               <-       4    0.000    0.000  profilee.py:73(helper1)
87{method 'disable' of '_lsprof.Profiler' objects}  <-
88{range}                                           <-       8    0.000    0.000  profilee.py:98(subhelper)
89{sys.exc_info}                                    <-       4    0.000    0.000  profilee.py:73(helper1)
90
91
92"""
93CProfileTest.expected_output['print_callees'] = """\
94   Ordered by: standard name
95
96Function                                          called...
97                                                      ncalls  tottime  cumtime
98<string>:1(<module>)                              ->       1    0.270    1.000  profilee.py:25(testfunc)
99profilee.py:110(__getattr__)                      ->
100profilee.py:25(testfunc)                          ->       1    0.014    0.130  profilee.py:35(factorial)
101                                                           2    0.040    0.600  profilee.py:55(helper)
102profilee.py:35(factorial)                         ->    20/3    0.130    0.147  profilee.py:35(factorial)
103                                                          20    0.020    0.020  profilee.py:48(mul)
104profilee.py:48(mul)                               ->
105profilee.py:55(helper)                            ->       4    0.116    0.120  profilee.py:73(helper1)
106                                                           2    0.000    0.140  profilee.py:84(helper2_indirect)
107                                                           6    0.234    0.300  profilee.py:88(helper2)
108profilee.py:73(helper1)                           ->       4    0.000    0.004  {hasattr}
109                                                           4    0.000    0.000  {method 'append' of 'list' objects}
110                                                           4    0.000    0.000  {sys.exc_info}
111profilee.py:84(helper2_indirect)                  ->       2    0.006    0.040  profilee.py:35(factorial)
112                                                           2    0.078    0.100  profilee.py:88(helper2)
113profilee.py:88(helper2)                           ->       8    0.064    0.080  profilee.py:98(subhelper)
114                                                           8    0.000    0.008  {hasattr}
115profilee.py:98(subhelper)                         ->      16    0.016    0.016  profilee.py:110(__getattr__)
116                                                           8    0.000    0.000  {range}
117{hasattr}                                         ->      12    0.012    0.012  profilee.py:110(__getattr__)
118{method 'append' of 'list' objects}               ->
119{method 'disable' of '_lsprof.Profiler' objects}  ->
120{range}                                           ->
121{sys.exc_info}                                    ->
122
123
124"""
125
126if __name__ == "__main__":
127    main()
128