17db96d56Sopenharmony_ci"""
27db96d56Sopenharmony_ciTests run by test_atexit in a subprocess since it clears atexit callbacks.
37db96d56Sopenharmony_ci"""
47db96d56Sopenharmony_ciimport atexit
57db96d56Sopenharmony_ciimport sys
67db96d56Sopenharmony_ciimport unittest
77db96d56Sopenharmony_cifrom test import support
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciclass GeneralTest(unittest.TestCase):
117db96d56Sopenharmony_ci    def setUp(self):
127db96d56Sopenharmony_ci        atexit._clear()
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci    def tearDown(self):
157db96d56Sopenharmony_ci        atexit._clear()
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci    def assert_raises_unraisable(self, exc_type, func, *args):
187db96d56Sopenharmony_ci        with support.catch_unraisable_exception() as cm:
197db96d56Sopenharmony_ci            atexit.register(func, *args)
207db96d56Sopenharmony_ci            atexit._run_exitfuncs()
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci            self.assertEqual(cm.unraisable.object, func)
237db96d56Sopenharmony_ci            self.assertEqual(cm.unraisable.exc_type, exc_type)
247db96d56Sopenharmony_ci            self.assertEqual(type(cm.unraisable.exc_value), exc_type)
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    def test_order(self):
277db96d56Sopenharmony_ci        # Check that callbacks are called in reverse order with the expected
287db96d56Sopenharmony_ci        # positional and keyword arguments.
297db96d56Sopenharmony_ci        calls = []
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci        def func1(*args, **kwargs):
327db96d56Sopenharmony_ci            calls.append(('func1', args, kwargs))
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci        def func2(*args, **kwargs):
357db96d56Sopenharmony_ci            calls.append(('func2', args, kwargs))
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci        # be sure args are handled properly
387db96d56Sopenharmony_ci        atexit.register(func1, 1, 2)
397db96d56Sopenharmony_ci        atexit.register(func2)
407db96d56Sopenharmony_ci        atexit.register(func2, 3, key="value")
417db96d56Sopenharmony_ci        atexit._run_exitfuncs()
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci        self.assertEqual(calls,
447db96d56Sopenharmony_ci                         [('func2', (3,), {'key': 'value'}),
457db96d56Sopenharmony_ci                          ('func2', (), {}),
467db96d56Sopenharmony_ci                          ('func1', (1, 2), {})])
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci    def test_badargs(self):
497db96d56Sopenharmony_ci        def func():
507db96d56Sopenharmony_ci            pass
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci        # func() has no parameter, but it's called with 2 parameters
537db96d56Sopenharmony_ci        self.assert_raises_unraisable(TypeError, func, 1 ,2)
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci    def test_raise(self):
567db96d56Sopenharmony_ci        def raise_type_error():
577db96d56Sopenharmony_ci            raise TypeError
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci        self.assert_raises_unraisable(TypeError, raise_type_error)
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci    def test_raise_unnormalized(self):
627db96d56Sopenharmony_ci        # bpo-10756: Make sure that an unnormalized exception is handled
637db96d56Sopenharmony_ci        # properly.
647db96d56Sopenharmony_ci        def div_zero():
657db96d56Sopenharmony_ci            1 / 0
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci        self.assert_raises_unraisable(ZeroDivisionError, div_zero)
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci    def test_exit(self):
707db96d56Sopenharmony_ci        self.assert_raises_unraisable(SystemExit, sys.exit)
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    def test_stress(self):
737db96d56Sopenharmony_ci        a = [0]
747db96d56Sopenharmony_ci        def inc():
757db96d56Sopenharmony_ci            a[0] += 1
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci        for i in range(128):
787db96d56Sopenharmony_ci            atexit.register(inc)
797db96d56Sopenharmony_ci        atexit._run_exitfuncs()
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci        self.assertEqual(a[0], 128)
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci    def test_clear(self):
847db96d56Sopenharmony_ci        a = [0]
857db96d56Sopenharmony_ci        def inc():
867db96d56Sopenharmony_ci            a[0] += 1
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci        atexit.register(inc)
897db96d56Sopenharmony_ci        atexit._clear()
907db96d56Sopenharmony_ci        atexit._run_exitfuncs()
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci        self.assertEqual(a[0], 0)
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci    def test_unregister(self):
957db96d56Sopenharmony_ci        a = [0]
967db96d56Sopenharmony_ci        def inc():
977db96d56Sopenharmony_ci            a[0] += 1
987db96d56Sopenharmony_ci        def dec():
997db96d56Sopenharmony_ci            a[0] -= 1
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci        for i in range(4):
1027db96d56Sopenharmony_ci            atexit.register(inc)
1037db96d56Sopenharmony_ci        atexit.register(dec)
1047db96d56Sopenharmony_ci        atexit.unregister(inc)
1057db96d56Sopenharmony_ci        atexit._run_exitfuncs()
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci        self.assertEqual(a[0], -1)
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci    def test_bound_methods(self):
1107db96d56Sopenharmony_ci        l = []
1117db96d56Sopenharmony_ci        atexit.register(l.append, 5)
1127db96d56Sopenharmony_ci        atexit._run_exitfuncs()
1137db96d56Sopenharmony_ci        self.assertEqual(l, [5])
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci        atexit.unregister(l.append)
1167db96d56Sopenharmony_ci        atexit._run_exitfuncs()
1177db96d56Sopenharmony_ci        self.assertEqual(l, [5])
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci    def test_atexit_with_unregistered_function(self):
1207db96d56Sopenharmony_ci        # See bpo-46025 for more info
1217db96d56Sopenharmony_ci        def func():
1227db96d56Sopenharmony_ci            atexit.unregister(func)
1237db96d56Sopenharmony_ci            1/0
1247db96d56Sopenharmony_ci        atexit.register(func)
1257db96d56Sopenharmony_ci        try:
1267db96d56Sopenharmony_ci            with support.catch_unraisable_exception() as cm:
1277db96d56Sopenharmony_ci                atexit._run_exitfuncs()
1287db96d56Sopenharmony_ci                self.assertEqual(cm.unraisable.object, func)
1297db96d56Sopenharmony_ci                self.assertEqual(cm.unraisable.exc_type, ZeroDivisionError)
1307db96d56Sopenharmony_ci                self.assertEqual(type(cm.unraisable.exc_value), ZeroDivisionError)
1317db96d56Sopenharmony_ci        finally:
1327db96d56Sopenharmony_ci            atexit.unregister(func)
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ciif __name__ == "__main__":
1367db96d56Sopenharmony_ci    unittest.main()
137