test_celeryd_detach.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from __future__ import absolute_import, unicode_literals
  2. import pytest
  3. from case import Mock, mock, patch
  4. from celery.platforms import IS_WINDOWS
  5. from celery.bin.celeryd_detach import (
  6. detach,
  7. detached_celeryd,
  8. main,
  9. )
  10. if not IS_WINDOWS:
  11. class test_detached:
  12. @patch('celery.bin.celeryd_detach.detached')
  13. @patch('os.execv')
  14. @patch('celery.bin.celeryd_detach.logger')
  15. @patch('celery.app.log.Logging.setup_logging_subsystem')
  16. def test_execs(self, setup_logs, logger, execv, detached):
  17. context = detached.return_value = Mock()
  18. context.__enter__ = Mock()
  19. context.__exit__ = Mock()
  20. detach('/bin/boo', ['a', 'b', 'c'], logfile='/var/log',
  21. pidfile='/var/pid', hostname='foo@example.com')
  22. detached.assert_called_with(
  23. '/var/log', '/var/pid', None, None, None, None, False,
  24. after_forkers=False,
  25. )
  26. execv.assert_called_with('/bin/boo', ['/bin/boo', 'a', 'b', 'c'])
  27. r = detach('/bin/boo', ['a', 'b', 'c'],
  28. logfile='/var/log', pidfile='/var/pid',
  29. executable='/bin/foo', app=self.app)
  30. execv.assert_called_with('/bin/foo', ['/bin/foo', 'a', 'b', 'c'])
  31. execv.side_effect = Exception('foo')
  32. r = detach(
  33. '/bin/boo', ['a', 'b', 'c'],
  34. logfile='/var/log', pidfile='/var/pid',
  35. hostname='foo@example.com', app=self.app)
  36. context.__enter__.assert_called_with()
  37. logger.critical.assert_called()
  38. setup_logs.assert_called_with(
  39. 'ERROR', '/var/log', hostname='foo@example.com')
  40. assert r == 1
  41. self.patching('celery.current_app')
  42. from celery import current_app
  43. r = detach(
  44. '/bin/boo', ['a', 'b', 'c'],
  45. logfile='/var/log', pidfile='/var/pid',
  46. hostname='foo@example.com', app=None)
  47. current_app.log.setup_logging_subsystem.assert_called_with(
  48. 'ERROR', '/var/log', hostname='foo@example.com',
  49. )
  50. class test_PartialOptionParser:
  51. def test_parser(self):
  52. x = detached_celeryd(self.app)
  53. p = x.create_parser('celeryd_detach')
  54. options, values = p.parse_args([
  55. '--logfile=foo', '--fake', '--enable',
  56. 'a', 'b', '-c1', '-d', '2',
  57. ])
  58. assert options.logfile == 'foo'
  59. assert values, ['a' == 'b']
  60. assert p.leftovers, ['--enable', '-c1', '-d' == '2']
  61. options, values = p.parse_args([
  62. '--fake', '--enable',
  63. '--pidfile=/var/pid/foo.pid',
  64. 'a', 'b', '-c1', '-d', '2',
  65. ])
  66. assert options.pidfile == '/var/pid/foo.pid'
  67. with mock.stdouts():
  68. with pytest.raises(SystemExit):
  69. p.parse_args(['--logfile'])
  70. p.get_option('--logfile').nargs = 2
  71. with pytest.raises(SystemExit):
  72. p.parse_args(['--logfile=a'])
  73. with pytest.raises(SystemExit):
  74. p.parse_args(['--fake=abc'])
  75. assert p.get_option('--logfile').nargs == 2
  76. p.parse_args(['--logfile=a', 'b'])
  77. p.get_option('--logfile').nargs = 1
  78. class test_Command:
  79. argv = [
  80. '--foobar=10,2', '-c', '1',
  81. '--logfile=/var/log', '-lDEBUG',
  82. '--', '.disable_rate_limits=1',
  83. ]
  84. def test_parse_options(self):
  85. x = detached_celeryd(app=self.app)
  86. o, v, l = x.parse_options('cd', self.argv)
  87. assert o.logfile == '/var/log'
  88. assert l == [
  89. '--foobar=10,2', '-c', '1',
  90. '-lDEBUG', '--logfile=/var/log',
  91. '--pidfile=celeryd.pid',
  92. ]
  93. x.parse_options('cd', []) # no args
  94. @patch('sys.exit')
  95. @patch('celery.bin.celeryd_detach.detach')
  96. def test_execute_from_commandline(self, detach, exit):
  97. x = detached_celeryd(app=self.app)
  98. x.execute_from_commandline(self.argv)
  99. exit.assert_called()
  100. detach.assert_called_with(
  101. path=x.execv_path, uid=None, gid=None,
  102. umask=None, fake=False, logfile='/var/log', pidfile='celeryd.pid',
  103. workdir=None, executable=None, hostname=None,
  104. argv=x.execv_argv + [
  105. '-c', '1', '-lDEBUG',
  106. '--logfile=/var/log', '--pidfile=celeryd.pid',
  107. '--', '.disable_rate_limits=1'
  108. ],
  109. app=self.app,
  110. )
  111. @patch('celery.bin.celeryd_detach.detached_celeryd')
  112. def test_main(self, command):
  113. c = command.return_value = Mock()
  114. main(self.app)
  115. c.execute_from_commandline.assert_called_with()