|  | @@ -16,6 +16,21 @@ def foo_task(x, y, z, **kwargs):
 | 
	
		
			
				|  |  |  registry.tasks.register(foo_task, name="c.u.foo")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +class MockLogger(object):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def critical(self, *args, **kwargs):
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def info(self, *args, **kwargs):
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def error(self, *args, **kwargs):
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    def debug(self, *args, **kwargs):
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  class MockBackend(object):
 | 
	
		
			
				|  |  |      _acked = False
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -23,6 +38,39 @@ class MockBackend(object):
 | 
	
		
			
				|  |  |          self._acked = True
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +class MockPool(object):
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    def __init__(self, *args, **kwargs):
 | 
	
		
			
				|  |  | +        self.raise_regular = kwargs.get("raise_regular", False)
 | 
	
		
			
				|  |  | +        self.raise_base = kwargs.get("raise_base", False)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def apply_async(self, *args, **kwargs):
 | 
	
		
			
				|  |  | +        if self.raise_regular:
 | 
	
		
			
				|  |  | +            raise KeyError("some exception")
 | 
	
		
			
				|  |  | +        if self.raise_base:
 | 
	
		
			
				|  |  | +            raise KeyboardInterrupt("Ctrl+c")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def start(self):
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def stop(self):
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +        return True
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class MockController(object):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def __init__(self, w, *args, **kwargs):
 | 
	
		
			
				|  |  | +        self._w = w
 | 
	
		
			
				|  |  | +        self._stopped = False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def start(self):
 | 
	
		
			
				|  |  | +        self._w["started"] = True
 | 
	
		
			
				|  |  | +        self._stopped = False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def stop(self):
 | 
	
		
			
				|  |  | +        self._stopped = True
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  def create_message(backend, **data):
 | 
	
		
			
				|  |  |      data["id"] = gen_unique_id()
 | 
	
		
			
				|  |  |      return BaseMessage(backend, body=pickle.dumps(dict(**data)),
 | 
	
	
		
			
				|  | @@ -73,6 +121,16 @@ class TestAMQPListener(unittest.TestCase):
 | 
	
		
			
				|  |  |          self.assertEquals(in_bucket.execute(), 2 * 4 * 8)
 | 
	
		
			
				|  |  |          self.assertRaises(Empty, self.hold_queue.get_nowait)
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | +    def test_receieve_message_not_registered(self):
 | 
	
		
			
				|  |  | +        l = AMQPListener(self.bucket_queue, self.hold_queue, self.logger)
 | 
	
		
			
				|  |  | +        backend = MockBackend()
 | 
	
		
			
				|  |  | +        m = create_message(backend, task="x.X.31x", args=[2, 4, 8], kwargs={})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        self.assertFalse(l.receive_message(m.decode(), m))
 | 
	
		
			
				|  |  | +        self.assertRaises(Empty, self.bucket_queue.get_nowait)
 | 
	
		
			
				|  |  | +        self.assertRaises(Empty, self.hold_queue.get_nowait)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      def test_receieve_message_eta(self):
 | 
	
		
			
				|  |  |          l = AMQPListener(self.bucket_queue, self.hold_queue, self.logger)
 | 
	
		
			
				|  |  |          backend = MockBackend()
 | 
	
	
		
			
				|  | @@ -89,3 +147,66 @@ class TestAMQPListener(unittest.TestCase):
 | 
	
		
			
				|  |  |          self.assertEquals(task.task_name, "c.u.foo")
 | 
	
		
			
				|  |  |          self.assertEquals(task.execute(), 2 * 4 * 8)
 | 
	
		
			
				|  |  |          self.assertRaises(Empty, self.bucket_queue.get_nowait)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class TestWorkController(unittest.TestCase):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def setUp(self):
 | 
	
		
			
				|  |  | +        self.worker = WorkController(concurrency=1, loglevel=0,
 | 
	
		
			
				|  |  | +                                     is_detached=False)
 | 
	
		
			
				|  |  | +        self.worker.logger = MockLogger()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def test_attrs(self):
 | 
	
		
			
				|  |  | +        worker = self.worker
 | 
	
		
			
				|  |  | +        self.assertTrue(isinstance(worker.bucket_queue, Queue))
 | 
	
		
			
				|  |  | +        self.assertTrue(isinstance(worker.hold_queue, Queue))
 | 
	
		
			
				|  |  | +        self.assertTrue(worker.periodic_work_controller)
 | 
	
		
			
				|  |  | +        self.assertTrue(worker.pool)
 | 
	
		
			
				|  |  | +        self.assertTrue(worker.amqp_listener)
 | 
	
		
			
				|  |  | +        self.assertTrue(worker.mediator)
 | 
	
		
			
				|  |  | +        self.assertTrue(worker.components)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def test_safe_process_task(self):
 | 
	
		
			
				|  |  | +        worker = self.worker
 | 
	
		
			
				|  |  | +        worker.pool = MockPool()
 | 
	
		
			
				|  |  | +        backend = MockBackend()
 | 
	
		
			
				|  |  | +        m = create_message(backend, task="c.u.foo", args=[4, 8, 10],
 | 
	
		
			
				|  |  | +                           kwargs={})
 | 
	
		
			
				|  |  | +        task = TaskWrapper.from_message(m, m.decode())
 | 
	
		
			
				|  |  | +        worker.safe_process_task(task)
 | 
	
		
			
				|  |  | +        worker.pool.stop()
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    def test_safe_process_task_raise_base(self):
 | 
	
		
			
				|  |  | +        worker = self.worker
 | 
	
		
			
				|  |  | +        worker.pool = MockPool(raise_base=True)
 | 
	
		
			
				|  |  | +        backend = MockBackend()
 | 
	
		
			
				|  |  | +        m = create_message(backend, task="c.u.foo", args=[4, 8, 10],
 | 
	
		
			
				|  |  | +                           kwargs={})
 | 
	
		
			
				|  |  | +        task = TaskWrapper.from_message(m, m.decode())
 | 
	
		
			
				|  |  | +        worker.safe_process_task(task)
 | 
	
		
			
				|  |  | +        worker.pool.stop()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def test_safe_process_task_raise_regular(self):
 | 
	
		
			
				|  |  | +        worker = self.worker
 | 
	
		
			
				|  |  | +        worker.pool = MockPool(raise_regular=True)
 | 
	
		
			
				|  |  | +        backend = MockBackend()
 | 
	
		
			
				|  |  | +        m = create_message(backend, task="c.u.foo", args=[4, 8, 10],
 | 
	
		
			
				|  |  | +                           kwargs={})
 | 
	
		
			
				|  |  | +        task = TaskWrapper.from_message(m, m.decode())
 | 
	
		
			
				|  |  | +        worker.safe_process_task(task)
 | 
	
		
			
				|  |  | +        worker.pool.stop()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def test_start_stop(self):
 | 
	
		
			
				|  |  | +        worker = self.worker
 | 
	
		
			
				|  |  | +        w1 = {"started": False}
 | 
	
		
			
				|  |  | +        w2 = {"started": False}
 | 
	
		
			
				|  |  | +        w3 = {"started": False}
 | 
	
		
			
				|  |  | +        w4 = {"started": False}
 | 
	
		
			
				|  |  | +        worker.components = [MockController(w1), MockController(w2),
 | 
	
		
			
				|  |  | +                             MockController(w3), MockController(w4)]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        worker.start()
 | 
	
		
			
				|  |  | +        for w in (w1, w2, w3, w4):
 | 
	
		
			
				|  |  | +            self.assertTrue(w["started"])
 | 
	
		
			
				|  |  | +        for component in worker.components:
 | 
	
		
			
				|  |  | +            self.assertTrue(component._stopped)
 |