test_rdb.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from __future__ import absolute_import
  2. from __future__ import with_statement
  3. import errno
  4. import socket
  5. from mock import Mock, patch
  6. from celery.contrib.rdb import (
  7. Rdb,
  8. debugger,
  9. set_trace,
  10. )
  11. from celery.tests.utils import Case, WhateverIO, skip_if_pypy
  12. class test_Rdb(Case):
  13. @patch('celery.contrib.rdb.Rdb')
  14. def test_debugger(self, Rdb):
  15. x = debugger()
  16. self.assertTrue(x)
  17. self.assertIs(x, debugger())
  18. @patch('celery.contrib.rdb.debugger')
  19. @patch('celery.contrib.rdb._frame')
  20. def test_set_trace(self, _frame, debugger):
  21. self.assertTrue(set_trace(Mock()))
  22. self.assertTrue(set_trace())
  23. self.assertTrue(debugger.return_value.set_trace.called)
  24. @patch('celery.contrib.rdb.Rdb.get_avail_port')
  25. @skip_if_pypy
  26. def test_rdb(self, get_avail_port):
  27. sock = Mock()
  28. get_avail_port.return_value = (sock, 8000)
  29. sock.accept.return_value = (Mock(), ['helu'])
  30. out = WhateverIO()
  31. rdb = Rdb(out=out)
  32. self.assertTrue(get_avail_port.called)
  33. self.assertIn('helu', out.getvalue())
  34. # set_quit
  35. with patch('sys.settrace') as settrace:
  36. rdb.set_quit()
  37. settrace.assert_called_with(None)
  38. # set_trace
  39. with patch('celery.contrib.rdb.Pdb.set_trace') as pset:
  40. with patch('celery.contrib.rdb._frame'):
  41. rdb.set_trace()
  42. rdb.set_trace(Mock())
  43. pset.side_effect = socket.error
  44. pset.side_effect.errno = errno.ECONNRESET
  45. rdb.set_trace()
  46. pset.side_effect.errno = errno.ENOENT
  47. with self.assertRaises(socket.error):
  48. rdb.set_trace()
  49. # _close_session
  50. rdb._close_session()
  51. # do_continue
  52. rdb.set_continue = Mock()
  53. rdb.do_continue(Mock())
  54. rdb.set_continue.assert_called_with()
  55. # do_quit
  56. rdb.set_quit = Mock()
  57. rdb.do_quit(Mock())
  58. rdb.set_quit.assert_called_with()
  59. @patch('socket.socket')
  60. @skip_if_pypy
  61. def test_get_avail_port(self, sock):
  62. out = WhateverIO()
  63. sock.return_value.accept.return_value = (Mock(), ['helu'])
  64. Rdb(out=out)
  65. with patch('celery.contrib.rdb.current_process') as curproc:
  66. curproc.return_value.name = 'PoolWorker-10'
  67. Rdb(out=out)
  68. err = sock.return_value.bind.side_effect = socket.error()
  69. err.errno = errno.ENOENT
  70. with self.assertRaises(socket.error):
  71. Rdb(out=out)
  72. err.errno = errno.EADDRINUSE
  73. with self.assertRaises(Exception):
  74. Rdb(out=out)
  75. called = [0]
  76. def effect(*a, **kw):
  77. try:
  78. if called[0] > 50:
  79. return True
  80. raise err
  81. finally:
  82. called[0] += 1
  83. sock.return_value.bind.side_effect = effect
  84. Rdb(out=out)