/Lib/test/test_atexit.py

http://unladen-swallow.googlecode.com/ · Python · 81 lines · 63 code · 16 blank · 2 comment · 4 complexity · 0659715f7a8000c2a168796a3a4fbfd3 MD5 · raw file

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