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()
This commit is contained in:
parent
cf693e537d
commit
c9f696cb96
|
@ -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')
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
};
|
||||
|
||||
|
|
|
@ -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]*/
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue