Skip to content

Commit 4fb9f12

Browse files
author
Ask Solem
committed
97% coverage for celery.worker.control.builtins
1 parent baa329b commit 4fb9f12

File tree

2 files changed

+115
-11
lines changed

2 files changed

+115
-11
lines changed

celery/tests/test_worker_control.py

Lines changed: 115 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,107 @@
11
import socket
22
import unittest2 as unittest
33

4+
from celery import conf
5+
from celery.decorators import task
6+
from celery.registry import tasks
47
from celery.task.builtins import PingTask
58
from celery.utils import gen_unique_id
69
from celery.worker import control
10+
from celery.worker.buckets import FastQueue
711
from celery.worker.revoke import revoked
8-
from celery.registry import tasks
12+
from celery.worker.scheduler import Scheduler
913

1014
hostname = 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)

celery/worker/control/registry.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,3 @@ def __init__(self, logger, listener, hostname=None):
1313
def register(cls, method, name=None):
1414
cls.data[name or method.__name__] = method
1515
return method
16-
17-
@classmethod
18-
def unregister(cls, name_or_method):
19-
name = name_or_method
20-
if not isinstance(name_or_method, basestring):
21-
name = name_or_method.__name__
22-
cls.data.pop(name)

0 commit comments

Comments
 (0)