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