|  | @@ -13,45 +13,11 @@ from celery.apps import beat as beatapp
 | 
	
		
			
				|  |  |  from celery.tests.case import AppCase, Mock, mock, patch
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class MockedShelveModule(object):
 | 
	
		
			
				|  |  | -    shelves = defaultdict(lambda: {})
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def open(self, filename, *args, **kwargs):
 | 
	
		
			
				|  |  | -        return self.shelves[filename]
 | 
	
		
			
				|  |  | -mocked_shelve = MockedShelveModule()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class MockService(beat.Service):
 | 
	
		
			
				|  |  | -    started = False
 | 
	
		
			
				|  |  | -    in_sync = False
 | 
	
		
			
				|  |  | -    persistence = mocked_shelve
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def start(self):
 | 
	
		
			
				|  |  | -        self.__class__.started = True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def sync(self):
 | 
	
		
			
				|  |  | -        self.__class__.in_sync = True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  class MockBeat(beatapp.Beat):
 | 
	
		
			
				|  |  | -    running = False
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def run(self):
 | 
	
		
			
				|  |  | -        MockBeat.running = True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class MockBeat2(beatapp.Beat):
 | 
	
		
			
				|  |  | -    Service = MockService
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def install_sync_handler(self, b):
 | 
	
		
			
				|  |  | -        pass
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class MockBeat3(beatapp.Beat):
 | 
	
		
			
				|  |  | -    Service = MockService
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def install_sync_handler(self, b):
 | 
	
		
			
				|  |  | -        raise TypeError('xxx')
 | 
	
		
			
				|  |  | +    Service = Mock(
 | 
	
		
			
				|  |  | +        name='MockBeat.Service',
 | 
	
		
			
				|  |  | +        return_value=Mock(name='MockBeat()', max_interval=3.3),
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class test_Beat(AppCase):
 | 
	
	
		
			
				|  | @@ -82,10 +48,11 @@ class test_Beat(AppCase):
 | 
	
		
			
				|  |  |          b.set_process_title()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_run(self):
 | 
	
		
			
				|  |  | -        b = MockBeat2(app=self.app, redirect_stdouts=False)
 | 
	
		
			
				|  |  | -        MockService.started = False
 | 
	
		
			
				|  |  | +        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()
 | 
	
		
			
				|  |  | -        self.assertTrue(MockService.started)
 | 
	
		
			
				|  |  | +        b.Service().start.assert_called_with()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def psig(self, fun, *args, **kwargs):
 | 
	
		
			
				|  |  |          handlers = {}
 | 
	
	
		
			
				|  | @@ -104,13 +71,13 @@ class test_Beat(AppCase):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_install_sync_handler(self):
 | 
	
		
			
				|  |  |          b = beatapp.Beat(app=self.app, redirect_stdouts=False)
 | 
	
		
			
				|  |  | -        clock = MockService(app=self.app)
 | 
	
		
			
				|  |  | -        MockService.in_sync = 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 self.assertRaises(SystemExit):
 | 
	
		
			
				|  |  |              handlers['SIGINT']('SIGINT', object())
 | 
	
		
			
				|  |  | -        self.assertTrue(MockService.in_sync)
 | 
	
		
			
				|  |  | -        MockService.in_sync = False
 | 
	
		
			
				|  |  | +        clock.sync.assert_called_with()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @mock.restore_logging()
 | 
	
		
			
				|  |  |      def test_setup_logging(self):
 | 
	
	
		
			
				|  | @@ -133,63 +100,42 @@ class test_Beat(AppCase):
 | 
	
		
			
				|  |  |      @mock.restore_logging()
 | 
	
		
			
				|  |  |      @mock.stdouts
 | 
	
		
			
				|  |  |      def test_logs_errors(self, logger, stdout, stderr):
 | 
	
		
			
				|  |  | -        b = MockBeat3(
 | 
	
		
			
				|  |  | +        b = MockBeat(
 | 
	
		
			
				|  |  |              app=self.app, redirect_stdouts=False, socket_timeout=None,
 | 
	
		
			
				|  |  |          )
 | 
	
		
			
				|  |  | -        b.start_scheduler()
 | 
	
		
			
				|  |  | +        b.install_sync_handler = Mock('beat.install_sync_handler')
 | 
	
		
			
				|  |  | +        b.install_sync_handler.side_effect = RuntimeError('xxx')
 | 
	
		
			
				|  |  | +        with self.assertRaises(RuntimeError):
 | 
	
		
			
				|  |  | +            b.start_scheduler()
 | 
	
		
			
				|  |  |          logger.critical.assert_called()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @patch('celery.platforms.create_pidlock')
 | 
	
		
			
				|  |  |      @mock.stdouts
 | 
	
		
			
				|  |  | -    def test_use_pidfile(self, create_pidlock, stdout, stderr):
 | 
	
		
			
				|  |  | -        b = MockBeat2(app=self.app, pidfile='pidfilelockfilepid',
 | 
	
		
			
				|  |  | -                      socket_timeout=None, redirect_stdouts=False)
 | 
	
		
			
				|  |  | +    def test_using_pidfile(self, create_pidlock, stdout, stderr):
 | 
	
		
			
				|  |  | +        b = MockBeat(app=self.app, pidfile='pidfilelockfilepid',
 | 
	
		
			
				|  |  | +                     socket_timeout=None, redirect_stdouts=False)
 | 
	
		
			
				|  |  | +        b.install_sync_handler = Mock(name='beat.install_sync_handler')
 | 
	
		
			
				|  |  |          b.start_scheduler()
 | 
	
		
			
				|  |  |          create_pidlock.assert_called()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class MockDaemonContext(object):
 | 
	
		
			
				|  |  | -    opened = False
 | 
	
		
			
				|  |  | -    closed = False
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def __init__(self, *args, **kwargs):
 | 
	
		
			
				|  |  | -        pass
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def open(self):
 | 
	
		
			
				|  |  | -        self.__class__.opened = True
 | 
	
		
			
				|  |  | -        return self
 | 
	
		
			
				|  |  | -    __enter__ = open
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def close(self, *args):
 | 
	
		
			
				|  |  | -        self.__class__.closed = True
 | 
	
		
			
				|  |  | -    __exit__ = close
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  class test_div(AppCase):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def setup(self):
 | 
	
		
			
				|  |  | -        self.prev, beatapp.Beat = beatapp.Beat, MockBeat
 | 
	
		
			
				|  |  | -        self.ctx, beat_bin.detached = (
 | 
	
		
			
				|  |  | -            beat_bin.detached, MockDaemonContext,
 | 
	
		
			
				|  |  | -        )
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def teardown(self):
 | 
	
		
			
				|  |  | -        beatapp.Beat = self.prev
 | 
	
		
			
				|  |  | +        self.Beat = self.app.Beat = self.patch('celery.apps.beat.Beat')
 | 
	
		
			
				|  |  | +        self.detached = self.patch('celery.bin.beat.detached')
 | 
	
		
			
				|  |  | +        self.Beat.__name__ = 'Beat'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_main(self):
 | 
	
		
			
				|  |  |          sys.argv = [sys.argv[0], '-s', 'foo']
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            beat_bin.main(app=self.app)
 | 
	
		
			
				|  |  | -            self.assertTrue(MockBeat.running)
 | 
	
		
			
				|  |  | -        finally:
 | 
	
		
			
				|  |  | -            MockBeat.running = False
 | 
	
		
			
				|  |  | +        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.assertTrue(MockDaemonContext.opened)
 | 
	
		
			
				|  |  | -        self.assertTrue(MockDaemonContext.closed)
 | 
	
		
			
				|  |  | +        self.detached.assert_called()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_parse_options(self):
 | 
	
		
			
				|  |  |          cmd = beat_bin.beat()
 |