From fd07852b433427f3f86930cac72e4d837cad043d Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 29 Feb 2024 15:33:44 -0700 Subject: [PATCH 1/2] Exercise Queue.get_nowait() in the tests. --- Lib/test/test_interpreters/test_queues.py | 116 +++++++++++++--------- 1 file changed, 69 insertions(+), 47 deletions(-) diff --git a/Lib/test/test_interpreters/test_queues.py b/Lib/test/test_interpreters/test_queues.py index 65b5435fb00b04..905ef035d43feb 100644 --- a/Lib/test/test_interpreters/test_queues.py +++ b/Lib/test/test_interpreters/test_queues.py @@ -210,10 +210,15 @@ def test_put_syncobj(self): ]: with self.subTest(repr(obj)): queue = queues.create() + queue.put(obj, syncobj=True) obj2 = queue.get() self.assertEqual(obj2, obj) + queue.put(obj, syncobj=True) + obj2 = queue.get_nowait() + self.assertEqual(obj2, obj) + for obj in [ [1, 2, 3], {'a': 13, 'b': 17}, @@ -237,10 +242,15 @@ def test_put_not_syncobj(self): ]: with self.subTest(repr(obj)): queue = queues.create() + queue.put(obj, syncobj=False) obj2 = queue.get() self.assertEqual(obj2, obj) + queue.put(obj, syncobj=False) + obj2 = queue.get_nowait() + self.assertEqual(obj2, obj) + def test_get_timeout(self): queue = queues.create() with self.assertRaises(queues.QueueEmpty): @@ -254,11 +264,13 @@ def test_get_nowait(self): def test_put_get_default_syncobj(self): expected = list(range(20)) queue = queues.create(syncobj=True) - for i in range(20): - queue.put(i) - actual = [queue.get() for _ in range(20)] - - self.assertEqual(actual, expected) + for methname in ('get', 'get_nowait'): + with self.subTest(f'{methname}()'): + get = getattr(queue, methname) + for i in range(20): + queue.put(i) + actual = [get() for _ in range(20)] + self.assertEqual(actual, expected) obj = [1, 2, 3] # lists are not shareable with self.assertRaises(interpreters.NotShareableError): @@ -267,29 +279,36 @@ def test_put_get_default_syncobj(self): def test_put_get_default_not_syncobj(self): expected = list(range(20)) queue = queues.create(syncobj=False) - for i in range(20): - queue.put(i) - actual = [queue.get() for _ in range(20)] + for methname in ('get', 'get_nowait'): + with self.subTest(f'{methname}()'): + get = getattr(queue, methname) - self.assertEqual(actual, expected) + for i in range(20): + queue.put(i) + actual = [get() for _ in range(20)] + self.assertEqual(actual, expected) - obj = [1, 2, 3] # lists are not shareable - queue.put(obj) - obj2 = queue.get() - self.assertEqual(obj, obj2) - self.assertIsNot(obj, obj2) + obj = [1, 2, 3] # lists are not shareable + queue.put(obj) + obj2 = get() + self.assertEqual(obj, obj2) + self.assertIsNot(obj, obj2) def test_put_get_same_interpreter(self): interp = interpreters.create() interp.exec(dedent(""" from test.support.interpreters import queues queue = queues.create() - orig = b'spam' - queue.put(orig, syncobj=True) - obj = queue.get() - assert obj == orig, 'expected: obj == orig' - assert obj is not orig, 'expected: obj is not orig' """)) + for methname in ('get', 'get_nowait'): + with self.subTest(f'{methname}()'): + interp.exec(dedent(f""" + orig = b'spam' + queue.put(orig, syncobj=True) + obj = queue.{methname}() + assert obj == orig, 'expected: obj == orig' + assert obj is not orig, 'expected: obj is not orig' + """)) def test_put_get_different_interpreters(self): interp = interpreters.create() @@ -297,34 +316,37 @@ def test_put_get_different_interpreters(self): queue2 = queues.create() self.assertEqual(len(queues.list_all()), 2) - obj1 = b'spam' - queue1.put(obj1, syncobj=True) - - out = _run_output( - interp, - dedent(f""" - from test.support.interpreters import queues - queue1 = queues.Queue({queue1.id}) - queue2 = queues.Queue({queue2.id}) - assert queue1.qsize() == 1, 'expected: queue1.qsize() == 1' - obj = queue1.get() - assert queue1.qsize() == 0, 'expected: queue1.qsize() == 0' - assert obj == b'spam', 'expected: obj == obj1' - # When going to another interpreter we get a copy. - assert id(obj) != {id(obj1)}, 'expected: obj is not obj1' - obj2 = b'eggs' - print(id(obj2)) - assert queue2.qsize() == 0, 'expected: queue2.qsize() == 0' - queue2.put(obj2, syncobj=True) - assert queue2.qsize() == 1, 'expected: queue2.qsize() == 1' - """)) - self.assertEqual(len(queues.list_all()), 2) - self.assertEqual(queue1.qsize(), 0) - self.assertEqual(queue2.qsize(), 1) - - obj2 = queue2.get() - self.assertEqual(obj2, b'eggs') - self.assertNotEqual(id(obj2), int(out)) + for methname in ('get', 'get_nowait'): + with self.subTest(f'{methname}()'): + obj1 = b'spam' + queue1.put(obj1, syncobj=True) + + out = _run_output( + interp, + dedent(f""" + from test.support.interpreters import queues + queue1 = queues.Queue({queue1.id}) + queue2 = queues.Queue({queue2.id}) + assert queue1.qsize() == 1, 'expected: queue1.qsize() == 1' + obj = queue1.{methname}() + assert queue1.qsize() == 0, 'expected: queue1.qsize() == 0' + assert obj == b'spam', 'expected: obj == obj1' + # When going to another interpreter we get a copy. + assert id(obj) != {id(obj1)}, 'expected: obj is not obj1' + obj2 = b'eggs' + print(id(obj2)) + assert queue2.qsize() == 0, 'expected: queue2.qsize() == 0' + queue2.put(obj2, syncobj=True) + assert queue2.qsize() == 1, 'expected: queue2.qsize() == 1' + """)) + self.assertEqual(len(queues.list_all()), 2) + self.assertEqual(queue1.qsize(), 0) + self.assertEqual(queue2.qsize(), 1) + + get = getattr(queue2, methname) + obj2 = get() + self.assertEqual(obj2, b'eggs') + self.assertNotEqual(id(obj2), int(out)) def test_put_cleared_with_subinterpreter(self): interp = interpreters.create() From 445f3f35d63e5a37b89ec762290f452254b733b2 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 29 Feb 2024 15:15:52 -0700 Subject: [PATCH 2/2] Fix Queue.get_nowait(). --- Lib/test/support/interpreters/queues.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib/test/support/interpreters/queues.py b/Lib/test/support/interpreters/queues.py index 2cc616be337a50..f9978f0bec5a62 100644 --- a/Lib/test/support/interpreters/queues.py +++ b/Lib/test/support/interpreters/queues.py @@ -215,10 +215,15 @@ def get_nowait(self): is the same as get(). """ try: - return _queues.get(self._id) + obj, fmt = _queues.get(self._id) except _queues.QueueEmpty as exc: exc.__class__ = QueueEmpty raise # re-raise + if fmt == _PICKLED: + obj = pickle.loads(obj) + else: + assert fmt == _SHARED_ONLY + return obj _queues._register_queue_type(Queue) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy