Skip to content

Commit baa329b

Browse files
author
Ask Solem
committed
100% coverage for celery.worker.job
1 parent 5d91eaa commit baa329b

File tree

3 files changed

+127
-18
lines changed

3 files changed

+127
-18
lines changed

celery/task/builtins.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ class DeleteExpiredTaskMetaTask(PeriodicTask):
1919
def run(self, **kwargs):
2020
""":returns: None"""
2121
logger = self.get_logger(**kwargs)
22-
logger.info("Deleting expired task meta objects...")
23-
default_backend.cleanup()
22+
logger.info("Deleting expired task results...")
23+
self.backend.cleanup()
2424

2525

2626
class PingTask(Task):

celery/tests/test_worker_job.py

Lines changed: 124 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
# -*- coding: utf-8 -*-
2-
import sys
32
import logging
4-
import unittest2 as unittest
53
import simplejson
4+
import sys
5+
import unittest2 as unittest
6+
67
from StringIO import StringIO
78

89
from carrot.backends.base import BaseMessage
910

1011
from celery import states
12+
from celery.backends import default_backend
13+
from celery.datastructures import ExceptionInfo
14+
from celery.decorators import task as task_dec
15+
from celery.exceptions import RetryTaskError, NotRegistered
1116
from celery.log import setup_logger
17+
from celery.registry import tasks
18+
from celery.result import AsyncResult
1219
from celery.task.base import Task
1320
from celery.utils import gen_unique_id
14-
from celery.result import AsyncResult
1521
from celery.worker.job import WorkerTaskTrace, TaskRequest
16-
from celery.backends import default_backend
17-
from celery.exceptions import RetryTaskError, NotRegistered
18-
from celery.decorators import task as task_dec
19-
from celery.datastructures import ExceptionInfo
22+
from celery.worker.job import execute_and_trace, AlreadyExecutedError
23+
from celery.worker.job import InvalidTaskError
24+
from celery.worker.revoke import revoked
2025

21-
from celery.tests.utils import execute_context
2226
from celery.tests.compat import catch_warnings
27+
from celery.tests.utils import execute_context
2328

2429
scratch = {"ACK": False}
2530
some_kwargs_scratchpad = {}
@@ -61,7 +66,7 @@ def mytask_raising(i, **kwargs):
6166
raise KeyError(i)
6267

6368

64-
class TestRetryTaskError(unittest.TestCase):
69+
class test_RetryTaskError(unittest.TestCase):
6570

6671
def test_retry_task_error(self):
6772
try:
@@ -72,12 +77,19 @@ def test_retry_task_error(self):
7277
self.assertEqual(ret.exc, exc)
7378

7479

75-
class TestJail(unittest.TestCase):
80+
class test_WorkerTaskTrace(unittest.TestCase):
7681

7782
def test_execute_jail_success(self):
7883
ret = jail(gen_unique_id(), mytask.name, [2], {})
7984
self.assertEqual(ret, 4)
8085

86+
def test_marked_as_started(self):
87+
mytask.track_started = True
88+
try:
89+
ret = jail(gen_unique_id(), mytask.name, [2], {})
90+
finally:
91+
mytask.track_started = False
92+
8193
def test_execute_jail_failure(self):
8294
ret = jail(gen_unique_id(), mytask_raising.name,
8395
[4], {})
@@ -101,7 +113,7 @@ def send(self, event):
101113
self.sent.append(event)
102114

103115

104-
class TestTaskRequest(unittest.TestCase):
116+
class test_TaskRequest(unittest.TestCase):
105117

106118
def test_task_wrapper_repr(self):
107119
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
@@ -144,13 +156,112 @@ def mock_mail_admins(*args, **kwargs):
144156
job.mail_admins = old_mail_admins
145157
conf.CELERY_SEND_TASK_ERROR_EMAILS = old_enable_mails
146158

159+
def test_already_revoked(self):
160+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
161+
tw._already_revoked = True
162+
self.assertTrue(tw.revoked())
163+
164+
def test_revoked(self):
165+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
166+
revoked.add(tw.task_id)
167+
self.assertTrue(tw.revoked())
168+
self.assertTrue(tw._already_revoked)
169+
self.assertTrue(tw.acknowledged)
170+
171+
def test_execute_does_not_execute_revoked(self):
172+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
173+
revoked.add(tw.task_id)
174+
tw.execute()
175+
176+
def test_execute_acks_late(self):
177+
mytask_raising.acks_late = True
178+
tw = TaskRequest(mytask_raising.name, gen_unique_id(), [1], {"f": "x"})
179+
try:
180+
tw.execute()
181+
self.assertTrue(tw.acknowledged)
182+
finally:
183+
mytask_raising.acks_late = False
184+
185+
def test_execute_using_pool_does_not_execute_revoked(self):
186+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
187+
revoked.add(tw.task_id)
188+
tw.execute_using_pool(None)
189+
190+
def test_on_accepted_acks_early(self):
191+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
192+
tw.on_accepted()
193+
self.assertTrue(tw.acknowledged)
194+
195+
def test_on_accepted_acks_late(self):
196+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
197+
mytask.acks_late = True
198+
try:
199+
tw.on_accepted()
200+
self.assertFalse(tw.acknowledged)
201+
finally:
202+
mytask.acks_late = False
203+
204+
def test_on_success_acks_early(self):
205+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
206+
tw.time_start = 1
207+
tw.on_success(42)
208+
self.assertFalse(tw.acknowledged)
209+
210+
def test_on_success_acks_late(self):
211+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
212+
tw.time_start = 1
213+
mytask.acks_late = True
214+
try:
215+
tw.on_success(42)
216+
self.assertTrue(tw.acknowledged)
217+
finally:
218+
mytask.acks_late = False
219+
220+
def test_on_failure_acks_late(self):
221+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
222+
tw.time_start = 1
223+
mytask.acks_late = True
224+
try:
225+
try:
226+
raise KeyError("foo")
227+
except KeyError:
228+
exc_info = ExceptionInfo(sys.exc_info())
229+
tw.on_failure(exc_info)
230+
self.assertTrue(tw.acknowledged)
231+
finally:
232+
mytask.acks_late = False
233+
234+
def test_from_message_invalid_kwargs(self):
235+
message_data = dict(task="foo", id=1, args=(), kwargs="foo")
236+
self.assertRaises(InvalidTaskError, TaskRequest.from_message, None,
237+
message_data)
238+
239+
def test_on_timeout(self):
240+
241+
class MockLogger(object):
242+
243+
def __init__(self):
244+
self.warnings = []
245+
self.errors = []
246+
247+
def warning(self, msg, *args, **kwargs):
248+
self.warnings.append(msg)
249+
250+
def error(self, msg, *args, **kwargs):
251+
self.errors.append(msg)
252+
253+
tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
254+
tw.logger = MockLogger()
255+
tw.on_timeout(soft=True)
256+
self.assertIn("Soft time limit exceeded", tw.logger.warnings[0])
257+
tw.on_timeout(soft=False)
258+
self.assertIn("Hard time limit exceeded", tw.logger.errors[0])
259+
147260
def test_execute_and_trace(self):
148-
from celery.worker.job import execute_and_trace
149261
res = execute_and_trace(mytask.name, gen_unique_id(), [4], {})
150262
self.assertEqual(res, 4 ** 4)
151263

152264
def test_execute_safe_catches_exception(self):
153-
from celery.worker.job import execute_and_trace, WorkerTaskTrace
154265
old_exec = WorkerTaskTrace.execute
155266

156267
def _error_exec(self, *args, **kwargs):
@@ -192,7 +303,6 @@ def test_worker_task_trace_handle_retry(self):
192303
self.assertEqual(mytask.backend.get_status(uuid), states.RETRY)
193304

194305
def test_worker_task_trace_handle_failure(self):
195-
from celery.worker.job import WorkerTaskTrace
196306
uuid = gen_unique_id()
197307
w = WorkerTaskTrace(mytask.name, uuid, [4], {})
198308
type_, value_, tb_ = self.create_exception(ValueError("foo"))
@@ -204,7 +314,6 @@ def test_worker_task_trace_handle_failure(self):
204314
self.assertEqual(mytask.backend.get_status(uuid), states.FAILURE)
205315

206316
def test_executed_bit(self):
207-
from celery.worker.job import AlreadyExecutedError
208317
tw = TaskRequest(mytask.name, gen_unique_id(), [], {})
209318
self.assertFalse(tw.executed)
210319
tw._set_executed_bit()

celery/worker/job.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ def revoked(self):
237237
self.logger.warn("Skipping revoked task: %s[%s]" % (
238238
self.task_name, self.task_id))
239239
self.send_event("task-revoked", uuid=self.task_id)
240-
self.on_ack()
240+
self.acknowledge()
241241
self._already_revoked = True
242242
return True
243243
return False

0 commit comments

Comments
 (0)