summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_interpreters
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2024-03-05 15:54:46 (GMT)
committerGitHub <noreply@github.com>2024-03-05 15:54:46 (GMT)
commit4402b3cbcf8323bfa908ef86a687a5a7d46d27f3 (patch)
treed14e09be12129a9548655a6ca14d6279ee5081b6 /Lib/test/test_interpreters
parentbdba8ef42b15e651dc23374a08143cc2b4c4657d (diff)
downloadcpython-4402b3cbcf8323bfa908ef86a687a5a7d46d27f3.zip
cpython-4402b3cbcf8323bfa908ef86a687a5a7d46d27f3.tar.gz
cpython-4402b3cbcf8323bfa908ef86a687a5a7d46d27f3.tar.bz2
gh-76785: Minor Improvements to "interpreters" Module (gh-116328)
This includes adding pickle support to various classes, and small changes to improve the maintainability of the low-level _xxinterpqueues module.
Diffstat (limited to 'Lib/test/test_interpreters')
-rw-r--r--Lib/test/test_interpreters/test_api.py7
-rw-r--r--Lib/test/test_interpreters/test_channels.py13
-rw-r--r--Lib/test/test_interpreters/test_queues.py71
3 files changed, 87 insertions, 4 deletions
diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py
index 363143f..3cde9bd 100644
--- a/Lib/test/test_interpreters/test_api.py
+++ b/Lib/test/test_interpreters/test_api.py
@@ -1,4 +1,5 @@
import os
+import pickle
import threading
from textwrap import dedent
import unittest
@@ -261,6 +262,12 @@ class InterpreterObjectTests(TestBase):
self.assertEqual(interp1, interp1)
self.assertNotEqual(interp1, interp2)
+ def test_pickle(self):
+ interp = interpreters.create()
+ data = pickle.dumps(interp)
+ unpickled = pickle.loads(data)
+ self.assertEqual(unpickled, interp)
+
class TestInterpreterIsRunning(TestBase):
diff --git a/Lib/test/test_interpreters/test_channels.py b/Lib/test/test_interpreters/test_channels.py
index 57204e2..7e0b828 100644
--- a/Lib/test/test_interpreters/test_channels.py
+++ b/Lib/test/test_interpreters/test_channels.py
@@ -1,4 +1,5 @@
import importlib
+import pickle
import threading
from textwrap import dedent
import unittest
@@ -100,6 +101,12 @@ class TestRecvChannelAttrs(TestBase):
self.assertEqual(ch1, ch1)
self.assertNotEqual(ch1, ch2)
+ def test_pickle(self):
+ ch, _ = channels.create()
+ data = pickle.dumps(ch)
+ unpickled = pickle.loads(data)
+ self.assertEqual(unpickled, ch)
+
class TestSendChannelAttrs(TestBase):
@@ -125,6 +132,12 @@ class TestSendChannelAttrs(TestBase):
self.assertEqual(ch1, ch1)
self.assertNotEqual(ch1, ch2)
+ def test_pickle(self):
+ _, ch = channels.create()
+ data = pickle.dumps(ch)
+ unpickled = pickle.loads(data)
+ self.assertEqual(unpickled, ch)
+
class TestSendRecv(TestBase):
diff --git a/Lib/test/test_interpreters/test_queues.py b/Lib/test/test_interpreters/test_queues.py
index 0a1fdb4..d16d294 100644
--- a/Lib/test/test_interpreters/test_queues.py
+++ b/Lib/test/test_interpreters/test_queues.py
@@ -1,20 +1,25 @@
import importlib
+import pickle
import threading
from textwrap import dedent
import unittest
import time
-from test.support import import_helper
+from test.support import import_helper, Py_DEBUG
# Raise SkipTest if subinterpreters not supported.
_queues = import_helper.import_module('_xxinterpqueues')
from test.support import interpreters
from test.support.interpreters import queues
-from .utils import _run_output, TestBase
+from .utils import _run_output, TestBase as _TestBase
-class TestBase(TestBase):
+def get_num_queues():
+ return len(_queues.list_all())
+
+
+class TestBase(_TestBase):
def tearDown(self):
- for qid in _queues.list_all():
+ for qid, _ in _queues.list_all():
try:
_queues.destroy(qid)
except Exception:
@@ -34,6 +39,58 @@ class LowLevelTests(TestBase):
# See gh-115490 (https://github.com/python/cpython/issues/115490).
importlib.reload(queues)
+ def test_create_destroy(self):
+ qid = _queues.create(2, 0)
+ _queues.destroy(qid)
+ self.assertEqual(get_num_queues(), 0)
+ with self.assertRaises(queues.QueueNotFoundError):
+ _queues.get(qid)
+ with self.assertRaises(queues.QueueNotFoundError):
+ _queues.destroy(qid)
+
+ def test_not_destroyed(self):
+ # It should have cleaned up any remaining queues.
+ stdout, stderr = self.assert_python_ok(
+ '-c',
+ dedent(f"""
+ import {_queues.__name__} as _queues
+ _queues.create(2, 0)
+ """),
+ )
+ self.assertEqual(stdout, '')
+ if Py_DEBUG:
+ self.assertNotEqual(stderr, '')
+ else:
+ self.assertEqual(stderr, '')
+
+ def test_bind_release(self):
+ with self.subTest('typical'):
+ qid = _queues.create(2, 0)
+ _queues.bind(qid)
+ _queues.release(qid)
+ self.assertEqual(get_num_queues(), 0)
+
+ with self.subTest('bind too much'):
+ qid = _queues.create(2, 0)
+ _queues.bind(qid)
+ _queues.bind(qid)
+ _queues.release(qid)
+ _queues.destroy(qid)
+ self.assertEqual(get_num_queues(), 0)
+
+ with self.subTest('nested'):
+ qid = _queues.create(2, 0)
+ _queues.bind(qid)
+ _queues.bind(qid)
+ _queues.release(qid)
+ _queues.release(qid)
+ self.assertEqual(get_num_queues(), 0)
+
+ with self.subTest('release without binding'):
+ qid = _queues.create(2, 0)
+ with self.assertRaises(queues.QueueError):
+ _queues.release(qid)
+
class QueueTests(TestBase):
@@ -127,6 +184,12 @@ class QueueTests(TestBase):
self.assertEqual(queue1, queue1)
self.assertNotEqual(queue1, queue2)
+ def test_pickle(self):
+ queue = queues.create()
+ data = pickle.dumps(queue)
+ unpickled = pickle.loads(data)
+ self.assertEqual(unpickled, queue)
+
class TestQueueOps(TestBase):