2
2
import os
3
3
from pyres import ResQ , str_to_class
4
4
from pyres .job import Job
5
- from pyres .worker import Worker , JuniorWorker
5
+ from pyres .worker import Worker
6
6
class Basic (object ):
7
7
queue = 'basic'
8
8
@@ -11,7 +11,24 @@ def perform(name):
11
11
s = "name:%s" % name
12
12
print s
13
13
return s
14
+
15
+ class TestProcess (object ):
16
+ queue = 'high'
17
+
18
+ @staticmethod
19
+ def perform ():
20
+ import time
21
+ time .sleep (.5 )
22
+ return 'Done Sleeping'
23
+
24
+
25
+ class ErrorObjcet (object ):
26
+ queue = 'basic'
14
27
28
+ @staticmethod
29
+ def perform ():
30
+ raise Exception ("Could not finish job" )
31
+
15
32
def test_str_to_class ():
16
33
ret = str_to_class ('tests.Basic' )
17
34
assert ret
@@ -32,7 +49,7 @@ class ResQTests(PyResTests):
32
49
def test_enqueue (self ):
33
50
self .resq .enqueue (Basic ,"test1" )
34
51
self .resq .enqueue (Basic ,"test2" )
35
- ResQ .enqueue (Basic , "test3" )
52
+ ResQ ._enqueue (Basic , "test3" )
36
53
assert self .redis .llen ("queue:basic" ) == 3
37
54
assert self .redis .sismember ('queues' ,'basic' )
38
55
@@ -56,6 +73,39 @@ def test_peek(self):
56
73
self .resq .enqueue (Basic ,"test1" )
57
74
self .resq .enqueue (Basic ,"test2" )
58
75
assert len (self .resq .peek ('basic' ,0 ,20 )) == 2
76
+
77
+ def test_size (self ):
78
+ self .resq .enqueue (Basic ,"test1" )
79
+ self .resq .enqueue (Basic ,"test2" )
80
+ assert self .resq .size ('basic' ) == 2
81
+ assert self .resq .size ('noq' ) == 0
82
+
83
+ def test_redis_property (self ):
84
+ from redis import Redis
85
+ rq = ResQ (server = "localhost:6379" )
86
+ red = Redis ()
87
+ rq2 = ResQ (server = red )
88
+ self .assertRaises (Exception , rq .redis ,[Basic ])
89
+
90
+ def test_info (self ):
91
+ self .resq .enqueue (Basic ,"test1" )
92
+ self .resq .enqueue (TestProcess )
93
+ info = self .resq .info ()
94
+ assert info ['queues' ] == 2
95
+ assert info ['servers' ] == ['localhost:6379' ]
96
+ assert info ['workers' ] == 0
97
+ worker = Worker (['basic' ])
98
+ worker .register_worker ()
99
+ info = self .resq .info ()
100
+ assert info ['workers' ] == 1
101
+
102
+ def test_workers (self ):
103
+ worker = Worker (['basic' ])
104
+ worker .register_worker ()
105
+ name = "%s:%s:%s" % (os .uname ()[1 ],os .getpid (),'basic' )
106
+ assert len (self .resq .workers ()) == 1
107
+ assert name in self .resq .workers ()
108
+
59
109
60
110
class JobTests (PyResTests ):
61
111
def test_reserve (self ):
@@ -67,7 +117,10 @@ def test_reserve(self):
67
117
def test_perform (self ):
68
118
self .resq .enqueue (Basic ,"test1" )
69
119
job = Job .reserve ('basic' ,self .resq )
120
+ self .resq .enqueue (TestProcess )
121
+ job2 = Job .reserve ('high' , self .resq )
70
122
assert job .perform () == "name:test1"
123
+ assert job2 .perform ()
71
124
72
125
def test_fail (self ):
73
126
self .resq .enqueue (Basic ,"test1" )
@@ -79,11 +132,21 @@ def test_fail(self):
79
132
80
133
class WorkerTests (PyResTests ):
81
134
def test_worker_init (self ):
82
- try :
83
- worker = Worker ([])
84
- except :
85
- assert True
86
-
135
+ from pyres .exceptions import NoQueueError
136
+ self .assertRaises (NoQueueError , Worker ,[])
137
+ self .assertRaises (Exception , Worker ,['test' ],TestProcess ())
138
+
139
+ def test_startup (self ):
140
+ worker = Worker (['basic' ])
141
+ worker .startup ()
142
+ name = "%s:%s:%s" % (os .uname ()[1 ],os .getpid (),'basic' )
143
+ assert self .redis .sismember ('workers' ,name )
144
+ import signal
145
+ assert signal .getsignal (signal .SIGTERM ) == worker .shutdown_all
146
+ assert signal .getsignal (signal .SIGINT ) == worker .shutdown_all
147
+ assert signal .getsignal (signal .SIGQUIT ) == worker .schedule_shutdown
148
+ assert signal .getsignal (signal .SIGUSR1 ) == worker .kill_child
149
+
87
150
def test_register (self ):
88
151
worker = Worker (['basic' ])
89
152
worker .register_worker ()
@@ -139,4 +202,33 @@ def test_process(self):
139
202
assert not self .redis .get ('worker:%s' % worker )
140
203
assert not self .redis .get ("stat:failed" )
141
204
assert not self .redis .get ("stat:failed:%s" % name )
142
-
205
+ self .resq .enqueue (Basic ,"test1" )
206
+ worker .process ()
207
+ assert not self .redis .get ('worker:%s' % worker )
208
+ assert not self .redis .get ("stat:failed" )
209
+ assert not self .redis .get ("stat:failed:%s" % name )
210
+
211
+
212
+ def test_signals (self ):
213
+ worker = Worker (['basic' ])
214
+ worker .startup ()
215
+ import inspect , signal
216
+ frame = inspect .currentframe ()
217
+ worker .schedule_shutdown (frame , signal .SIGQUIT )
218
+ assert worker ._shutdown
219
+ del worker
220
+ worker = Worker (['high' ])
221
+ #self.resq.enqueue(TestSleep)
222
+ #worker.work()
223
+ #assert worker.child
224
+ assert not worker .kill_child (frame , signal .SIGUSR1 )
225
+
226
+ def test_job_failure (self ):
227
+ self .resq .enqueue (ErrorObjcet )
228
+ worker = Worker (['basic' ])
229
+ #worker.process()
230
+ name = "%s:%s:%s" % (os .uname ()[1 ],os .getpid (),'basic' )
231
+ #assert not self.redis.get('worker:%s' % worker)
232
+ #assert self.redis.get("stat:failed")
233
+ #assert self.redis.get("stat:failed:%s" % name)
234
+ assert False
0 commit comments