17db96d56Sopenharmony_ci"""Test suite for the cProfile module."""
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport sys
47db96d56Sopenharmony_ciimport unittest
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci# rip off all interesting stuff from test_profile
77db96d56Sopenharmony_ciimport cProfile
87db96d56Sopenharmony_cifrom test.test_profile import ProfileTest, regenerate_expected_output
97db96d56Sopenharmony_cifrom test.support.script_helper import assert_python_failure
107db96d56Sopenharmony_cifrom test import support
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ciclass CProfileTest(ProfileTest):
147db96d56Sopenharmony_ci    profilerclass = cProfile.Profile
157db96d56Sopenharmony_ci    profilermodule = cProfile
167db96d56Sopenharmony_ci    expected_max_output = "{built-in method builtins.max}"
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci    def get_expected_output(self):
197db96d56Sopenharmony_ci        return _ProfileOutput
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci    def test_bad_counter_during_dealloc(self):
227db96d56Sopenharmony_ci        # bpo-3895
237db96d56Sopenharmony_ci        import _lsprof
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci        with support.catch_unraisable_exception() as cm:
267db96d56Sopenharmony_ci            obj = _lsprof.Profiler(lambda: int)
277db96d56Sopenharmony_ci            obj.enable()
287db96d56Sopenharmony_ci            obj = _lsprof.Profiler(1)
297db96d56Sopenharmony_ci            obj.disable()
307db96d56Sopenharmony_ci            obj.clear()
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci            self.assertEqual(cm.unraisable.exc_type, TypeError)
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci    def test_profile_enable_disable(self):
357db96d56Sopenharmony_ci        prof = self.profilerclass()
367db96d56Sopenharmony_ci        # Make sure we clean ourselves up if the test fails for some reason.
377db96d56Sopenharmony_ci        self.addCleanup(prof.disable)
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci        prof.enable()
407db96d56Sopenharmony_ci        self.assertIs(sys.getprofile(), prof)
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci        prof.disable()
437db96d56Sopenharmony_ci        self.assertIs(sys.getprofile(), None)
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci    def test_profile_as_context_manager(self):
467db96d56Sopenharmony_ci        prof = self.profilerclass()
477db96d56Sopenharmony_ci        # Make sure we clean ourselves up if the test fails for some reason.
487db96d56Sopenharmony_ci        self.addCleanup(prof.disable)
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci        with prof as __enter__return_value:
517db96d56Sopenharmony_ci            # profile.__enter__ should return itself.
527db96d56Sopenharmony_ci            self.assertIs(prof, __enter__return_value)
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci            # profile should be set as the global profiler inside the
557db96d56Sopenharmony_ci            # with-block
567db96d56Sopenharmony_ci            self.assertIs(sys.getprofile(), prof)
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci        # profile shouldn't be set once we leave the with-block.
597db96d56Sopenharmony_ci        self.assertIs(sys.getprofile(), None)
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ciclass TestCommandLine(unittest.TestCase):
627db96d56Sopenharmony_ci    def test_sort(self):
637db96d56Sopenharmony_ci        rc, out, err = assert_python_failure('-m', 'cProfile', '-s', 'demo')
647db96d56Sopenharmony_ci        self.assertGreater(rc, 0)
657db96d56Sopenharmony_ci        self.assertIn(b"option -s: invalid choice: 'demo'", err)
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_cidef main():
697db96d56Sopenharmony_ci    if '-r' not in sys.argv:
707db96d56Sopenharmony_ci        unittest.main()
717db96d56Sopenharmony_ci    else:
727db96d56Sopenharmony_ci        regenerate_expected_output(__file__, CProfileTest)
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci# Don't remove this comment. Everything below it is auto-generated.
767db96d56Sopenharmony_ci#--cut--------------------------------------------------------------------------
777db96d56Sopenharmony_ci_ProfileOutput = {}
787db96d56Sopenharmony_ci_ProfileOutput['print_stats'] = """\
797db96d56Sopenharmony_ci       28    0.028    0.001    0.028    0.001 profilee.py:110(__getattr__)
807db96d56Sopenharmony_ci        1    0.270    0.270    1.000    1.000 profilee.py:25(testfunc)
817db96d56Sopenharmony_ci     23/3    0.150    0.007    0.170    0.057 profilee.py:35(factorial)
827db96d56Sopenharmony_ci       20    0.020    0.001    0.020    0.001 profilee.py:48(mul)
837db96d56Sopenharmony_ci        2    0.040    0.020    0.600    0.300 profilee.py:55(helper)
847db96d56Sopenharmony_ci        4    0.116    0.029    0.120    0.030 profilee.py:73(helper1)
857db96d56Sopenharmony_ci        2    0.000    0.000    0.140    0.070 profilee.py:84(helper2_indirect)
867db96d56Sopenharmony_ci        8    0.312    0.039    0.400    0.050 profilee.py:88(helper2)
877db96d56Sopenharmony_ci        8    0.064    0.008    0.080    0.010 profilee.py:98(subhelper)"""
887db96d56Sopenharmony_ci_ProfileOutput['print_callers'] = """\
897db96d56Sopenharmony_ciprofilee.py:110(__getattr__)                      <-      16    0.016    0.016  profilee.py:98(subhelper)
907db96d56Sopenharmony_ciprofilee.py:25(testfunc)                          <-       1    0.270    1.000  <string>:1(<module>)
917db96d56Sopenharmony_ciprofilee.py:35(factorial)                         <-       1    0.014    0.130  profilee.py:25(testfunc)
927db96d56Sopenharmony_ci                                                        20/3    0.130    0.147  profilee.py:35(factorial)
937db96d56Sopenharmony_ci                                                           2    0.006    0.040  profilee.py:84(helper2_indirect)
947db96d56Sopenharmony_ciprofilee.py:48(mul)                               <-      20    0.020    0.020  profilee.py:35(factorial)
957db96d56Sopenharmony_ciprofilee.py:55(helper)                            <-       2    0.040    0.600  profilee.py:25(testfunc)
967db96d56Sopenharmony_ciprofilee.py:73(helper1)                           <-       4    0.116    0.120  profilee.py:55(helper)
977db96d56Sopenharmony_ciprofilee.py:84(helper2_indirect)                  <-       2    0.000    0.140  profilee.py:55(helper)
987db96d56Sopenharmony_ciprofilee.py:88(helper2)                           <-       6    0.234    0.300  profilee.py:55(helper)
997db96d56Sopenharmony_ci                                                           2    0.078    0.100  profilee.py:84(helper2_indirect)
1007db96d56Sopenharmony_ciprofilee.py:98(subhelper)                         <-       8    0.064    0.080  profilee.py:88(helper2)
1017db96d56Sopenharmony_ci{built-in method builtins.hasattr}                <-       4    0.000    0.004  profilee.py:73(helper1)
1027db96d56Sopenharmony_ci                                                           8    0.000    0.008  profilee.py:88(helper2)
1037db96d56Sopenharmony_ci{built-in method sys.exc_info}                    <-       4    0.000    0.000  profilee.py:73(helper1)
1047db96d56Sopenharmony_ci{method 'append' of 'list' objects}               <-       4    0.000    0.000  profilee.py:73(helper1)"""
1057db96d56Sopenharmony_ci_ProfileOutput['print_callees'] = """\
1067db96d56Sopenharmony_ci<string>:1(<module>)                              ->       1    0.270    1.000  profilee.py:25(testfunc)
1077db96d56Sopenharmony_ciprofilee.py:110(__getattr__)                      ->
1087db96d56Sopenharmony_ciprofilee.py:25(testfunc)                          ->       1    0.014    0.130  profilee.py:35(factorial)
1097db96d56Sopenharmony_ci                                                           2    0.040    0.600  profilee.py:55(helper)
1107db96d56Sopenharmony_ciprofilee.py:35(factorial)                         ->    20/3    0.130    0.147  profilee.py:35(factorial)
1117db96d56Sopenharmony_ci                                                          20    0.020    0.020  profilee.py:48(mul)
1127db96d56Sopenharmony_ciprofilee.py:48(mul)                               ->
1137db96d56Sopenharmony_ciprofilee.py:55(helper)                            ->       4    0.116    0.120  profilee.py:73(helper1)
1147db96d56Sopenharmony_ci                                                           2    0.000    0.140  profilee.py:84(helper2_indirect)
1157db96d56Sopenharmony_ci                                                           6    0.234    0.300  profilee.py:88(helper2)
1167db96d56Sopenharmony_ciprofilee.py:73(helper1)                           ->       4    0.000    0.004  {built-in method builtins.hasattr}
1177db96d56Sopenharmony_ciprofilee.py:84(helper2_indirect)                  ->       2    0.006    0.040  profilee.py:35(factorial)
1187db96d56Sopenharmony_ci                                                           2    0.078    0.100  profilee.py:88(helper2)
1197db96d56Sopenharmony_ciprofilee.py:88(helper2)                           ->       8    0.064    0.080  profilee.py:98(subhelper)
1207db96d56Sopenharmony_ciprofilee.py:98(subhelper)                         ->      16    0.016    0.016  profilee.py:110(__getattr__)
1217db96d56Sopenharmony_ci{built-in method builtins.hasattr}                ->      12    0.012    0.012  profilee.py:110(__getattr__)"""
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ciif __name__ == "__main__":
1247db96d56Sopenharmony_ci    main()
125