11# -*- coding: utf-8 -*-
2- import sys
32import logging
4- import unittest2 as unittest
53import simplejson
4+ import sys
5+ import unittest2 as unittest
6+
67from StringIO import StringIO
78
89from carrot .backends .base import BaseMessage
910
1011from 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
1116from celery .log import setup_logger
17+ from celery .registry import tasks
18+ from celery .result import AsyncResult
1219from celery .task .base import Task
1320from celery .utils import gen_unique_id
14- from celery .result import AsyncResult
1521from 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
2226from celery .tests .compat import catch_warnings
27+ from celery .tests .utils import execute_context
2328
2429scratch = {"ACK" : False }
2530some_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 ()
0 commit comments