test_atexit.py 2.62 KB
Newer Older
1
import sys
2
import unittest
3
import io
4
import atexit
5
from test import support
6

7 8 9
### helpers
def h1():
    print("h1")
10

11 12
def h2():
    print("h2")
13

14 15
def h3():
    print("h3")
16

17 18 19 20 21
def h4(*args, **kwargs):
    print("h4", args, kwargs)

def raise1():
    raise TypeError
Tim Peters's avatar
Tim Peters committed
22

23 24
def raise2():
    raise SystemError
25

26 27
class TestCase(unittest.TestCase):
    def setUp(self):
28
        self.stream = io.StringIO()
Benjamin Peterson's avatar
Benjamin Peterson committed
29
        self.save_stdout, self.save_stderr = sys.stderr, sys.stdout
30 31
        sys.stdout = sys.stderr = self.stream
        atexit._clear()
32

33
    def tearDown(self):
Benjamin Peterson's avatar
Benjamin Peterson committed
34 35
        sys.stdout = self.save_stdout
        sys.stderr = self.save_stderr
36
        atexit._clear()
37

38 39 40 41 42 43
    def test_args(self):
        # be sure args are handled properly
        atexit.register(h1)
        atexit.register(h4)
        atexit.register(h4, 4, kw="abc")
        atexit._run_exitfuncs()
44

45 46
        self.assertEqual(self.stream.getvalue(),
                            "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
47

48 49 50 51
    def test_badargs(self):
        atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
        self.assertRaises(TypeError, atexit._run_exitfuncs)

52 53 54 55 56 57
    def test_order(self):
        # be sure handlers are executed in reverse order
        atexit.register(h1)
        atexit.register(h2)
        atexit.register(h3)
        atexit._run_exitfuncs()
58

59
        self.assertEqual(self.stream.getvalue(), "h3\nh2\nh1\n")
60

61 62 63 64
    def test_raise(self):
        # be sure raises are handled properly
        atexit.register(raise1)
        atexit.register(raise2)
65

66
        self.assertRaises(TypeError, atexit._run_exitfuncs)
67

68 69 70 71
    def test_stress(self):
        a = [0]
        def inc():
            a[0] += 1
72

73 74 75
        for i in range(128):
            atexit.register(inc)
        atexit._run_exitfuncs()
76

77
        self.assertEqual(a[0], 128)
78

79 80 81 82
    def test_clear(self):
        a = [0]
        def inc():
            a[0] += 1
83

84 85 86
        atexit.register(inc)
        atexit._clear()
        atexit._run_exitfuncs()
87

88
        self.assertEqual(a[0], 0)
89

90 91 92 93 94 95
    def test_unregister(self):
        a = [0]
        def inc():
            a[0] += 1
        def dec():
            a[0] -= 1
96 97

        for i in range(4):
98 99 100 101
            atexit.register(inc)
        atexit.register(dec)
        atexit.unregister(inc)
        atexit._run_exitfuncs()
102

103
        self.assertEqual(a[0], -1)
104

105 106 107 108 109
    def test_bound_methods(self):
        l = []
        atexit.register(l.append, 5)
        atexit._run_exitfuncs()
        self.assertEqual(l, [5])
110

111 112 113
        atexit.unregister(l.append)
        atexit._run_exitfuncs()
        self.assertEqual(l, [5])
114

115

116
def test_main():
117
    support.run_unittest(TestCase)
118

119 120
if __name__ == "__main__":
    test_main()