blob: bde898744b6a388d702322ba920d504eeb125600 [file] [log] [blame]
Tim Petersc7b6bed2002-07-17 00:34:26 +00001import sys
Skip Montanaro599bd5e2004-11-04 04:31:30 +00002import unittest
3import StringIO
Fred Drakec19425d2000-06-28 15:07:31 +00004import atexit
Antoine Pitrou868817e2009-10-14 17:34:31 +00005from imp import reload
Skip Montanaro599bd5e2004-11-04 04:31:30 +00006from test import test_support
Fred Drakec19425d2000-06-28 15:07:31 +00007
Serhiy Storchaka0cc43df2017-06-12 09:10:53 +03008
9def exit():
10 raise SystemExit
11
12
Skip Montanaro599bd5e2004-11-04 04:31:30 +000013class TestCase(unittest.TestCase):
Skip Montanaro0d8372b2008-10-07 01:55:20 +000014 def setUp(self):
Skip Montanaro7d9d7a22008-10-07 15:03:40 +000015 self.save_stdout = sys.stdout
16 self.save_stderr = sys.stderr
Serhiy Storchaka0cc43df2017-06-12 09:10:53 +030017 self.stream = StringIO.StringIO()
18 sys.stdout = sys.stderr = self.subst_io = self.stream
Skip Montanaro0d8372b2008-10-07 01:55:20 +000019 self.save_handlers = atexit._exithandlers
Skip Montanaro599bd5e2004-11-04 04:31:30 +000020 atexit._exithandlers = []
Skip Montanaro0d8372b2008-10-07 01:55:20 +000021
22 def tearDown(self):
Skip Montanaro7d9d7a22008-10-07 15:03:40 +000023 sys.stdout = self.save_stdout
24 sys.stderr = self.save_stderr
Skip Montanaro0d8372b2008-10-07 01:55:20 +000025 atexit._exithandlers = self.save_handlers
26
27 def test_args(self):
28 atexit.register(self.h1)
29 atexit.register(self.h4)
30 atexit.register(self.h4, 4, kw="abc")
31 atexit._run_exitfuncs()
32 self.assertEqual(self.subst_io.getvalue(),
33 "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000034
Benjamin Petersona74d6752008-09-23 20:43:09 +000035 def test_badargs(self):
Skip Montanaro0d8372b2008-10-07 01:55:20 +000036 atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
37 self.assertRaises(TypeError, atexit._run_exitfuncs)
Benjamin Petersona74d6752008-09-23 20:43:09 +000038
Skip Montanaro599bd5e2004-11-04 04:31:30 +000039 def test_order(self):
Skip Montanaro0d8372b2008-10-07 01:55:20 +000040 atexit.register(self.h1)
41 atexit.register(self.h2)
42 atexit.register(self.h3)
43 atexit._run_exitfuncs()
44 self.assertEqual(self.subst_io.getvalue(), "h3\nh2\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000045
Skip Montanaro599bd5e2004-11-04 04:31:30 +000046 def test_sys_override(self):
47 # be sure a preset sys.exitfunc is handled properly
Skip Montanaro599bd5e2004-11-04 04:31:30 +000048 exfunc = sys.exitfunc
49 sys.exitfunc = self.h1
50 reload(atexit)
51 try:
52 atexit.register(self.h2)
53 atexit._run_exitfuncs()
54 finally:
Skip Montanaro599bd5e2004-11-04 04:31:30 +000055 sys.exitfunc = exfunc
Skip Montanaro0d8372b2008-10-07 01:55:20 +000056 self.assertEqual(self.subst_io.getvalue(), "h2\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000057
Skip Montanaro599bd5e2004-11-04 04:31:30 +000058 def test_raise(self):
Skip Montanaro0d8372b2008-10-07 01:55:20 +000059 atexit.register(self.raise1)
60 atexit.register(self.raise2)
61 self.assertRaises(TypeError, atexit._run_exitfuncs)
Tim Peters00afb072004-11-07 04:52:29 +000062
Serhiy Storchaka0cc43df2017-06-12 09:10:53 +030063 def test_exit(self):
64 # be sure a SystemExit is handled properly
65 atexit.register(exit)
66
67 self.assertRaises(SystemExit, atexit._run_exitfuncs)
68 self.assertEqual(self.stream.getvalue(), '')
69
Skip Montanaro599bd5e2004-11-04 04:31:30 +000070 ### helpers
71 def h1(self):
72 print "h1"
Fred Drakec19425d2000-06-28 15:07:31 +000073
Skip Montanaro599bd5e2004-11-04 04:31:30 +000074 def h2(self):
75 print "h2"
Tim Peters012b69c2002-07-16 19:30:59 +000076
Skip Montanaro599bd5e2004-11-04 04:31:30 +000077 def h3(self):
78 print "h3"
Tim Peters012b69c2002-07-16 19:30:59 +000079
Skip Montanaro599bd5e2004-11-04 04:31:30 +000080 def h4(self, *args, **kwargs):
81 print "h4", args, kwargs
Tim Peters012b69c2002-07-16 19:30:59 +000082
Skip Montanaro599bd5e2004-11-04 04:31:30 +000083 def raise1(self):
84 raise TypeError
Tim Peters012b69c2002-07-16 19:30:59 +000085
Skip Montanaro599bd5e2004-11-04 04:31:30 +000086 def raise2(self):
87 raise SystemError
Tim Peters012b69c2002-07-16 19:30:59 +000088
Skip Montanaro599bd5e2004-11-04 04:31:30 +000089def test_main():
90 test_support.run_unittest(TestCase)
Tim Peters012b69c2002-07-16 19:30:59 +000091
Tim Peters012b69c2002-07-16 19:30:59 +000092
Skip Montanaro599bd5e2004-11-04 04:31:30 +000093if __name__ == "__main__":
94 test_main()