bpo-41919, test_codecs: Move codecs.register calls to setUp() (GH-22513)
* Move the codecs' (un)register operation to testcases.
* Remove _codecs._forget_codec() and _PyCodec_Forget()
diff --git a/Lib/test/test_charmapcodec.py b/Lib/test/test_charmapcodec.py
index 0d4594d..3f62890 100644
--- a/Lib/test/test_charmapcodec.py
+++ b/Lib/test/test_charmapcodec.py
@@ -20,12 +20,15 @@
return tuple(testcodec.getregentry())
return None
-codecs.register(codec_search_function)
-
# test codec's name (see test/testcodec.py)
codecname = 'testcodec'
class CharmapCodecTest(unittest.TestCase):
+
+ def setUp(self):
+ codecs.register(codec_search_function)
+ self.addCleanup(codecs.unregister, codec_search_function)
+
def test_constructorx(self):
self.assertEqual(str(b'abc', codecname), 'abc')
self.assertEqual(str(b'xdef', codecname), 'abcdef')
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index 09ceef7..9be8281 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -2754,29 +2754,14 @@
def _get_test_codec(codec_name):
return _TEST_CODECS.get(codec_name)
-codecs.register(_get_test_codec) # Returns None, not usable as a decorator
-
-try:
- # Issue #22166: Also need to clear the internal cache in CPython
- from _codecs import _forget_codec
-except ImportError:
- def _forget_codec(codec_name):
- pass
class ExceptionChainingTest(unittest.TestCase):
def setUp(self):
- # There's no way to unregister a codec search function, so we just
- # ensure we render this one fairly harmless after the test
- # case finishes by using the test case repr as the codec name
- # The codecs module normalizes codec names, although this doesn't
- # appear to be formally documented...
- # We also make sure we use a truly unique id for the custom codec
- # to avoid issues with the codec cache when running these tests
- # multiple times (e.g. when hunting for refleaks)
- unique_id = repr(self) + str(id(self))
- self.codec_name = encodings.normalize_encoding(unique_id).lower()
+ self.codec_name = 'exception_chaining_test'
+ codecs.register(_get_test_codec)
+ self.addCleanup(codecs.unregister, _get_test_codec)
# We store the object to raise on the instance because of a bad
# interaction between the codec caching (which means we can't
@@ -2791,10 +2776,6 @@
_TEST_CODECS.pop(self.codec_name, None)
# Issue #22166: Also pop from caches to avoid appearance of ref leaks
encodings._cache.pop(self.codec_name, None)
- try:
- _forget_codec(self.codec_name)
- except KeyError:
- pass
def set_codec(self, encode, decode):
codec_info = codecs.CodecInfo(encode, decode,
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 85fac30..fbaea3a 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -2529,10 +2529,6 @@
streamreader=None, streamwriter=None,
incrementaldecoder=cls)
-# Register the previous decoder for testing.
-# Disabled by default, tests will enable it.
-codecs.register(StatefulIncrementalDecoder.lookupTestDecoder)
-
class StatefulIncrementalDecoderTest(unittest.TestCase):
"""
@@ -2583,6 +2579,9 @@
self.testdata = b"AAA\r\nBBB\rCCC\r\nDDD\nEEE\r\n"
self.normalized = b"AAA\nBBB\nCCC\nDDD\nEEE\n".decode("ascii")
os_helper.unlink(os_helper.TESTFN)
+ codecs.register(StatefulIncrementalDecoder.lookupTestDecoder)
+ self.addCleanup(codecs.unregister,
+ StatefulIncrementalDecoder.lookupTestDecoder)
def tearDown(self):
os_helper.unlink(os_helper.TESTFN)
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
index d485bc7..90b0965 100644
--- a/Lib/test/test_unicode.py
+++ b/Lib/test/test_unicode.py
@@ -36,7 +36,6 @@
return (encode2, decode2, None, None)
else:
return None
-codecs.register(search_function)
def duplicate_string(text):
"""
@@ -58,6 +57,10 @@
type2test = str
+ def setUp(self):
+ codecs.register(search_function)
+ self.addCleanup(codecs.unregister, search_function)
+
def checkequalnofix(self, result, object, methodname, *args):
method = getattr(object, methodname)
realresult = method(*args)
diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c
index 08a3d4a..2e8cb97 100644
--- a/Modules/_codecsmodule.c
+++ b/Modules/_codecsmodule.c
@@ -160,25 +160,6 @@
/* --- Helpers ------------------------------------------------------------ */
-/*[clinic input]
-_codecs._forget_codec
-
- encoding: str
- /
-
-Purge the named codec from the internal codec lookup cache
-[clinic start generated code]*/
-
-static PyObject *
-_codecs__forget_codec_impl(PyObject *module, const char *encoding)
-/*[clinic end generated code: output=0bde9f0a5b084aa2 input=18d5d92d0e386c38]*/
-{
- if (_PyCodec_Forget(encoding) < 0) {
- return NULL;
- };
- Py_RETURN_NONE;
-}
-
static
PyObject *codec_tuple(PyObject *decoded,
Py_ssize_t len)
@@ -1057,7 +1038,6 @@
_CODECS_CODE_PAGE_DECODE_METHODDEF
_CODECS_REGISTER_ERROR_METHODDEF
_CODECS_LOOKUP_ERROR_METHODDEF
- _CODECS__FORGET_CODEC_METHODDEF
{NULL, NULL} /* sentinel */
};
diff --git a/Modules/clinic/_codecsmodule.c.h b/Modules/clinic/_codecsmodule.c.h
index e2ebb68..43378f9 100644
--- a/Modules/clinic/_codecsmodule.c.h
+++ b/Modules/clinic/_codecsmodule.c.h
@@ -217,43 +217,6 @@
return return_value;
}
-PyDoc_STRVAR(_codecs__forget_codec__doc__,
-"_forget_codec($module, encoding, /)\n"
-"--\n"
-"\n"
-"Purge the named codec from the internal codec lookup cache");
-
-#define _CODECS__FORGET_CODEC_METHODDEF \
- {"_forget_codec", (PyCFunction)_codecs__forget_codec, METH_O, _codecs__forget_codec__doc__},
-
-static PyObject *
-_codecs__forget_codec_impl(PyObject *module, const char *encoding);
-
-static PyObject *
-_codecs__forget_codec(PyObject *module, PyObject *arg)
-{
- PyObject *return_value = NULL;
- const char *encoding;
-
- if (!PyUnicode_Check(arg)) {
- _PyArg_BadArgument("_forget_codec", "argument", "str", arg);
- goto exit;
- }
- Py_ssize_t encoding_length;
- encoding = PyUnicode_AsUTF8AndSize(arg, &encoding_length);
- if (encoding == NULL) {
- goto exit;
- }
- if (strlen(encoding) != (size_t)encoding_length) {
- PyErr_SetString(PyExc_ValueError, "embedded null character");
- goto exit;
- }
- return_value = _codecs__forget_codec_impl(module, encoding);
-
-exit:
- return return_value;
-}
-
PyDoc_STRVAR(_codecs_escape_decode__doc__,
"escape_decode($module, data, errors=None, /)\n"
"--\n"
@@ -2838,4 +2801,4 @@
#ifndef _CODECS_CODE_PAGE_ENCODE_METHODDEF
#define _CODECS_CODE_PAGE_ENCODE_METHODDEF
#endif /* !defined(_CODECS_CODE_PAGE_ENCODE_METHODDEF) */
-/*[clinic end generated code: output=9a97e2ddf3e69072 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=557c3b37e4c492ac input=a9049054013a1b77]*/
diff --git a/Python/codecs.c b/Python/codecs.c
index a8233a7..ade1418 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -208,31 +208,6 @@
return NULL;
}
-int _PyCodec_Forget(const char *encoding)
-{
- PyObject *v;
- int result;
-
- PyInterpreterState *interp = _PyInterpreterState_GET();
- if (interp->codec_search_path == NULL) {
- return -1;
- }
-
- /* Convert the encoding to a normalized Python string: all
- characters are converted to lower case, spaces and hyphens are
- replaced with underscores. */
- v = normalizestring(encoding);
- if (v == NULL) {
- return -1;
- }
-
- /* Drop the named codec from the internal cache */
- result = PyDict_DelItem(interp->codec_search_cache, v);
- Py_DECREF(v);
-
- return result;
-}
-
/* Codec registry encoding check API. */
int PyCodec_KnownEncoding(const char *encoding)