1
1
# Some simple queue module tests, plus some failure conditions
2
2
# to ensure the Queue locks remain stable.
3
3
import itertools
4
- import queue
5
4
import random
6
5
import threading
7
6
import time
8
7
import unittest
9
8
import weakref
10
9
from test import support
11
10
12
-
13
- try :
14
- import _queue
15
- except ImportError :
16
- _queue = None
11
+ py_queue = support .import_fresh_module ('queue' , blocked = ['_queue' ])
12
+ c_queue = support .import_fresh_module ('queue' , fresh = ['_queue' ])
13
+ need_c_queue = unittest .skipUnless (c_queue , "No _queue module found" )
17
14
18
15
QUEUE_SIZE = 5
19
16
@@ -120,12 +117,12 @@ def basic_queue_test(self, q):
120
117
try :
121
118
q .put (full , block = 0 )
122
119
self .fail ("Didn't appear to block with a full queue" )
123
- except queue .Full :
120
+ except self . queue .Full :
124
121
pass
125
122
try :
126
123
q .put (full , timeout = 0.01 )
127
124
self .fail ("Didn't appear to time-out with a full queue" )
128
- except queue .Full :
125
+ except self . queue .Full :
129
126
pass
130
127
# Test a blocking put
131
128
self .do_blocking_test (q .put , (full ,), q .get , ())
@@ -137,12 +134,12 @@ def basic_queue_test(self, q):
137
134
try :
138
135
q .get (block = 0 )
139
136
self .fail ("Didn't appear to block with an empty queue" )
140
- except queue .Empty :
137
+ except self . queue .Empty :
141
138
pass
142
139
try :
143
140
q .get (timeout = 0.01 )
144
141
self .fail ("Didn't appear to time-out with an empty queue" )
145
- except queue .Empty :
142
+ except self . queue .Empty :
146
143
pass
147
144
# Test a blocking get
148
145
self .do_blocking_test (q .get , (), q .put , ('empty' ,))
@@ -218,12 +215,12 @@ def test_nowait(self):
218
215
q = self .type2test (QUEUE_SIZE )
219
216
for i in range (QUEUE_SIZE ):
220
217
q .put_nowait (1 )
221
- with self .assertRaises (queue .Full ):
218
+ with self .assertRaises (self . queue .Full ):
222
219
q .put_nowait (1 )
223
220
224
221
for i in range (QUEUE_SIZE ):
225
222
q .get_nowait ()
226
- with self .assertRaises (queue .Empty ):
223
+ with self .assertRaises (self . queue .Empty ):
227
224
q .get_nowait ()
228
225
229
226
def test_shrinking_queue (self ):
@@ -232,45 +229,88 @@ def test_shrinking_queue(self):
232
229
q .put (1 )
233
230
q .put (2 )
234
231
q .put (3 )
235
- with self .assertRaises (queue .Full ):
232
+ with self .assertRaises (self . queue .Full ):
236
233
q .put_nowait (4 )
237
234
self .assertEqual (q .qsize (), 3 )
238
235
q .maxsize = 2 # shrink the queue
239
- with self .assertRaises (queue .Full ):
236
+ with self .assertRaises (self . queue .Full ):
240
237
q .put_nowait (4 )
241
238
242
- class QueueTest (BaseQueueTestMixin , unittest .TestCase ):
243
- type2test = queue .Queue
239
+ class QueueTest (BaseQueueTestMixin ):
240
+
241
+ def setUp (self ):
242
+ self .type2test = self .queue .Queue
243
+ super ().setUp ()
244
+
245
+ class PyQueueTest (QueueTest , unittest .TestCase ):
246
+ queue = py_queue
247
+
248
+
249
+ @need_c_queue
250
+ class CQueueTest (QueueTest , unittest .TestCase ):
251
+ queue = c_queue
252
+
253
+
254
+ class LifoQueueTest (BaseQueueTestMixin ):
255
+
256
+ def setUp (self ):
257
+ self .type2test = self .queue .LifoQueue
258
+ super ().setUp ()
259
+
260
+
261
+ class PyLifoQueueTest (LifoQueueTest , unittest .TestCase ):
262
+ queue = py_queue
263
+
264
+
265
+ @need_c_queue
266
+ class CLifoQueueTest (LifoQueueTest , unittest .TestCase ):
267
+ queue = c_queue
268
+
269
+
270
+ class PriorityQueueTest (BaseQueueTestMixin ):
271
+
272
+ def setUp (self ):
273
+ self .type2test = self .queue .PriorityQueue
274
+ super ().setUp ()
275
+
244
276
245
- class LifoQueueTest ( BaseQueueTestMixin , unittest .TestCase ):
246
- type2test = queue . LifoQueue
277
+ class PyPriorityQueueTest ( PriorityQueueTest , unittest .TestCase ):
278
+ queue = py_queue
247
279
248
- class PriorityQueueTest (BaseQueueTestMixin , unittest .TestCase ):
249
- type2test = queue .PriorityQueue
250
280
281
+ @need_c_queue
282
+ class CPriorityQueueTest (PriorityQueueTest , unittest .TestCase ):
283
+ queue = c_queue
251
284
252
285
253
286
# A Queue subclass that can provoke failure at a moment's notice :)
254
- class FailingQueueException (Exception ):
255
- pass
256
-
257
- class FailingQueue (queue .Queue ):
258
- def __init__ (self , * args ):
259
- self .fail_next_put = False
260
- self .fail_next_get = False
261
- queue .Queue .__init__ (self , * args )
262
- def _put (self , item ):
263
- if self .fail_next_put :
264
- self .fail_next_put = False
265
- raise FailingQueueException ("You Lose" )
266
- return queue .Queue ._put (self , item )
267
- def _get (self ):
268
- if self .fail_next_get :
269
- self .fail_next_get = False
270
- raise FailingQueueException ("You Lose" )
271
- return queue .Queue ._get (self )
272
-
273
- class FailingQueueTest (BlockingTestMixin , unittest .TestCase ):
287
+ class FailingQueueException (Exception ): pass
288
+
289
+ class FailingQueueTest (BlockingTestMixin ):
290
+
291
+ def setUp (self ):
292
+
293
+ Queue = self .queue .Queue
294
+
295
+ class FailingQueue (Queue ):
296
+ def __init__ (self , * args ):
297
+ self .fail_next_put = False
298
+ self .fail_next_get = False
299
+ Queue .__init__ (self , * args )
300
+ def _put (self , item ):
301
+ if self .fail_next_put :
302
+ self .fail_next_put = False
303
+ raise FailingQueueException ("You Lose" )
304
+ return Queue ._put (self , item )
305
+ def _get (self ):
306
+ if self .fail_next_get :
307
+ self .fail_next_get = False
308
+ raise FailingQueueException ("You Lose" )
309
+ return Queue ._get (self )
310
+
311
+ self .FailingQueue = FailingQueue
312
+
313
+ super ().setUp ()
274
314
275
315
def failing_queue_test (self , q ):
276
316
if q .qsize ():
@@ -354,13 +394,24 @@ def failing_queue_test(self, q):
354
394
self .assertTrue (not q .qsize (), "Queue should be empty" )
355
395
356
396
def test_failing_queue (self ):
397
+
357
398
# Test to make sure a queue is functioning correctly.
358
399
# Done twice to the same instance.
359
- q = FailingQueue (QUEUE_SIZE )
400
+ q = self . FailingQueue (QUEUE_SIZE )
360
401
self .failing_queue_test (q )
361
402
self .failing_queue_test (q )
362
403
363
404
405
+
406
+ class PyFailingQueueTest (FailingQueueTest , unittest .TestCase ):
407
+ queue = py_queue
408
+
409
+
410
+ @need_c_queue
411
+ class CFailingQueueTest (FailingQueueTest , unittest .TestCase ):
412
+ queue = c_queue
413
+
414
+
364
415
class BaseSimpleQueueTest :
365
416
366
417
def setUp (self ):
@@ -388,7 +439,7 @@ def consume_nonblock(self, q, results, sentinel):
388
439
while True :
389
440
try :
390
441
val = q .get (block = False )
391
- except queue .Empty :
442
+ except self . queue .Empty :
392
443
time .sleep (1e-5 )
393
444
else :
394
445
break
@@ -401,7 +452,7 @@ def consume_timeout(self, q, results, sentinel):
401
452
while True :
402
453
try :
403
454
val = q .get (timeout = 1e-5 )
404
- except queue .Empty :
455
+ except self . queue .Empty :
405
456
pass
406
457
else :
407
458
break
@@ -470,11 +521,11 @@ def test_basic(self):
470
521
self .assertTrue (q .empty ())
471
522
self .assertEqual (q .qsize (), 0 )
472
523
473
- with self .assertRaises (queue .Empty ):
524
+ with self .assertRaises (self . queue .Empty ):
474
525
q .get (block = False )
475
- with self .assertRaises (queue .Empty ):
526
+ with self .assertRaises (self . queue .Empty ):
476
527
q .get (timeout = 1e-3 )
477
- with self .assertRaises (queue .Empty ):
528
+ with self .assertRaises (self . queue .Empty ):
478
529
q .get_nowait ()
479
530
self .assertTrue (q .empty ())
480
531
self .assertEqual (q .qsize (), 0 )
@@ -541,18 +592,25 @@ class C:
541
592
542
593
543
594
class PySimpleQueueTest (BaseSimpleQueueTest , unittest .TestCase ):
544
- type2test = queue ._PySimpleQueue
545
595
596
+ queue = py_queue
597
+ def setUp (self ):
598
+ self .type2test = self .queue ._PySimpleQueue
599
+ super ().setUp ()
546
600
547
- @unittest .skipIf (_queue is None , "No _queue module found" )
601
+
602
+ @need_c_queue
548
603
class CSimpleQueueTest (BaseSimpleQueueTest , unittest .TestCase ):
549
604
605
+ queue = c_queue
606
+
550
607
def setUp (self ):
551
- self .type2test = _queue .SimpleQueue
608
+ self .type2test = self . queue .SimpleQueue
552
609
super ().setUp ()
553
610
554
611
def test_is_default (self ):
555
- self .assertIs (self .type2test , queue .SimpleQueue )
612
+ self .assertIs (self .type2test , self .queue .SimpleQueue )
613
+ self .assertIs (self .type2test , self .queue .SimpleQueue )
556
614
557
615
def test_reentrancy (self ):
558
616
# bpo-14976: put() may be called reentrantly in an asynchronous
0 commit comments