test_atexit.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import sys
  2. import unittest
  3. import StringIO
  4. import atexit
  5. from imp import reload
  6. from test import test_support
  7. class TestCase(unittest.TestCase):
  8. def setUp(self):
  9. s = StringIO.StringIO()
  10. self.save_stdout = sys.stdout
  11. self.save_stderr = sys.stderr
  12. sys.stdout = sys.stderr = self.subst_io = s
  13. self.save_handlers = atexit._exithandlers
  14. atexit._exithandlers = []
  15. def tearDown(self):
  16. sys.stdout = self.save_stdout
  17. sys.stderr = self.save_stderr
  18. atexit._exithandlers = self.save_handlers
  19. def test_args(self):
  20. atexit.register(self.h1)
  21. atexit.register(self.h4)
  22. atexit.register(self.h4, 4, kw="abc")
  23. atexit._run_exitfuncs()
  24. self.assertEqual(self.subst_io.getvalue(),
  25. "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
  26. def test_badargs(self):
  27. atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
  28. self.assertRaises(TypeError, atexit._run_exitfuncs)
  29. def test_order(self):
  30. atexit.register(self.h1)
  31. atexit.register(self.h2)
  32. atexit.register(self.h3)
  33. atexit._run_exitfuncs()
  34. self.assertEqual(self.subst_io.getvalue(), "h3\nh2\nh1\n")
  35. def test_sys_override(self):
  36. # be sure a preset sys.exitfunc is handled properly
  37. exfunc = sys.exitfunc
  38. sys.exitfunc = self.h1
  39. reload(atexit)
  40. try:
  41. atexit.register(self.h2)
  42. atexit._run_exitfuncs()
  43. finally:
  44. sys.exitfunc = exfunc
  45. self.assertEqual(self.subst_io.getvalue(), "h2\nh1\n")
  46. def test_raise(self):
  47. atexit.register(self.raise1)
  48. atexit.register(self.raise2)
  49. self.assertRaises(TypeError, atexit._run_exitfuncs)
  50. ### helpers
  51. def h1(self):
  52. print "h1"
  53. def h2(self):
  54. print "h2"
  55. def h3(self):
  56. print "h3"
  57. def h4(self, *args, **kwargs):
  58. print "h4", args, kwargs
  59. def raise1(self):
  60. raise TypeError
  61. def raise2(self):
  62. raise SystemError
  63. def test_main():
  64. test_support.run_unittest(TestCase)
  65. if __name__ == "__main__":
  66. test_main()