|
1 | | -# Test the atexit module. |
2 | | -from test.test_support import TESTFN, vereq, is_jython |
3 | | -import atexit |
4 | | -from os import popen, unlink |
5 | 1 | import sys |
6 | | - |
7 | | -executable = sys.executable |
8 | | -if is_jython: |
9 | | - executable = "jython" |
10 | | - |
11 | | -input = """\ |
| 2 | +import unittest |
| 3 | +import StringIO |
12 | 4 | import atexit |
| 5 | +from test import test_support |
13 | 6 |
|
14 | | -def handler1(): |
15 | | - print "handler1" |
| 7 | +class TestCase(unittest.TestCase): |
| 8 | + def test_args(self): |
| 9 | + # be sure args are handled properly |
| 10 | + s = StringIO.StringIO() |
| 11 | + sys.stdout = sys.stderr = s |
| 12 | + save_handlers = atexit._exithandlers |
| 13 | + atexit._exithandlers = [] |
| 14 | + try: |
| 15 | + atexit.register(self.h1) |
| 16 | + atexit.register(self.h4) |
| 17 | + atexit.register(self.h4, 4, kw="abc") |
| 18 | + atexit._run_exitfuncs() |
| 19 | + finally: |
| 20 | + sys.stdout = sys.__stdout__ |
| 21 | + sys.stderr = sys.__stderr__ |
| 22 | + atexit._exithandlers = save_handlers |
| 23 | + self.assertEqual(s.getvalue(), "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n") |
16 | 24 |
|
17 | | -def handler2(*args, **kargs): |
18 | | - print "handler2", args, kargs |
| 25 | + def test_order(self): |
| 26 | + # be sure handlers are executed in reverse order |
| 27 | + s = StringIO.StringIO() |
| 28 | + sys.stdout = sys.stderr = s |
| 29 | + save_handlers = atexit._exithandlers |
| 30 | + atexit._exithandlers = [] |
| 31 | + try: |
| 32 | + atexit.register(self.h1) |
| 33 | + atexit.register(self.h2) |
| 34 | + atexit.register(self.h3) |
| 35 | + atexit._run_exitfuncs() |
| 36 | + finally: |
| 37 | + sys.stdout = sys.__stdout__ |
| 38 | + sys.stderr = sys.__stderr__ |
| 39 | + atexit._exithandlers = save_handlers |
| 40 | + self.assertEqual(s.getvalue(), "h3\nh2\nh1\n") |
19 | 41 |
|
20 | | -atexit.register(handler1) |
21 | | -atexit.register(handler2) |
22 | | -atexit.register(handler2, 7, kw="abc") |
23 | | -""" |
| 42 | + def test_sys_override(self): |
| 43 | + # be sure a preset sys.exitfunc is handled properly |
| 44 | + s = StringIO.StringIO() |
| 45 | + sys.stdout = sys.stderr = s |
| 46 | + save_handlers = atexit._exithandlers |
| 47 | + atexit._exithandlers = [] |
| 48 | + exfunc = sys.exitfunc |
| 49 | + sys.exitfunc = self.h1 |
| 50 | + reload(atexit) |
| 51 | + try: |
| 52 | + atexit.register(self.h2) |
| 53 | + atexit._run_exitfuncs() |
| 54 | + finally: |
| 55 | + sys.stdout = sys.__stdout__ |
| 56 | + sys.stderr = sys.__stderr__ |
| 57 | + atexit._exithandlers = save_handlers |
| 58 | + sys.exitfunc = exfunc |
| 59 | + self.assertEqual(s.getvalue(), "h2\nh1\n") |
24 | 60 |
|
25 | | -fname = TESTFN + ".py" |
26 | | -f = file(fname, "w") |
27 | | -f.write(input) |
28 | | -f.close() |
| 61 | + def test_raise(self): |
| 62 | + # be sure raises are handled properly |
| 63 | + s = StringIO.StringIO() |
| 64 | + sys.stdout = sys.stderr = s |
| 65 | + save_handlers = atexit._exithandlers |
| 66 | + atexit._exithandlers = [] |
| 67 | + try: |
| 68 | + atexit.register(self.raise1) |
| 69 | + atexit.register(self.raise2) |
| 70 | + self.assertRaises(TypeError, atexit._run_exitfuncs) |
| 71 | + finally: |
| 72 | + sys.stdout = sys.__stdout__ |
| 73 | + sys.stderr = sys.__stderr__ |
| 74 | + atexit._exithandlers = save_handlers |
| 75 | + |
| 76 | + ### helpers |
| 77 | + def h1(self): |
| 78 | + print "h1" |
29 | 79 |
|
30 | | -p = popen('"%s" %s' % (executable, fname)) |
31 | | -output = p.read() |
32 | | -p.close() |
33 | | -vereq(output, """\ |
34 | | -handler2 (7,) {'kw': 'abc'} |
35 | | -handler2 () {} |
36 | | -handler1 |
37 | | -""") |
| 80 | + def h2(self): |
| 81 | + print "h2" |
38 | 82 |
|
39 | | -input = """\ |
40 | | -def direct(): |
41 | | - print "direct exit" |
| 83 | + def h3(self): |
| 84 | + print "h3" |
42 | 85 |
|
43 | | -import sys |
44 | | -sys.exitfunc = direct |
| 86 | + def h4(self, *args, **kwargs): |
| 87 | + print "h4", args, kwargs |
45 | 88 |
|
46 | | -# Make sure atexit doesn't drop |
47 | | -def indirect(): |
48 | | - print "indirect exit" |
| 89 | + def raise1(self): |
| 90 | + raise TypeError |
49 | 91 |
|
50 | | -import atexit |
51 | | -atexit.register(indirect) |
52 | | -""" |
| 92 | + def raise2(self): |
| 93 | + raise SystemError |
53 | 94 |
|
54 | | -f = file(fname, "w") |
55 | | -f.write(input) |
56 | | -f.close() |
| 95 | +def test_main(): |
| 96 | + test_support.run_unittest(TestCase) |
57 | 97 |
|
58 | | -p = popen('"%s" %s' % (executable, fname)) |
59 | | -output = p.read() |
60 | | -p.close() |
61 | | -vereq(output, """\ |
62 | | -indirect exit |
63 | | -direct exit |
64 | | -""") |
65 | 98 |
|
66 | | -unlink(fname) |
| 99 | +if __name__ == "__main__": |
| 100 | + test_main() |
0 commit comments