blob: 30c3b4a07b822b34c68f766f868f0c1a1096f9de [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):
Victor Stinner457ab062011-01-05 23:47:00 +000028 self.save_stdout = sys.stdout
29 self.save_stderr = sys.stderr
Guido van Rossum34d19282007-08-09 01:03:29 +000030 self.stream = io.StringIO()
Collin Winter670e6922007-03-21 02:57:17 +000031 sys.stdout = sys.stderr = self.stream
32 atexit._clear()
Guido van Rossumd8faa362007-04-27 19:54:29 +000033
Collin Winter670e6922007-03-21 02:57:17 +000034 def tearDown(self):
Benjamin Petersonf10a79a2008-10-11 00:49:57 +000035 sys.stdout = self.save_stdout
36 sys.stderr = self.save_stderr
Collin Winter670e6922007-03-21 02:57:17 +000037 atexit._clear()
38
Skip Montanaro599bd5e2004-11-04 04:31:30 +000039 def test_args(self):
40 # be sure args are handled properly
Collin Winter670e6922007-03-21 02:57:17 +000041 atexit.register(h1)
42 atexit.register(h4)
43 atexit.register(h4, 4, kw="abc")
44 atexit._run_exitfuncs()
45
46 self.assertEqual(self.stream.getvalue(),
47 "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000048
Benjamin Petersonb8401c72008-09-23 03:14:49 +000049 def test_badargs(self):
50 atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
51 self.assertRaises(TypeError, atexit._run_exitfuncs)
52
Skip Montanaro599bd5e2004-11-04 04:31:30 +000053 def test_order(self):
54 # be sure handlers are executed in reverse order
Collin Winter670e6922007-03-21 02:57:17 +000055 atexit.register(h1)
56 atexit.register(h2)
57 atexit.register(h3)
58 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +000059
Collin Winter670e6922007-03-21 02:57:17 +000060 self.assertEqual(self.stream.getvalue(), "h3\nh2\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000061
Skip Montanaro599bd5e2004-11-04 04:31:30 +000062 def test_raise(self):
63 # be sure raises are handled properly
Collin Winter670e6922007-03-21 02:57:17 +000064 atexit.register(raise1)
65 atexit.register(raise2)
Guido van Rossumd8faa362007-04-27 19:54:29 +000066
Collin Winter670e6922007-03-21 02:57:17 +000067 self.assertRaises(TypeError, atexit._run_exitfuncs)
Guido van Rossumd8faa362007-04-27 19:54:29 +000068
Victor Stinner358e11d2011-01-05 03:54:25 +000069 def test_raise_unnormalized(self):
70 # Issue #10756: Make sure that an unnormalized exception is
71 # handled properly
72 atexit.register(lambda: 1 / 0)
73
74 self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs)
75 self.assertIn("ZeroDivisionError", self.stream.getvalue())
76
Antoine Pitrou24201d42013-10-13 21:53:13 +020077 def test_print_tracebacks(self):
78 # Issue #18776: the tracebacks should be printed when errors occur.
79 def f():
80 1/0 # one
81 def g():
82 1/0 # two
83 def h():
84 1/0 # three
85 atexit.register(f)
86 atexit.register(g)
87 atexit.register(h)
88
89 self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs)
90 stderr = self.stream.getvalue()
91 self.assertEqual(stderr.count("ZeroDivisionError"), 3)
92 self.assertIn("# one", stderr)
93 self.assertIn("# two", stderr)
94 self.assertIn("# three", stderr)
95
Collin Winter670e6922007-03-21 02:57:17 +000096 def test_stress(self):
97 a = [0]
98 def inc():
99 a[0] += 1
Guido van Rossumd8faa362007-04-27 19:54:29 +0000100
Collin Winter670e6922007-03-21 02:57:17 +0000101 for i in range(128):
102 atexit.register(inc)
103 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000104
Collin Winter670e6922007-03-21 02:57:17 +0000105 self.assertEqual(a[0], 128)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000106
Collin Winter670e6922007-03-21 02:57:17 +0000107 def test_clear(self):
108 a = [0]
109 def inc():
110 a[0] += 1
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111
Collin Winter670e6922007-03-21 02:57:17 +0000112 atexit.register(inc)
113 atexit._clear()
114 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000115
Collin Winter670e6922007-03-21 02:57:17 +0000116 self.assertEqual(a[0], 0)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000117
Collin Winter670e6922007-03-21 02:57:17 +0000118 def test_unregister(self):
119 a = [0]
120 def inc():
121 a[0] += 1
122 def dec():
123 a[0] -= 1
Guido van Rossumd8faa362007-04-27 19:54:29 +0000124
125 for i in range(4):
Collin Winter670e6922007-03-21 02:57:17 +0000126 atexit.register(inc)
127 atexit.register(dec)
128 atexit.unregister(inc)
129 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000130
Collin Winter670e6922007-03-21 02:57:17 +0000131 self.assertEqual(a[0], -1)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000132
Collin Winter670e6922007-03-21 02:57:17 +0000133 def test_bound_methods(self):
134 l = []
135 atexit.register(l.append, 5)
136 atexit._run_exitfuncs()
137 self.assertEqual(l, [5])
Guido van Rossumd8faa362007-04-27 19:54:29 +0000138
Collin Winter670e6922007-03-21 02:57:17 +0000139 atexit.unregister(l.append)
140 atexit._run_exitfuncs()
141 self.assertEqual(l, [5])
Guido van Rossumd8faa362007-04-27 19:54:29 +0000142
Tim Peters012b69c2002-07-16 19:30:59 +0000143
Skip Montanaro599bd5e2004-11-04 04:31:30 +0000144def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000145 support.run_unittest(TestCase)
Tim Peters012b69c2002-07-16 19:30:59 +0000146
Skip Montanaro599bd5e2004-11-04 04:31:30 +0000147if __name__ == "__main__":
148 test_main()