11import socket
22import unittest2 as unittest
33
4+ from celery import conf
5+ from celery .decorators import task
6+ from celery .registry import tasks
47from celery .task .builtins import PingTask
58from celery .utils import gen_unique_id
69from celery .worker import control
10+ from celery .worker .buckets import FastQueue
711from celery .worker .revoke import revoked
8- from celery .registry import tasks
12+ from celery .worker . scheduler import Scheduler
913
1014hostname = socket .gethostname ()
1115
1216
13- class TestControlPanel (unittest .TestCase ):
17+ @task (rate_limit = 200 ) # for extra info in dump_tasks
18+ def mytask ():
19+ pass
20+
21+
22+ class Dispatcher (object ):
23+
24+ def __init__ (self , * args , ** kwargs ):
25+ self .sent = []
26+
27+ def enable (self ):
28+ self .enabled = True
29+
30+ def disable (self ):
31+ self .enabled = False
32+
33+ def send (self , event ):
34+ self .sent .append (event )
35+
36+
37+ class Listener (object ):
38+
39+ def __init__ (self ):
40+ self .ready_queue = FastQueue ()
41+ self .ready_queue .put ("the quick brown fox" )
42+ self .eta_schedule = Scheduler (self .ready_queue )
43+ self .event_dispatcher = Dispatcher ()
44+
45+
46+ class test_ControlPanel (unittest .TestCase ):
1447
1548 def setUp (self ):
16- self .panel = self .create_panel (listener = object ())
49+ self .panel = self .create_panel (listener = Listener ())
1750
1851 def create_panel (self , ** kwargs ):
1952 return control .ControlDispatch (hostname = hostname , ** kwargs )
2053
54+ def test_disable_events (self ):
55+ listener = Listener ()
56+ panel = self .create_panel (listener = listener )
57+ panel .execute ("disable_events" )
58+ self .assertEqual (listener .event_dispatcher .enabled , False )
59+ self .assertIn ("worker-offline" , listener .event_dispatcher .sent )
60+
61+ def test_enable_events (self ):
62+ listener = Listener ()
63+ panel = self .create_panel (listener = listener )
64+ panel .execute ("enable_events" )
65+ self .assertEqual (listener .event_dispatcher .enabled , True )
66+ self .assertIn ("worker-online" , listener .event_dispatcher .sent )
67+
2168 def test_dump_tasks (self ):
22- self .panel .execute ("dump_tasks" )
69+ tasks = "\n " .join (self .panel .execute ("dump_tasks" ))
70+ self .assertIn ("mytask" , tasks )
71+ self .assertIn ("rate_limit=200" , tasks )
72+
73+ def test_dump_schedule (self ):
74+ listener = Listener ()
75+ panel = self .create_panel (listener = listener )
76+ self .assertFalse (panel .execute ("dump_schedule" ))
77+ listener .eta_schedule .enter ("foo" , eta = 100 )
78+ self .assertTrue (panel .execute ("dump_schedule" ))
79+
80+ def test_dump_reserved (self ):
81+ listener = Listener ()
82+ panel = self .create_panel (listener = listener )
83+ tasks = "\n " .join (panel .execute ("dump_reserved" ))
84+ self .assertIn ("the quick brown fox" , tasks )
85+ listener .ready_queue = FastQueue ()
86+ tasks = "\n " .join (panel .execute ("dump_reserved" ))
87+ self .assertFalse (tasks )
88+
89+ def test_dump_reserved (self ):
90+ self .panel .execute ("dump_reserved" )
91+
92+ def test_rate_limit_when_disabled (self ):
93+ conf .DISABLE_RATE_LIMITS = True
94+ try :
95+ e = self .panel .execute ("rate_limit" , kwargs = dict (
96+ task_name = mytask .name , rate_limit = "100/m" ))
97+ self .assertIn ("rate limits disabled" , e .get ("error" ))
98+ finally :
99+ conf .DISABLE_RATE_LIMITS = False
100+
101+ def test_rate_limit_invalid_rate_limit_string (self ):
102+ e = self .panel .execute ("rate_limit" , kwargs = dict (
103+ task_name = "tasks.add" , rate_limit = "x1240301#%!" ))
104+ self .assertIn ("Invalid rate limit string" , e .get ("error" ))
23105
24106 def test_rate_limit (self ):
25107
@@ -60,6 +142,24 @@ def test_rate_limit_nonexistant_task(self):
60142 def test_unexposed_command (self ):
61143 self .panel .execute ("foo" , kwargs = {})
62144
145+ def test_revoke_with_name (self ):
146+ uuid = gen_unique_id ()
147+ m = {"command" : "revoke" ,
148+ "destination" : hostname ,
149+ "task_id" : uuid ,
150+ "task_name" : mytask .name }
151+ self .panel .dispatch_from_message (m )
152+ self .assertIn (uuid , revoked )
153+
154+ def test_revoke_with_name_not_in_registry (self ):
155+ uuid = gen_unique_id ()
156+ m = {"command" : "revoke" ,
157+ "destination" : hostname ,
158+ "task_id" : uuid ,
159+ "task_name" : "xxxxxxxxx33333333388888" }
160+ self .panel .dispatch_from_message (m )
161+ self .assertIn (uuid , revoked )
162+
63163 def test_revoke (self ):
64164 uuid = gen_unique_id ()
65165 m = {"command" : "revoke" ,
@@ -73,3 +173,14 @@ def test_revoke(self):
73173 "task_id" : uuid + "xxx" }
74174 self .panel .dispatch_from_message (m )
75175 self .assertNotIn (uuid + "xxx" , revoked )
176+
177+ def test_ping (self ):
178+ m = {"command" : "ping" ,
179+ "destination" : hostname }
180+ r = self .panel .dispatch_from_message (m )
181+ self .assertEqual (r , "pong" )
182+
183+ def test_shutdown (self ):
184+ m = {"command" : "shutdown" ,
185+ "destination" : hostname }
186+ self .assertRaises (SystemExit , self .panel .dispatch_from_message , m )
0 commit comments