blob: 9c7e109100e1f87c1d796f346659177c13fd3932 [file] [log] [blame]
Tim Petersc7b6bed2002-07-17 00:34:26 +00001import sys
Skip Montanaro599bd5e2004-11-04 04:31:30 +00002import unittest
Guido van Rossum34d19282007-08-09 01:03:29 +00003import io
Fred Drakec19425d2000-06-28 15:07:31 +00004import atexit
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Fred Drakec19425d2000-06-28 15:07:31 +00006
Collin Winter670e6922007-03-21 02:57:17 +00007### helpers
8def h1():
9 print("h1")
10
11def h2():
12 print("h2")
13
14def h3():
15 print("h3")
16
17def h4(*args, **kwargs):
18 print("h4", args, kwargs)
19
20def raise1():
21 raise TypeError
22
23def raise2():
24 raise SystemError
25
Skip Montanaro599bd5e2004-11-04 04:31:30 +000026class TestCase(unittest.TestCase):
Collin Winter670e6922007-03-21 02:57:17 +000027 def setUp(self):
Guido van Rossum34d19282007-08-09 01:03:29 +000028 self.stream = io.StringIO()
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000029 self.save_stdout, self.save_stderr = sys.stderr, sys.stdout
Collin Winter670e6922007-03-21 02:57:17 +000030 sys.stdout = sys.stderr = self.stream
31 atexit._clear()
Guido van Rossumd8faa362007-04-27 19:54:29 +000032
Collin Winter670e6922007-03-21 02:57:17 +000033 def tearDown(self):
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000034 sys.stdout = self.save_stdout
35 sys.stderr = self.save_stderr
Collin Winter670e6922007-03-21 02:57:17 +000036 atexit._clear()
37
Skip Montanaro599bd5e2004-11-04 04:31:30 +000038 def test_args(self):
39 # be sure args are handled properly
Collin Winter670e6922007-03-21 02:57:17 +000040 atexit.register(h1)
41 atexit.register(h4)
42 atexit.register(h4, 4, kw="abc")
43 atexit._run_exitfuncs()
44
45 self.assertEqual(self.stream.getvalue(),
46 "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000047
Benjamin Petersonb8401c72008-09-23 03:14:49 +000048 def test_badargs(self):
49 atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
50 self.assertRaises(TypeError, atexit._run_exitfuncs)
51
Skip Montanaro599bd5e2004-11-04 04:31:30 +000052 def test_order(self):
53 # be sure handlers are executed in reverse order
Collin Winter670e6922007-03-21 02:57:17 +000054 atexit.register(h1)
55 atexit.register(h2)
56 atexit.register(h3)
57 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +000058
Collin Winter670e6922007-03-21 02:57:17 +000059 self.assertEqual(self.stream.getvalue(), "h3\nh2\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000060
Skip Montanaro599bd5e2004-11-04 04:31:30 +000061 def test_raise(self):
62 # be sure raises are handled properly
Collin Winter670e6922007-03-21 02:57:17 +000063 atexit.register(raise1)
64 atexit.register(raise2)
Guido van Rossumd8faa362007-04-27 19:54:29 +000065
Collin Winter670e6922007-03-21 02:57:17 +000066 self.assertRaises(TypeError, atexit._run_exitfuncs)
Guido van Rossumd8faa362007-04-27 19:54:29 +000067
Victor Stinner358e11d2011-01-05 03:54:25 +000068 def test_raise_unnormalized(self):
69 # Issue #10756: Make sure that an unnormalized exception is
70 # handled properly
71 atexit.register(lambda: 1 / 0)
72
73 self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs)
74 self.assertIn("ZeroDivisionError", self.stream.getvalue())
75
Collin Winter670e6922007-03-21 02:57:17 +000076 def test_stress(self):
77 a = [0]
78 def inc():
79 a[0] += 1
Guido van Rossumd8faa362007-04-27 19:54:29 +000080
Collin Winter670e6922007-03-21 02:57:17 +000081 for i in range(128):
82 atexit.register(inc)
83 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +000084
Collin Winter670e6922007-03-21 02:57:17 +000085 self.assertEqual(a[0], 128)
Guido van Rossumd8faa362007-04-27 19:54:29 +000086
Collin Winter670e6922007-03-21 02:57:17 +000087 def test_clear(self):
88 a = [0]
89 def inc():
90 a[0] += 1
Guido van Rossumd8faa362007-04-27 19:54:29 +000091
Collin Winter670e6922007-03-21 02:57:17 +000092 atexit.register(inc)
93 atexit._clear()
94 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +000095
Collin Winter670e6922007-03-21 02:57:17 +000096 self.assertEqual(a[0], 0)
Guido van Rossumd8faa362007-04-27 19:54:29 +000097
Collin Winter670e6922007-03-21 02:57:17 +000098 def test_unregister(self):
99 a = [0]
100 def inc():
101 a[0] += 1
102 def dec():
103 a[0] -= 1
Guido van Rossumd8faa362007-04-27 19:54:29 +0000104
105 for i in range(4):
Collin Winter670e6922007-03-21 02:57:17 +0000106 atexit.register(inc)
107 atexit.register(dec)
108 atexit.unregister(inc)
109 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000110
Collin Winter670e6922007-03-21 02:57:17 +0000111 self.assertEqual(a[0], -1)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000112
Collin Winter670e6922007-03-21 02:57:17 +0000113 def test_bound_methods(self):
114 l = []
115 atexit.register(l.append, 5)
116 atexit._run_exitfuncs()
117 self.assertEqual(l, [5])
Guido van Rossumd8faa362007-04-27 19:54:29 +0000118
Collin Winter670e6922007-03-21 02:57:17 +0000119 atexit.unregister(l.append)
120 atexit._run_exitfuncs()
121 self.assertEqual(l, [5])
Guido van Rossumd8faa362007-04-27 19:54:29 +0000122
Tim Peters012b69c2002-07-16 19:30:59 +0000123
Skip Montanaro599bd5e2004-11-04 04:31:30 +0000124def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000125 support.run_unittest(TestCase)
Tim Peters012b69c2002-07-16 19:30:59 +0000126
Skip Montanaro599bd5e2004-11-04 04:31:30 +0000127if __name__ == "__main__":
128 test_main()