| import sys | |
| import unittest | |
| import StringIO | |
| import atexit | |
| from imp import reload | |
| from test import test_support | |
| class TestCase(unittest.TestCase): | |
| def setUp(self): | |
| s = StringIO.StringIO() | |
| self.save_stdout = sys.stdout | |
| self.save_stderr = sys.stderr | |
| sys.stdout = sys.stderr = self.subst_io = s | |
| self.save_handlers = atexit._exithandlers | |
| atexit._exithandlers = [] | |
| def tearDown(self): | |
| sys.stdout = self.save_stdout | |
| sys.stderr = self.save_stderr | |
| atexit._exithandlers = self.save_handlers | |
| def test_args(self): | |
| atexit.register(self.h1) | |
| atexit.register(self.h4) | |
| atexit.register(self.h4, 4, kw="abc") | |
| atexit._run_exitfuncs() | |
| self.assertEqual(self.subst_io.getvalue(), | |
| "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n") | |
| def test_badargs(self): | |
| atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0) | |
| self.assertRaises(TypeError, atexit._run_exitfuncs) | |
| def test_order(self): | |
| atexit.register(self.h1) | |
| atexit.register(self.h2) | |
| atexit.register(self.h3) | |
| atexit._run_exitfuncs() | |
| self.assertEqual(self.subst_io.getvalue(), "h3\nh2\nh1\n") | |
| def test_sys_override(self): | |
| # be sure a preset sys.exitfunc is handled properly | |
| exfunc = sys.exitfunc | |
| sys.exitfunc = self.h1 | |
| reload(atexit) | |
| try: | |
| atexit.register(self.h2) | |
| atexit._run_exitfuncs() | |
| finally: | |
| sys.exitfunc = exfunc | |
| self.assertEqual(self.subst_io.getvalue(), "h2\nh1\n") | |
| def test_raise(self): | |
| atexit.register(self.raise1) | |
| atexit.register(self.raise2) | |
| self.assertRaises(TypeError, atexit._run_exitfuncs) | |
| ### helpers | |
| def h1(self): | |
| print "h1" | |
| def h2(self): | |
| print "h2" | |
| def h3(self): | |
| print "h3" | |
| def h4(self, *args, **kwargs): | |
| print "h4", args, kwargs | |
| def raise1(self): | |
| raise TypeError | |
| def raise2(self): | |
| raise SystemError | |
| def test_main(): | |
| test_support.run_unittest(TestCase) | |
| if __name__ == "__main__": | |
| test_main() |