diff options
Diffstat (limited to 'Lib/test/test_queue.py')
-rw-r--r-- | Lib/test/test_queue.py | 122 |
1 files changed, 80 insertions, 42 deletions
diff --git a/Lib/test/test_queue.py b/Lib/test/test_queue.py index f821db689c1..86ad9c07655 100644 --- a/Lib/test/test_queue.py +++ b/Lib/test/test_queue.py @@ -1,13 +1,16 @@ # Some simple queue module tests, plus some failure conditions # to ensure the Queue locks remain stable. -import Queue +import queue import time import unittest -from test import test_support -threading = test_support.import_module('threading') +from test import support +threading = support.import_module('threading') QUEUE_SIZE = 5 +def qfull(q): + return q.maxsize > 0 and q.qsize() == q.maxsize + # A thread to run a function that unclogs a blocked Queue. class _TriggerThread(threading.Thread): def __init__(self, fn, args): @@ -79,14 +82,16 @@ class BlockingTestMixin: self.fail("trigger thread ended but event never set") -class BaseQueueTest(BlockingTestMixin): +class BaseQueueTestMixin(BlockingTestMixin): def setUp(self): self.cum = 0 self.cumlock = threading.Lock() def simple_queue_test(self, q): - if not q.empty(): - raise RuntimeError, "Call this function with an empty queue" + if q.qsize(): + raise RuntimeError("Call this function with an empty queue") + self.assertTrue(q.empty()) + self.assertFalse(q.full()) # I guess we better check things actually queue correctly a little :) q.put(111) q.put(333) @@ -99,21 +104,23 @@ class BaseQueueTest(BlockingTestMixin): "Didn't seem to queue the correct data!") for i in range(QUEUE_SIZE-1): q.put(i) - self.assertTrue(not q.empty(), "Queue should not be empty") - self.assertTrue(not q.full(), "Queue should not be full") + self.assertTrue(q.qsize(), "Queue should not be empty") + self.assertTrue(not qfull(q), "Queue should not be full") last = 2 * QUEUE_SIZE full = 3 * 2 * QUEUE_SIZE q.put(last) - self.assertTrue(q.full(), "Queue should be full") + self.assertTrue(qfull(q), "Queue should be full") + self.assertFalse(q.empty()) + self.assertTrue(q.full()) try: q.put(full, block=0) self.fail("Didn't appear to block with a full queue") - except Queue.Full: + except queue.Full: pass try: q.put(full, timeout=0.01) self.fail("Didn't appear to time-out with a full queue") - except Queue.Full: + except queue.Full: pass # Test a blocking put self.do_blocking_test(q.put, (full,), q.get, ()) @@ -121,16 +128,16 @@ class BaseQueueTest(BlockingTestMixin): # Empty it for i in range(QUEUE_SIZE): q.get() - self.assertTrue(q.empty(), "Queue should be empty") + self.assertTrue(not q.qsize(), "Queue should be empty") try: q.get(block=0) self.fail("Didn't appear to block with an empty queue") - except Queue.Empty: + except queue.Empty: pass try: q.get(timeout=0.01) self.fail("Didn't appear to time-out with an empty queue") - except Queue.Empty: + except queue.Empty: pass # Test a blocking get self.do_blocking_test(q.get, (), q.put, ('empty',)) @@ -140,7 +147,7 @@ class BaseQueueTest(BlockingTestMixin): def worker(self, q): while True: x = q.get() - if x is None: + if x < 0: q.task_done() return with self.cumlock: @@ -151,13 +158,13 @@ class BaseQueueTest(BlockingTestMixin): self.cum = 0 for i in (0,1): threading.Thread(target=self.worker, args=(q,)).start() - for i in xrange(100): + for i in range(100): q.put(i) q.join() self.assertEqual(self.cum, sum(range(100)), "q.join() did not block until all tasks were done") for i in (0,1): - q.put(None) # instruct the threads to close + q.put(-1) # instruct the threads to close q.join() # verify that you can join twice def test_queue_task_done(self): @@ -190,15 +197,46 @@ class BaseQueueTest(BlockingTestMixin): self.simple_queue_test(q) self.simple_queue_test(q) + def test_negative_timeout_raises_exception(self): + q = self.type2test(QUEUE_SIZE) + with self.assertRaises(ValueError): + q.put(1, timeout=-1) + with self.assertRaises(ValueError): + q.get(1, timeout=-1) + + def test_nowait(self): + q = self.type2test(QUEUE_SIZE) + for i in range(QUEUE_SIZE): + q.put_nowait(1) + with self.assertRaises(queue.Full): + q.put_nowait(1) + + for i in range(QUEUE_SIZE): + q.get_nowait() + with self.assertRaises(queue.Empty): + q.get_nowait() + + def test_shrinking_queue(self): + # issue 10110 + q = self.type2test(3) + q.put(1) + q.put(2) + q.put(3) + with self.assertRaises(queue.Full): + q.put_nowait(4) + self.assertEqual(q.qsize(), 3) + q.maxsize = 2 # shrink the queue + with self.assertRaises(queue.Full): + q.put_nowait(4) -class QueueTest(BaseQueueTest, unittest.TestCase): - type2test = Queue.Queue +class QueueTest(BaseQueueTestMixin, unittest.TestCase): + type2test = queue.Queue -class LifoQueueTest(BaseQueueTest, unittest.TestCase): - type2test = Queue.LifoQueue +class LifoQueueTest(BaseQueueTestMixin, unittest.TestCase): + type2test = queue.LifoQueue -class PriorityQueueTest(BaseQueueTest, unittest.TestCase): - type2test = Queue.PriorityQueue +class PriorityQueueTest(BaseQueueTestMixin, unittest.TestCase): + type2test = queue.PriorityQueue @@ -206,27 +244,27 @@ class PriorityQueueTest(BaseQueueTest, unittest.TestCase): class FailingQueueException(Exception): pass -class FailingQueue(Queue.Queue): +class FailingQueue(queue.Queue): def __init__(self, *args): self.fail_next_put = False self.fail_next_get = False - Queue.Queue.__init__(self, *args) + queue.Queue.__init__(self, *args) def _put(self, item): if self.fail_next_put: self.fail_next_put = False - raise FailingQueueException, "You Lose" - return Queue.Queue._put(self, item) + raise FailingQueueException("You Lose") + return queue.Queue._put(self, item) def _get(self): if self.fail_next_get: self.fail_next_get = False - raise FailingQueueException, "You Lose" - return Queue.Queue._get(self) + raise FailingQueueException("You Lose") + return queue.Queue._get(self) class FailingQueueTest(unittest.TestCase, BlockingTestMixin): def failing_queue_test(self, q): - if not q.empty(): - raise RuntimeError, "Call this function with an empty queue" + if q.qsize(): + raise RuntimeError("Call this function with an empty queue") for i in range(QUEUE_SIZE-1): q.put(i) # Test a failing non-blocking put. @@ -243,7 +281,7 @@ class FailingQueueTest(unittest.TestCase, BlockingTestMixin): except FailingQueueException: pass q.put("last") - self.assertTrue(q.full(), "Queue should be full") + self.assertTrue(qfull(q), "Queue should be full") # Test a failing blocking put q.fail_next_put = True try: @@ -265,17 +303,17 @@ class FailingQueueTest(unittest.TestCase, BlockingTestMixin): # Check the Queue isn't damaged. # put failed, but get succeeded - re-add q.put("last") - self.assertTrue(q.full(), "Queue should be full") + self.assertTrue(qfull(q), "Queue should be full") q.get() - self.assertTrue(not q.full(), "Queue should not be full") + self.assertTrue(not qfull(q), "Queue should not be full") q.put("last") - self.assertTrue(q.full(), "Queue should be full") + self.assertTrue(qfull(q), "Queue should be full") # Test a blocking put self.do_blocking_test(q.put, ("full",), q.get, ()) # Empty it for i in range(QUEUE_SIZE): q.get() - self.assertTrue(q.empty(), "Queue should be empty") + self.assertTrue(not q.qsize(), "Queue should be empty") q.put("first") q.fail_next_get = True try: @@ -283,16 +321,16 @@ class FailingQueueTest(unittest.TestCase, BlockingTestMixin): self.fail("The queue didn't fail when it should have") except FailingQueueException: pass - self.assertTrue(not q.empty(), "Queue should not be empty") + self.assertTrue(q.qsize(), "Queue should not be empty") q.fail_next_get = True try: q.get(timeout=0.1) self.fail("The queue didn't fail when it should have") except FailingQueueException: pass - self.assertTrue(not q.empty(), "Queue should not be empty") + self.assertTrue(q.qsize(), "Queue should not be empty") q.get() - self.assertTrue(q.empty(), "Queue should be empty") + self.assertTrue(not q.qsize(), "Queue should be empty") q.fail_next_get = True try: self.do_exceptional_blocking_test(q.get, (), q.put, ('empty',), @@ -301,9 +339,9 @@ class FailingQueueTest(unittest.TestCase, BlockingTestMixin): except FailingQueueException: pass # put succeeded, but get failed. - self.assertTrue(not q.empty(), "Queue should not be empty") + self.assertTrue(q.qsize(), "Queue should not be empty") q.get() - self.assertTrue(q.empty(), "Queue should be empty") + self.assertTrue(not q.qsize(), "Queue should be empty") def test_failing_queue(self): # Test to make sure a queue is functioning correctly. @@ -314,7 +352,7 @@ class FailingQueueTest(unittest.TestCase, BlockingTestMixin): def test_main(): - test_support.run_unittest(QueueTest, LifoQueueTest, PriorityQueueTest, + support.run_unittest(QueueTest, LifoQueueTest, PriorityQueueTest, FailingQueueTest) |