]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41919, test_codecs: Move codecs.register calls to setUp() (GH-22513)
authorHai Shi <shihai1992@gmail.com>
Fri, 16 Oct 2020 08:34:15 +0000 (16:34 +0800)
committerGitHub <noreply@github.com>
Fri, 16 Oct 2020 08:34:15 +0000 (10:34 +0200)
* Move the codecs' (un)register operation to testcases.
* Remove _codecs._forget_codec() and _PyCodec_Forget()

Lib/test/test_charmapcodec.py
Lib/test/test_codecs.py
Lib/test/test_io.py
Lib/test/test_unicode.py
Modules/_codecsmodule.c
Modules/clinic/_codecsmodule.c.h
Python/codecs.c

index 0d4594d8c05f2cfc4698e0a3dd9a3c2db55f42d2..3f628902a1fd31f13f47e42897c2e9bb5d5ffc16 100644 (file)
@@ -20,12 +20,15 @@ def codec_search_function(encoding):
         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')
index 09ceef76eb098da9f3cf6429fc35fd569b3f082d..9be8281ce5af5cac95dd5a82fc2e9e01ec3989d9 100644 (file)
@@ -2754,29 +2754,14 @@ _TEST_CODECS = {}
 
 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 @@ class ExceptionChainingTest(unittest.TestCase):
         _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,
index 85fac30e300a659cff924cddae46c4f8469f8398..fbaea3aaec3cbe48f35e23483484f8db8b8550ec 100644 (file)
@@ -2529,10 +2529,6 @@ class StatefulIncrementalDecoder(codecs.IncrementalDecoder):
                 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 @@ class TextIOWrapperTest(unittest.TestCase):
         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)
index d485bc7ede2b923182f89672148f4b98d74f3aee..90b0965582272c36d5a9c59c1c6eb4695415f155 100644 (file)
@@ -36,7 +36,6 @@ def search_function(encoding):
         return (encode2, decode2, None, None)
     else:
         return None
-codecs.register(search_function)
 
 def duplicate_string(text):
     """
@@ -58,6 +57,10 @@ class UnicodeTest(string_tests.CommonTest,
 
     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)
index 08a3d4ab024cc2d44df01c33d3e0ed9138d68dad..2e8cb97fe77c920f54f21003ae6119306f9791d5 100644 (file)
@@ -160,25 +160,6 @@ _codecs_decode_impl(PyObject *module, PyObject *obj, const char *encoding,
 
 /* --- 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 @@ static PyMethodDef _codecs_functions[] = {
     _CODECS_CODE_PAGE_DECODE_METHODDEF
     _CODECS_REGISTER_ERROR_METHODDEF
     _CODECS_LOOKUP_ERROR_METHODDEF
-    _CODECS__FORGET_CODEC_METHODDEF
     {NULL, NULL}                /* sentinel */
 };
 
index e2ebb6861299e460b320b22c6f1103df5af1760b..43378f94f984501776d0da5f9c027e651d9875bd 100644 (file)
@@ -217,43 +217,6 @@ exit:
     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 @@ exit:
 #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]*/
index a8233a73c4ed3f51886b24fa178f71fe41c7c8bd..ade14187204f09ab771c9e4a29221bee35aa4cfd 100644 (file)
@@ -208,31 +208,6 @@ PyObject *_PyCodec_Lookup(const char *encoding)
     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)