1 from nose.tools import *
2 from grassyknoll.lib.meta import Factory
3
4 from grassyknoll.concurrent.Worker import *
5 from grassyknoll.concurrent.Message import *
6 from grassyknoll.concurrent.MailBox import *
7 from grassyknoll.concurrent.Wrappers import *
8 from grassyknoll.concurrent.errors import *
9 from grassyknoll.concurrent.Fault import Fault
10
11
12
13 TIMEOUT=.1
14
15 import time
18
19 @errorMessenger(ZeroDivisionError)
20 @functionMessenger()
23
39
41 box=ThreadMailBox()
42 try:
43 worker=Worker(ThreadMailBox("WorkerBox", 1),
44 NullContextManager.factory(func=myfunc))
45 worker.start()
46 sleep()
47 assert worker.context is not None
48 context=worker.context
49 m=Message(ContextExit, reply_box=box)
50 worker.inbox.sendNow(m)
51 r=box.recv(TIMEOUT)
52 assert isinstance(r.payload, bool)
53 assert r.payload
54 assert r.re_id == m.id
55 assert worker.isAlive()
56 assert worker.context is not None
57 assert worker.context is not context
58 assert worker.newcontext
59 finally:
60 worker.inbox.sendNow(Message(WorkerExit))
61
99
101 unhandled="die"
102
104 m=self.makeMesg(0)
105 self.worker.inbox.sendNow(m)
106 r=self.reply_box.recv(TIMEOUT)
107 assert r.re_id == m.id
108 assert isinstance(r.payload, Fault)
109 assert r.payload.type is ZeroDivisionError
110
116
118
119 junk=self.makeMesg(42)
120 self.reply_box.sendNow(junk)
121
122 m1=self.makeMesg(25)
123 self.worker.inbox.sendNow(m1)
124
125 sleep()
126
127 r=self.reply_box.recvNow()
128 assert r is junk
129 assert self.worker.isAlive()
130
131 assert_raises(BoxEmptyError, self.reply_box.recv, TIMEOUT)
132 assert self.worker.isAlive()
133
135
136 unhandled="die"
137
139 m=self.makeMesg("aaaaa")
140 self.worker.inbox.sendNow(m)
141 r=self.reply_box.recv(TIMEOUT)
142 assert r.re_id == m.id
143 assert isinstance(r.payload, CrashError)
144 assert r.payload.type is TypeError
145 assert not self.worker.isAlive()
146 assert self.worker.context is None
147
149
150 unhandled="keeprunning"
151
153 sleep()
154 context=self.worker.context
155 m=self.makeMesg("aaaaa")
156 self.worker.inbox.sendNow(m)
157 r=self.reply_box.recv(TIMEOUT)
158 assert r.re_id == m.id
159 assert isinstance(r.payload, CrashError)
160 assert r.payload.type is TypeError
161 assert self.worker.isAlive()
162 assert self.worker.context is context
163
164 self.test_basic()
165
166 -class TestNewContextWorker(BaseTestWorker):
167
168 unhandled="newcontext"
169
170 - def test_crash(self):
171 sleep()
172 context=self.worker.context
173 m=self.makeMesg("aaaaa")
174 self.worker.inbox.sendNow(m)
175 r=self.reply_box.recv(TIMEOUT)
176 assert r.re_id == m.id
177 assert isinstance(r.payload, CrashError)
178 assert r.payload.type is TypeError
179 assert self.worker.isAlive()
180 assert self.worker.context is not None
181 assert self.worker.context is not context
182
183 self.test_basic()
184
193
195 m=self.makeMesg(10)
196 self.worker.privbox.sendNow(m)
197 r=self.reply_box.recv(TIMEOUT)
198 assert r.re_id == m.id
199 assert r.payload == 10
200