123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- from __future__ import absolute_import, unicode_literals
- import logging
- import pytest
- import sys
- from case import Mock, mock, patch
- from celery import beat
- from celery import platforms
- from celery.bin import beat as beat_bin
- from celery.apps import beat as beatapp
- def MockBeat(*args, **kwargs):
- class _Beat(beatapp.Beat):
- Service = Mock(
- name='MockBeat.Service',
- return_value=Mock(name='MockBeat()', max_interval=3.3),
- )
- b = _Beat(*args, **kwargs)
- sched = b.Service.return_value.get_scheduler = Mock()
- sched.return_value.max_interval = 3.3
- return b
- class test_Beat:
- def test_loglevel_string(self):
- b = beatapp.Beat(app=self.app, loglevel='DEBUG',
- redirect_stdouts=False)
- assert b.loglevel == logging.DEBUG
- b2 = beatapp.Beat(app=self.app, loglevel=logging.DEBUG,
- redirect_stdouts=False)
- assert b2.loglevel == logging.DEBUG
- def test_colorize(self):
- self.app.log.setup = Mock()
- b = beatapp.Beat(app=self.app, no_color=True,
- redirect_stdouts=False)
- b.setup_logging()
- self.app.log.setup.assert_called()
- assert not self.app.log.setup.call_args[1]['colorize']
- def test_init_loader(self):
- b = beatapp.Beat(app=self.app, redirect_stdouts=False)
- b.init_loader()
- def test_process_title(self):
- b = beatapp.Beat(app=self.app, redirect_stdouts=False)
- b.set_process_title()
- def test_run(self):
- b = MockBeat(app=self.app, redirect_stdouts=False)
- b.install_sync_handler = Mock(name='beat.install_sync_handler')
- b.Service.return_value.max_interval = 3.0
- b.run()
- b.Service().start.assert_called_with()
- def psig(self, fun, *args, **kwargs):
- handlers = {}
- class Signals(platforms.Signals):
- def __setitem__(self, sig, handler):
- handlers[sig] = handler
- p, platforms.signals = platforms.signals, Signals()
- try:
- fun(*args, **kwargs)
- return handlers
- finally:
- platforms.signals = p
- def test_install_sync_handler(self):
- b = beatapp.Beat(app=self.app, redirect_stdouts=False)
- clock = beat.Service(app=self.app)
- clock.start = Mock(name='beat.Service().start')
- clock.sync = Mock(name='beat.Service().sync')
- handlers = self.psig(b.install_sync_handler, clock)
- with pytest.raises(SystemExit):
- handlers['SIGINT']('SIGINT', object())
- clock.sync.assert_called_with()
- @mock.restore_logging()
- def test_setup_logging(self):
- try:
- # py3k
- delattr(sys.stdout, 'logger')
- except AttributeError:
- pass
- b = beatapp.Beat(app=self.app, redirect_stdouts=False)
- b.redirect_stdouts = False
- b.app.log.already_setup = False
- b.setup_logging()
- with pytest.raises(AttributeError):
- sys.stdout.logger
- import sys
- orig_stdout = sys.__stdout__
- @patch('celery.apps.beat.logger')
- def test_logs_errors(self, logger):
- b = MockBeat(
- app=self.app, redirect_stdouts=False, socket_timeout=None,
- )
- b.install_sync_handler = Mock('beat.install_sync_handler')
- b.install_sync_handler.side_effect = RuntimeError('xxx')
- with mock.restore_logging():
- with pytest.raises(RuntimeError):
- b.start_scheduler()
- logger.critical.assert_called()
- @patch('celery.platforms.create_pidlock')
- def test_using_pidfile(self, create_pidlock):
- b = MockBeat(app=self.app, pidfile='pidfilelockfilepid',
- socket_timeout=None, redirect_stdouts=False)
- b.install_sync_handler = Mock(name='beat.install_sync_handler')
- with mock.stdouts():
- b.start_scheduler()
- create_pidlock.assert_called()
- class test_div:
- def setup(self):
- self.Beat = self.app.Beat = self.patching('celery.apps.beat.Beat')
- self.detached = self.patching('celery.bin.beat.detached')
- self.Beat.__name__ = 'Beat'
- def test_main(self):
- sys.argv = [sys.argv[0], '-s', 'foo']
- beat_bin.main(app=self.app)
- self.Beat().run.assert_called_with()
- def test_detach(self):
- cmd = beat_bin.beat()
- cmd.app = self.app
- cmd.run(detach=True)
- self.detached.assert_called()
- def test_parse_options(self):
- cmd = beat_bin.beat()
- cmd.app = self.app
- options, args = cmd.parse_options('celery beat', ['-s', 'foo'])
- assert options['schedule'] == 'foo'
|