1 from tests import LimitedTestCase, silence_warnings
2 from unittest import main
4 from eventlet import coros, spawn, sleep
5 from eventlet.event import Event
8 class TestQueue(LimitedTestCase):
11 def test_send_first(self):
14 self.assertEqual(q.wait(), 'hi')
17 def test_send_exception_first(self):
19 q.send(exc=RuntimeError())
20 self.assertRaises(RuntimeError, q.wait)
23 def test_send_last(self):
27 timer = eventlet.Timeout(0.1)
28 self.assertEqual(q.wait(), 'hi2')
37 def test_max_size(self):
51 self.assertEqual(results, ['a', 'b'])
52 self.assertEqual(q.wait(), 'a')
54 self.assertEqual(results, ['a', 'b', 'c'])
55 self.assertEqual(q.wait(), 'b')
56 self.assertEqual(q.wait(), 'c')
59 def test_zero_max_size(self):
76 spawn(receiver, e2, q)
77 self.assertEqual(e2.wait(), 'hi')
78 self.assertEqual(e1.wait(), 'done')
81 def test_multiple_waiters(self):
82 # tests that multiple waiters get their results back
85 sendings = ['1', '2', '3', '4']
86 gts = [eventlet.spawn(q.wait)
89 eventlet.sleep(0.01) # get 'em all waiting
96 for i, gt in enumerate(gts):
97 results.add(gt.wait())
98 self.assertEqual(results, set(sendings))
101 def test_waiters_that_cancel(self):
104 def do_receive(q, evt):
105 eventlet.Timeout(0, RuntimeError())
110 evt.send('timed out')
113 spawn(do_receive, q, evt)
114 self.assertEqual(evt.wait(), 'timed out')
117 self.assertEqual(q.wait(), 'hi')
120 def test_senders_that_die(self):
127 self.assertEqual(q.wait(), 'sent')
130 def test_two_waiters_one_dies(self):
134 def do_receive(q, evt):
135 eventlet.Timeout(0, RuntimeError())
140 evt.send('timed out')
144 waiting_evt = Event()
145 spawn(do_receive, q, dying_evt)
146 spawn(waiter, q, waiting_evt)
149 self.assertEqual(dying_evt.wait(), 'timed out')
150 self.assertEqual(waiting_evt.wait(), 'hi')
153 def test_two_bogus_waiters(self):
154 def do_receive(q, evt):
155 eventlet.Timeout(0, RuntimeError())
160 evt.send('timed out')
165 spawn(do_receive, q, e1)
166 spawn(do_receive, q, e2)
169 self.assertEqual(e1.wait(), 'timed out')
170 self.assertEqual(e2.wait(), 'timed out')
171 self.assertEqual(q.wait(), 'sent')
174 def test_waiting(self):
181 spawn(do_wait, q, e1)
183 self.assertEqual(1, q.waiting())
186 self.assertEqual(0, q.waiting())
187 self.assertEqual('hi', e1.wait())
188 self.assertEqual(0, q.waiting())
191 class TestChannel(LimitedTestCase):
196 channel = coros.queue(0)
200 def another_greenlet():
201 events.append(channel.wait())
202 events.append(channel.wait())
204 spawn(another_greenlet)
206 events.append('sending')
207 channel.send('hello')
208 events.append('sent hello')
209 channel.send('world')
210 events.append('sent world')
212 self.assertEqual(['sending', 'hello', 'sent hello', 'world', 'sent world'], events)
217 channel = coros.queue(0)
220 def another_greenlet():
221 events.append('sending hello')
222 channel.send('hello')
223 events.append('sending world')
224 channel.send('world')
225 events.append('sent world')
227 spawn(another_greenlet)
229 events.append('waiting')
230 events.append(channel.wait())
231 events.append(channel.wait())
233 self.assertEqual(['waiting', 'sending hello', 'hello', 'sending world', 'world'], events)
235 self.assertEqual(['waiting', 'sending hello', 'hello', 'sending world', 'world', 'sent world'], events)
238 def test_waiters(self):
240 w1 = eventlet.spawn(c.wait)
241 w2 = eventlet.spawn(c.wait)
242 w3 = eventlet.spawn(c.wait)
244 self.assertEqual(c.waiting(), 3)
245 s1 = eventlet.spawn(c.send, 1)
246 s2 = eventlet.spawn(c.send, 2)
247 s3 = eventlet.spawn(c.send, 3)
248 sleep(0) # this gets all the sends into a waiting state
249 self.assertEqual(c.waiting(), 0)
254 # NOTE: we don't guarantee that waiters are served in order
255 results = sorted([w1.wait(), w2.wait(), w3.wait()])
256 self.assertEqual(results, [1, 2, 3])
258 if __name__ == '__main__':