PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/celery/tests/test_events_state.py

https://github.com/rlotun/celery
Python | 289 lines | 226 code | 57 blank | 6 comment | 8 complexity | a9751fc495c1ef99123cc4d8f80a5ce6 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. from time import time
  2. import unittest2 as unittest
  3. from itertools import count
  4. from celery import states
  5. from celery.events import Event
  6. from celery.events.state import State, Worker, Task, HEARTBEAT_EXPIRE
  7. from celery.utils import gen_unique_id
  8. class replay(object):
  9. def __init__(self, state):
  10. self.state = state
  11. self.rewind()
  12. def __iter__(self):
  13. return self
  14. def next(self):
  15. try:
  16. self.state.event(self.events[self.position()])
  17. except IndexError:
  18. raise StopIteration()
  19. def rewind(self):
  20. self.position = count(0).next
  21. return self
  22. def play(self):
  23. for _ in self:
  24. pass
  25. class ev_worker_online_offline(replay):
  26. events = [
  27. Event("worker-online", hostname="utest1"),
  28. Event("worker-offline", hostname="utest1"),
  29. ]
  30. class ev_worker_heartbeats(replay):
  31. events = [
  32. Event("worker-heartbeat", hostname="utest1",
  33. timestamp=time() - HEARTBEAT_EXPIRE * 2),
  34. Event("worker-heartbeat", hostname="utest1"),
  35. ]
  36. class ev_task_states(replay):
  37. uuid = gen_unique_id()
  38. events = [
  39. Event("task-received", uuid=uuid, name="task1",
  40. args="(2, 2)", kwargs="{'foo': 'bar'}",
  41. retries=0, eta=None, hostname="utest1"),
  42. Event("task-started", uuid=uuid, hostname="utest1"),
  43. Event("task-revoked", uuid=uuid, hostname="utest1"),
  44. Event("task-retried", uuid=uuid, exception="KeyError('bar')",
  45. traceback="line 2 at main", hostname="utest1"),
  46. Event("task-failed", uuid=uuid, exception="KeyError('foo')",
  47. traceback="line 1 at main", hostname="utest1"),
  48. Event("task-succeeded", uuid=uuid, result="4",
  49. runtime=0.1234, hostname="utest1"),
  50. ]
  51. class ev_snapshot(replay):
  52. events = [
  53. Event("worker-online", hostname="utest1"),
  54. Event("worker-online", hostname="utest2"),
  55. Event("worker-online", hostname="utest3"),
  56. ]
  57. for i in range(20):
  58. worker = not i % 2 and "utest2" or "utest1"
  59. type = not i % 2 and "task2" or "task1"
  60. events.append(Event("task-received", name=type,
  61. uuid=gen_unique_id(), hostname=worker))
  62. class test_Worker(unittest.TestCase):
  63. def test_survives_missing_timestamp(self):
  64. worker = Worker(hostname="foo")
  65. worker.on_heartbeat(timestamp=None)
  66. self.assertEqual(worker.heartbeats, [])
  67. class test_Task(unittest.TestCase):
  68. def test_info(self):
  69. task = Task(uuid="abcdefg",
  70. name="tasks.add",
  71. args="(2, 2)",
  72. kwargs="{}",
  73. retries=2,
  74. result=42,
  75. eta=1,
  76. runtime=0.0001,
  77. expires=1,
  78. exception=1,
  79. received=time() - 10,
  80. started=time() - 8,
  81. succeeded=time())
  82. self.assertItemsEqual(list(task._info_fields),
  83. task.info().keys())
  84. self.assertItemsEqual(list(task._info_fields + ("received", )),
  85. task.info(extra=("received", )))
  86. self.assertItemsEqual(["args", "kwargs"],
  87. task.info(["args", "kwargs"]).keys())
  88. def test_ready(self):
  89. task = Task(uuid="abcdefg",
  90. name="tasks.add")
  91. task.on_received(timestamp=time())
  92. self.assertFalse(task.ready)
  93. task.on_succeeded(timestamp=time())
  94. self.assertTrue(task.ready)
  95. class test_State(unittest.TestCase):
  96. def test_repr(self):
  97. self.assertTrue(repr(State()))
  98. def test_worker_online_offline(self):
  99. r = ev_worker_online_offline(State())
  100. r.next()
  101. self.assertTrue(r.state.alive_workers())
  102. self.assertTrue(r.state.workers["utest1"].alive)
  103. r.play()
  104. self.assertFalse(r.state.alive_workers())
  105. self.assertFalse(r.state.workers["utest1"].alive)
  106. def test_worker_heartbeat_expire(self):
  107. r = ev_worker_heartbeats(State())
  108. r.next()
  109. self.assertFalse(r.state.alive_workers())
  110. self.assertFalse(r.state.workers["utest1"].alive)
  111. r.play()
  112. self.assertTrue(r.state.alive_workers())
  113. self.assertTrue(r.state.workers["utest1"].alive)
  114. def test_task_states(self):
  115. r = ev_task_states(State())
  116. # RECEIVED
  117. r.next()
  118. self.assertTrue(r.uuid in r.state.tasks)
  119. task = r.state.tasks[r.uuid]
  120. self.assertEqual(task.state, states.RECEIVED)
  121. self.assertTrue(task.received)
  122. self.assertEqual(task.timestamp, task.received)
  123. self.assertEqual(task.worker.hostname, "utest1")
  124. # STARTED
  125. r.next()
  126. self.assertTrue(r.state.workers["utest1"].alive,
  127. "any task event adds worker heartbeat")
  128. self.assertEqual(task.state, states.STARTED)
  129. self.assertTrue(task.started)
  130. self.assertEqual(task.timestamp, task.started)
  131. self.assertEqual(task.worker.hostname, "utest1")
  132. # REVOKED
  133. r.next()
  134. self.assertEqual(task.state, states.REVOKED)
  135. self.assertTrue(task.revoked)
  136. self.assertEqual(task.timestamp, task.revoked)
  137. self.assertEqual(task.worker.hostname, "utest1")
  138. # RETRY
  139. r.next()
  140. self.assertEqual(task.state, states.RETRY)
  141. self.assertTrue(task.retried)
  142. self.assertEqual(task.timestamp, task.retried)
  143. self.assertEqual(task.worker.hostname, "utest1")
  144. self.assertEqual(task.exception, "KeyError('bar')")
  145. self.assertEqual(task.traceback, "line 2 at main")
  146. # FAILURE
  147. r.next()
  148. self.assertEqual(task.state, states.FAILURE)
  149. self.assertTrue(task.failed)
  150. self.assertEqual(task.timestamp, task.failed)
  151. self.assertEqual(task.worker.hostname, "utest1")
  152. self.assertEqual(task.exception, "KeyError('foo')")
  153. self.assertEqual(task.traceback, "line 1 at main")
  154. # SUCCESS
  155. r.next()
  156. self.assertEqual(task.state, states.SUCCESS)
  157. self.assertTrue(task.succeeded)
  158. self.assertEqual(task.timestamp, task.succeeded)
  159. self.assertEqual(task.worker.hostname, "utest1")
  160. self.assertEqual(task.result, "4")
  161. self.assertEqual(task.runtime, 0.1234)
  162. def assertStateEmpty(self, state):
  163. self.assertFalse(state.tasks)
  164. self.assertFalse(state.workers)
  165. self.assertFalse(state.event_count)
  166. self.assertFalse(state.task_count)
  167. def assertState(self, state):
  168. self.assertTrue(state.tasks)
  169. self.assertTrue(state.workers)
  170. self.assertTrue(state.event_count)
  171. self.assertTrue(state.task_count)
  172. def test_freeze_while(self):
  173. s = State()
  174. r = ev_snapshot(s)
  175. r.play()
  176. def work():
  177. pass
  178. s.freeze_while(work, clear_after=True)
  179. self.assertFalse(s.event_count)
  180. def test_clear(self):
  181. r = ev_snapshot(State())
  182. r.play()
  183. self.assertTrue(r.state.event_count)
  184. self.assertTrue(r.state.workers)
  185. self.assertTrue(r.state.tasks)
  186. self.assertTrue(r.state.task_count)
  187. r.state.clear()
  188. self.assertFalse(r.state.event_count)
  189. self.assertFalse(r.state.workers)
  190. self.assertTrue(r.state.tasks)
  191. self.assertFalse(r.state.task_count)
  192. r.state.clear(False)
  193. self.assertFalse(r.state.tasks)
  194. def test_task_types(self):
  195. r = ev_snapshot(State())
  196. r.play()
  197. self.assertItemsEqual(r.state.task_types(), ["task1", "task2"])
  198. def test_tasks_by_timestamp(self):
  199. r = ev_snapshot(State())
  200. r.play()
  201. self.assertEqual(len(r.state.tasks_by_timestamp()), 20)
  202. def test_tasks_by_type(self):
  203. r = ev_snapshot(State())
  204. r.play()
  205. self.assertEqual(len(r.state.tasks_by_type("task1")), 10)
  206. self.assertEqual(len(r.state.tasks_by_type("task2")), 10)
  207. def test_alive_workers(self):
  208. r = ev_snapshot(State())
  209. r.play()
  210. self.assertEqual(len(r.state.alive_workers()), 3)
  211. def test_tasks_by_worker(self):
  212. r = ev_snapshot(State())
  213. r.play()
  214. self.assertEqual(len(r.state.tasks_by_worker("utest1")), 10)
  215. self.assertEqual(len(r.state.tasks_by_worker("utest2")), 10)
  216. def test_survives_unknown_worker_event(self):
  217. s = State()
  218. s.worker_event("worker-unknown-event-xxx", {"foo": "bar"})
  219. s.worker_event("worker-unknown-event-xxx", {"hostname": "xxx",
  220. "foo": "bar"})
  221. def test_survives_unknown_task_event(self):
  222. s = State()
  223. s.task_event("task-unknown-event-xxx", {"foo": "bar",
  224. "uuid": "x",
  225. "hostname": "y"})
  226. def test_callback(self):
  227. scratch = {}
  228. def callback(state, event):
  229. scratch["recv"] = True
  230. s = State(callback=callback)
  231. s.event({"type": "worker-online"})
  232. self.assertTrue(scratch.get("recv"))