|  | @@ -7,15 +7,13 @@ from mock import Mock, call, patch
 | 
	
		
			
				|  |  |  from nose import SkipTest
 | 
	
		
			
				|  |  |  from pickle import dumps, loads
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -from celery import current_app
 | 
	
		
			
				|  |  |  from celery import beat
 | 
	
		
			
				|  |  |  from celery import task
 | 
	
		
			
				|  |  |  from celery.five import keys, string_t
 | 
	
		
			
				|  |  |  from celery.result import AsyncResult
 | 
	
		
			
				|  |  |  from celery.schedules import schedule
 | 
	
		
			
				|  |  | -from celery.task.base import Task
 | 
	
		
			
				|  |  |  from celery.utils import uuid
 | 
	
		
			
				|  |  | -from celery.tests.utils import Case, patch_settings
 | 
	
		
			
				|  |  | +from celery.tests.utils import AppCase, patch_settings
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class Object(object):
 | 
	
	
		
			
				|  | @@ -47,7 +45,7 @@ class MockService(object):
 | 
	
		
			
				|  |  |          self.stopped = True
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class test_ScheduleEntry(Case):
 | 
	
		
			
				|  |  | +class test_ScheduleEntry(AppCase):
 | 
	
		
			
				|  |  |      Entry = beat.ScheduleEntry
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def create_entry(self, **kwargs):
 | 
	
	
		
			
				|  | @@ -113,7 +111,7 @@ class mScheduler(beat.Scheduler):
 | 
	
		
			
				|  |  |                            'args': args,
 | 
	
		
			
				|  |  |                            'kwargs': kwargs,
 | 
	
		
			
				|  |  |                            'options': options})
 | 
	
		
			
				|  |  | -        return AsyncResult(uuid())
 | 
	
		
			
				|  |  | +        return AsyncResult(uuid(), app=self.app)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class mSchedulerSchedulingError(mScheduler):
 | 
	
	
		
			
				|  | @@ -144,17 +142,17 @@ always_due = mocked_schedule(True, 1)
 | 
	
		
			
				|  |  |  always_pending = mocked_schedule(False, 1)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class test_Scheduler(Case):
 | 
	
		
			
				|  |  | +class test_Scheduler(AppCase):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_custom_schedule_dict(self):
 | 
	
		
			
				|  |  |          custom = {'foo': 'bar'}
 | 
	
		
			
				|  |  | -        scheduler = mScheduler(schedule=custom, lazy=True)
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app, schedule=custom, lazy=True)
 | 
	
		
			
				|  |  |          self.assertIs(scheduler.data, custom)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_apply_async_uses_registered_task_instances(self):
 | 
	
		
			
				|  |  |          through_task = [False]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        class MockTask(Task):
 | 
	
		
			
				|  |  | +        class MockTask(self.app.Task):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              @classmethod
 | 
	
		
			
				|  |  |              def apply_async(cls, *args, **kwargs):
 | 
	
	
		
			
				|  | @@ -162,7 +160,7 @@ class test_Scheduler(Case):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          assert MockTask.name in MockTask._get_app().tasks
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        scheduler = mScheduler()
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          scheduler.apply_async(scheduler.Entry(task=MockTask.name))
 | 
	
		
			
				|  |  |          self.assertTrue(through_task[0])
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -173,7 +171,7 @@ class test_Scheduler(Case):
 | 
	
		
			
				|  |  |              pass
 | 
	
		
			
				|  |  |          not_sync.apply_async = Mock()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        s = mScheduler()
 | 
	
		
			
				|  |  | +        s = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          s._do_sync = Mock()
 | 
	
		
			
				|  |  |          s.should_sync = Mock()
 | 
	
		
			
				|  |  |          s.should_sync.return_value = True
 | 
	
	
		
			
				|  | @@ -187,16 +185,16 @@ class test_Scheduler(Case):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @patch('celery.app.base.Celery.send_task')
 | 
	
		
			
				|  |  |      def test_send_task(self, send_task):
 | 
	
		
			
				|  |  | -        b = beat.Scheduler()
 | 
	
		
			
				|  |  | +        b = beat.Scheduler(app=self.app)
 | 
	
		
			
				|  |  |          b.send_task('tasks.add', countdown=10)
 | 
	
		
			
				|  |  |          send_task.assert_called_with('tasks.add', countdown=10)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_info(self):
 | 
	
		
			
				|  |  | -        scheduler = mScheduler()
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          self.assertIsInstance(scheduler.info, string_t)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_maybe_entry(self):
 | 
	
		
			
				|  |  | -        s = mScheduler()
 | 
	
		
			
				|  |  | +        s = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          entry = s.Entry(name='add every', task='tasks.add')
 | 
	
		
			
				|  |  |          self.assertIs(s._maybe_entry(entry.name, entry), entry)
 | 
	
		
			
				|  |  |          self.assertTrue(s._maybe_entry('add every', {
 | 
	
	
		
			
				|  | @@ -204,13 +202,13 @@ class test_Scheduler(Case):
 | 
	
		
			
				|  |  |          }))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_set_schedule(self):
 | 
	
		
			
				|  |  | -        s = mScheduler()
 | 
	
		
			
				|  |  | +        s = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          s.schedule = {'foo': 'bar'}
 | 
	
		
			
				|  |  |          self.assertEqual(s.data, {'foo': 'bar'})
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @patch('kombu.connection.Connection.ensure_connection')
 | 
	
		
			
				|  |  |      def test_ensure_connection_error_handler(self, ensure):
 | 
	
		
			
				|  |  | -        s = mScheduler()
 | 
	
		
			
				|  |  | +        s = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          self.assertTrue(s._ensure_connected())
 | 
	
		
			
				|  |  |          self.assertTrue(ensure.called)
 | 
	
		
			
				|  |  |          callback = ensure.call_args[0][0]
 | 
	
	
		
			
				|  | @@ -218,29 +216,32 @@ class test_Scheduler(Case):
 | 
	
		
			
				|  |  |          callback(KeyError(), 5)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_install_default_entries(self):
 | 
	
		
			
				|  |  | -        with patch_settings(CELERY_TASK_RESULT_EXPIRES=None,
 | 
	
		
			
				|  |  | +        with patch_settings(self.app,
 | 
	
		
			
				|  |  | +                            CELERY_TASK_RESULT_EXPIRES=None,
 | 
	
		
			
				|  |  |                              CELERYBEAT_SCHEDULE={}):
 | 
	
		
			
				|  |  | -            s = mScheduler()
 | 
	
		
			
				|  |  | +            s = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |              s.install_default_entries({})
 | 
	
		
			
				|  |  |              self.assertNotIn('celery.backend_cleanup', s.data)
 | 
	
		
			
				|  |  | -        current_app.backend.supports_autoexpire = False
 | 
	
		
			
				|  |  | -        with patch_settings(CELERY_TASK_RESULT_EXPIRES=30,
 | 
	
		
			
				|  |  | +        self.app.backend.supports_autoexpire = False
 | 
	
		
			
				|  |  | +        with patch_settings(self.app,
 | 
	
		
			
				|  |  | +                            CELERY_TASK_RESULT_EXPIRES=30,
 | 
	
		
			
				|  |  |                              CELERYBEAT_SCHEDULE={}):
 | 
	
		
			
				|  |  | -            s = mScheduler()
 | 
	
		
			
				|  |  | +            s = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |              s.install_default_entries({})
 | 
	
		
			
				|  |  |              self.assertIn('celery.backend_cleanup', s.data)
 | 
	
		
			
				|  |  | -        current_app.backend.supports_autoexpire = True
 | 
	
		
			
				|  |  | +        self.app.backend.supports_autoexpire = True
 | 
	
		
			
				|  |  |          try:
 | 
	
		
			
				|  |  | -            with patch_settings(CELERY_TASK_RESULT_EXPIRES=31,
 | 
	
		
			
				|  |  | +            with patch_settings(self.app,
 | 
	
		
			
				|  |  | +                                CELERY_TASK_RESULT_EXPIRES=31,
 | 
	
		
			
				|  |  |                                  CELERYBEAT_SCHEDULE={}):
 | 
	
		
			
				|  |  | -                s = mScheduler()
 | 
	
		
			
				|  |  | +                s = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |                  s.install_default_entries({})
 | 
	
		
			
				|  |  |                  self.assertNotIn('celery.backend_cleanup', s.data)
 | 
	
		
			
				|  |  |          finally:
 | 
	
		
			
				|  |  | -            current_app.backend.supports_autoexpire = False
 | 
	
		
			
				|  |  | +            self.app.backend.supports_autoexpire = False
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_due_tick(self):
 | 
	
		
			
				|  |  | -        scheduler = mScheduler()
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          scheduler.add(name='test_due_tick',
 | 
	
		
			
				|  |  |                        schedule=always_due,
 | 
	
		
			
				|  |  |                        args=(1, 2),
 | 
	
	
		
			
				|  | @@ -249,33 +250,33 @@ class test_Scheduler(Case):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @patch('celery.beat.error')
 | 
	
		
			
				|  |  |      def test_due_tick_SchedulingError(self, error):
 | 
	
		
			
				|  |  | -        scheduler = mSchedulerSchedulingError()
 | 
	
		
			
				|  |  | +        scheduler = mSchedulerSchedulingError(app=self.app)
 | 
	
		
			
				|  |  |          scheduler.add(name='test_due_tick_SchedulingError',
 | 
	
		
			
				|  |  |                        schedule=always_due)
 | 
	
		
			
				|  |  |          self.assertEqual(scheduler.tick(), 1)
 | 
	
		
			
				|  |  |          self.assertTrue(error.called)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_due_tick_RuntimeError(self):
 | 
	
		
			
				|  |  | -        scheduler = mSchedulerRuntimeError()
 | 
	
		
			
				|  |  | +        scheduler = mSchedulerRuntimeError(app=self.app)
 | 
	
		
			
				|  |  |          scheduler.add(name='test_due_tick_RuntimeError',
 | 
	
		
			
				|  |  |                        schedule=always_due)
 | 
	
		
			
				|  |  |          self.assertEqual(scheduler.tick(), scheduler.max_interval)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_pending_tick(self):
 | 
	
		
			
				|  |  | -        scheduler = mScheduler()
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          scheduler.add(name='test_pending_tick',
 | 
	
		
			
				|  |  |                        schedule=always_pending)
 | 
	
		
			
				|  |  |          self.assertEqual(scheduler.tick(), 1)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_honors_max_interval(self):
 | 
	
		
			
				|  |  | -        scheduler = mScheduler()
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          maxi = scheduler.max_interval
 | 
	
		
			
				|  |  |          scheduler.add(name='test_honors_max_interval',
 | 
	
		
			
				|  |  |                        schedule=mocked_schedule(False, maxi * 4))
 | 
	
		
			
				|  |  |          self.assertEqual(scheduler.tick(), maxi)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_ticks(self):
 | 
	
		
			
				|  |  | -        scheduler = mScheduler()
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          nums = [600, 300, 650, 120, 250, 36]
 | 
	
		
			
				|  |  |          s = dict(('test_ticks%s' % i,
 | 
	
		
			
				|  |  |                   {'schedule': mocked_schedule(False, j)})
 | 
	
	
		
			
				|  | @@ -284,20 +285,20 @@ class test_Scheduler(Case):
 | 
	
		
			
				|  |  |          self.assertEqual(scheduler.tick(), min(nums))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_schedule_no_remain(self):
 | 
	
		
			
				|  |  | -        scheduler = mScheduler()
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          scheduler.add(name='test_schedule_no_remain',
 | 
	
		
			
				|  |  |                        schedule=mocked_schedule(False, None))
 | 
	
		
			
				|  |  |          self.assertEqual(scheduler.tick(), scheduler.max_interval)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_interface(self):
 | 
	
		
			
				|  |  | -        scheduler = mScheduler()
 | 
	
		
			
				|  |  | +        scheduler = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          scheduler.sync()
 | 
	
		
			
				|  |  |          scheduler.setup_schedule()
 | 
	
		
			
				|  |  |          scheduler.close()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_merge_inplace(self):
 | 
	
		
			
				|  |  | -        a = mScheduler()
 | 
	
		
			
				|  |  | -        b = mScheduler()
 | 
	
		
			
				|  |  | +        a = mScheduler(app=self.app)
 | 
	
		
			
				|  |  | +        b = mScheduler(app=self.app)
 | 
	
		
			
				|  |  |          a.update_from_dict({'foo': {'schedule': mocked_schedule(True, 10)},
 | 
	
		
			
				|  |  |                              'bar': {'schedule': mocked_schedule(True, 20)}})
 | 
	
		
			
				|  |  |          b.update_from_dict({'bar': {'schedule': mocked_schedule(True, 40)},
 | 
	
	
		
			
				|  | @@ -330,11 +331,12 @@ def create_persistent_scheduler(shelv=None):
 | 
	
		
			
				|  |  |      return MockPersistentScheduler, shelv
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class test_PersistentScheduler(Case):
 | 
	
		
			
				|  |  | +class test_PersistentScheduler(AppCase):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @patch('os.remove')
 | 
	
		
			
				|  |  |      def test_remove_db(self, remove):
 | 
	
		
			
				|  |  | -        s = create_persistent_scheduler()[0](schedule_filename='schedule')
 | 
	
		
			
				|  |  | +        s = create_persistent_scheduler()[0](app=self.app,
 | 
	
		
			
				|  |  | +                                             schedule_filename='schedule')
 | 
	
		
			
				|  |  |          s._remove_db()
 | 
	
		
			
				|  |  |          remove.assert_has_calls(
 | 
	
		
			
				|  |  |              [call('schedule' + suffix) for suffix in s.known_suffixes]
 | 
	
	
		
			
				|  | @@ -348,7 +350,8 @@ class test_PersistentScheduler(Case):
 | 
	
		
			
				|  |  |              s._remove_db()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_setup_schedule(self):
 | 
	
		
			
				|  |  | -        s = create_persistent_scheduler()[0](schedule_filename='schedule')
 | 
	
		
			
				|  |  | +        s = create_persistent_scheduler()[0](app=self.app,
 | 
	
		
			
				|  |  | +                                             schedule_filename='schedule')
 | 
	
		
			
				|  |  |          opens = s.persistence.open = Mock()
 | 
	
		
			
				|  |  |          s._remove_db = Mock()
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -383,14 +386,14 @@ class test_PersistentScheduler(Case):
 | 
	
		
			
				|  |  |          self.assertDictEqual(s._store['entries'], s.schedule)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class test_Service(Case):
 | 
	
		
			
				|  |  | +class test_Service(AppCase):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def get_service(self):
 | 
	
		
			
				|  |  |          Scheduler, mock_shelve = create_persistent_scheduler()
 | 
	
		
			
				|  |  | -        return beat.Service(scheduler_cls=Scheduler), mock_shelve
 | 
	
		
			
				|  |  | +        return beat.Service(app=self.app, scheduler_cls=Scheduler), mock_shelve
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_pickleable(self):
 | 
	
		
			
				|  |  | -        s = beat.Service(scheduler_cls=Mock)
 | 
	
		
			
				|  |  | +        s = beat.Service(app=self.app, scheduler_cls=Mock)
 | 
	
		
			
				|  |  |          self.assertTrue(loads(dumps(s)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_start(self):
 | 
	
	
		
			
				|  | @@ -442,7 +445,7 @@ class test_Service(Case):
 | 
	
		
			
				|  |  |          self.assertTrue(s._is_shutdown.isSet())
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class test_EmbeddedService(Case):
 | 
	
		
			
				|  |  | +class test_EmbeddedService(AppCase):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_start_stop_process(self):
 | 
	
		
			
				|  |  |          try:
 |