|
@@ -25,84 +25,40 @@ class MockDispatcherRaising(object):
|
|
raise Exception("foo")
|
|
raise Exception("foo")
|
|
|
|
|
|
|
|
|
|
-class MockHeart(Heart):
|
|
|
|
- _alive = True
|
|
|
|
- _joined = False
|
|
|
|
|
|
+class MockTimer(object):
|
|
|
|
|
|
- def isAlive(self):
|
|
|
|
- return self._alive
|
|
|
|
|
|
+ def apply_interval(self, msecs, fun, args=(), kwargs={}):
|
|
|
|
|
|
- def join(self, timeout=None):
|
|
|
|
- self._joined = True
|
|
|
|
|
|
+ class entry(tuple):
|
|
|
|
+ cancelled = False
|
|
|
|
+
|
|
|
|
+ def cancel(self):
|
|
|
|
+ self.cancelled = True
|
|
|
|
+
|
|
|
|
+ return entry((msecs, fun, args, kwargs))
|
|
|
|
|
|
|
|
|
|
class TestHeart(unittest.TestCase):
|
|
class TestHeart(unittest.TestCase):
|
|
|
|
|
|
def test_stop(self):
|
|
def test_stop(self):
|
|
|
|
+ timer = MockTimer()
|
|
eventer = MockDispatcher()
|
|
eventer = MockDispatcher()
|
|
- h = MockHeart(eventer, interval=1)
|
|
|
|
- h._state = "RUN"
|
|
|
|
|
|
+ h = Heart(timer, eventer, interval=1)
|
|
|
|
+ h.start()
|
|
|
|
+ self.assertTrue(h.tref)
|
|
h.stop()
|
|
h.stop()
|
|
- self.assertTrue(h._joined)
|
|
|
|
-
|
|
|
|
- h2 = MockHeart(eventer, interval=1)
|
|
|
|
- h2._alive = False
|
|
|
|
- h2._state = "RUN"
|
|
|
|
- h2.stop()
|
|
|
|
- self.assertFalse(h2._joined)
|
|
|
|
-
|
|
|
|
- def test_time_raises_TypeError(self):
|
|
|
|
- from celery.worker import heartbeat
|
|
|
|
-
|
|
|
|
- def raises_TypeError(exc):
|
|
|
|
- raise TypeError("x")
|
|
|
|
-
|
|
|
|
- prev_time, heartbeat.time = heartbeat.time, raises_TypeError
|
|
|
|
- try:
|
|
|
|
- eventer = MockDispatcher()
|
|
|
|
- heart = Heart(eventer, interval=0.1)
|
|
|
|
- heart.run()
|
|
|
|
- self.assertIn("worker-online", eventer.sent)
|
|
|
|
- self.assertNotIn("worker-heartbeat", eventer.sent)
|
|
|
|
-
|
|
|
|
- finally:
|
|
|
|
- heartbeat.time = prev_time
|
|
|
|
|
|
+ self.assertIsNone(h.tref)
|
|
|
|
|
|
@sleepdeprived
|
|
@sleepdeprived
|
|
def test_run_manages_cycle(self):
|
|
def test_run_manages_cycle(self):
|
|
eventer = MockDispatcher()
|
|
eventer = MockDispatcher()
|
|
- heart = Heart(eventer, interval=0.1)
|
|
|
|
|
|
+ heart = Heart(MockTimer(), eventer, interval=0.1)
|
|
eventer.heart = heart
|
|
eventer.heart = heart
|
|
- heart.run()
|
|
|
|
- self.assertEqual(heart._state, "RUN")
|
|
|
|
- self.assertTrue(heart._shutdown.isSet())
|
|
|
|
- heart._shutdown.clear()
|
|
|
|
- heart._stopped.clear()
|
|
|
|
- eventer.next_iter = 0
|
|
|
|
- heart.run()
|
|
|
|
-
|
|
|
|
- def test_run(self):
|
|
|
|
- eventer = MockDispatcher()
|
|
|
|
-
|
|
|
|
- heart = Heart(eventer, interval=1)
|
|
|
|
- heart._shutdown.set()
|
|
|
|
- heart.run()
|
|
|
|
- self.assertEqual(heart._state, "RUN")
|
|
|
|
- self.assertIn("worker-online", eventer.sent)
|
|
|
|
- self.assertIn("worker-heartbeat", eventer.sent)
|
|
|
|
- self.assertIn("worker-offline", eventer.sent)
|
|
|
|
-
|
|
|
|
- heart.stop()
|
|
|
|
|
|
+ heart.start()
|
|
|
|
+ msecs, fun, args, kwargs = tref = heart.tref
|
|
|
|
+ self.assertEqual(msecs, 0.1 * 1000)
|
|
|
|
+ self.assertEqual(tref.fun, eventer.send)
|
|
|
|
+ self.assertTrue(tref.args)
|
|
|
|
+ self.assertTrue(tref.kwargs)
|
|
heart.stop()
|
|
heart.stop()
|
|
- self.assertEqual(heart._state, "CLOSE")
|
|
|
|
-
|
|
|
|
- heart = Heart(eventer, interval=0.00001)
|
|
|
|
- heart._shutdown.set()
|
|
|
|
- for i in range(10):
|
|
|
|
- heart.run()
|
|
|
|
-
|
|
|
|
- def test_run_exception(self):
|
|
|
|
- eventer = MockDispatcherRaising()
|
|
|
|
- heart = Heart(eventer, interval=1)
|
|
|
|
- heart._shutdown.set()
|
|
|
|
- self.assertRaises(Exception, heart.run)
|
|
|
|
|
|
+ self.assertTrue(tref.cancelled)
|