]> granicus.if.org Git - python/commitdiff
Close 19609: narrow scope of codec exc chaining
authorNick Coghlan <ncoghlan@gmail.com>
Fri, 15 Nov 2013 11:47:37 +0000 (21:47 +1000)
committerNick Coghlan <ncoghlan@gmail.com>
Fri, 15 Nov 2013 11:47:37 +0000 (21:47 +1000)
Lib/test/test_codecs.py
Python/codecs.c

index f43ac3ad2b8531ce076a368d9efaec6cd1f9e0e1..235a91a6230f35607a2ef3a2324dffa9432c5289 100644 (file)
@@ -2435,22 +2435,22 @@ class ExceptionChainingTest(unittest.TestCase):
         self.check_wrapped(RuntimeError(msg), msg)
 
     @contextlib.contextmanager
-    def assertNotWrapped(self, operation, exc_type, msg):
+    def assertNotWrapped(self, operation, exc_type, msg_re, msg=None):
+        if msg is None:
+            msg = msg_re
         with self.assertRaisesRegex(exc_type, msg) as caught:
             yield caught
-        actual_msg = str(caught.exception)
-        self.assertNotIn(operation, actual_msg)
-        self.assertNotIn(self.codec_name, actual_msg)
+        self.assertEqual(str(caught.exception), msg)
 
-    def check_not_wrapped(self, obj_to_raise, msg):
+    def check_not_wrapped(self, obj_to_raise, msg_re, msg=None):
         self.set_codec(obj_to_raise)
-        with self.assertNotWrapped("encoding", RuntimeError, msg):
+        with self.assertNotWrapped("encoding", RuntimeError, msg_re, msg):
             "str input".encode(self.codec_name)
-        with self.assertNotWrapped("encoding", RuntimeError, msg):
+        with self.assertNotWrapped("encoding", RuntimeError, msg_re, msg):
             codecs.encode("str input", self.codec_name)
-        with self.assertNotWrapped("decoding", RuntimeError, msg):
+        with self.assertNotWrapped("decoding", RuntimeError, msg_re, msg):
             b"bytes input".decode(self.codec_name)
-        with self.assertNotWrapped("decoding", RuntimeError, msg):
+        with self.assertNotWrapped("decoding", RuntimeError, msg_re, msg):
             codecs.decode(b"bytes input", self.codec_name)
 
     def test_init_override_is_not_wrapped(self):
@@ -2475,8 +2475,23 @@ class ExceptionChainingTest(unittest.TestCase):
         self.check_not_wrapped(RuntimeError(1), "1")
 
     def test_multiple_args_is_not_wrapped(self):
-        msg = "\('a', 'b', 'c'\)"
-        self.check_not_wrapped(RuntimeError('a', 'b', 'c'), msg)
+        msg_re = "\('a', 'b', 'c'\)"
+        msg = "('a', 'b', 'c')"
+        self.check_not_wrapped(RuntimeError('a', 'b', 'c'), msg_re, msg)
+
+    # http://bugs.python.org/issue19609
+    def test_codec_lookup_failure_not_wrapped(self):
+        msg = "unknown encoding: %s" % self.codec_name
+        # The initial codec lookup should not be wrapped
+        with self.assertNotWrapped("encoding", LookupError, msg):
+            "str input".encode(self.codec_name)
+        with self.assertNotWrapped("encoding", LookupError, msg):
+            codecs.encode("str input", self.codec_name)
+        with self.assertNotWrapped("decoding", LookupError, msg):
+            b"bytes input".decode(self.codec_name)
+        with self.assertNotWrapped("decoding", LookupError, msg):
+            codecs.decode(b"bytes input", self.codec_name)
+
 
 
 @unittest.skipUnless(sys.platform == 'win32',
index e2edc269a85e04d8dfc1af8afc08b677a7d30b4a..fe0cab4f7fb6e9b4f1023b966a319f06ed8d47b9 100644 (file)
@@ -370,8 +370,10 @@ PyObject *PyCodec_Encode(PyObject *object,
         goto onError;
 
     result = PyEval_CallObject(encoder, args);
-    if (result == NULL)
+    if (result == NULL) {
+        wrap_codec_error("encoding", encoding);
         goto onError;
+    }
 
     if (!PyTuple_Check(result) ||
         PyTuple_GET_SIZE(result) != 2) {
@@ -392,7 +394,6 @@ PyObject *PyCodec_Encode(PyObject *object,
     Py_XDECREF(result);
     Py_XDECREF(args);
     Py_XDECREF(encoder);
-    wrap_codec_error("encoding", encoding);
     return NULL;
 }
 
@@ -418,8 +419,10 @@ PyObject *PyCodec_Decode(PyObject *object,
         goto onError;
 
     result = PyEval_CallObject(decoder,args);
-    if (result == NULL)
+    if (result == NULL) {
+        wrap_codec_error("decoding", encoding);
         goto onError;
+    }
     if (!PyTuple_Check(result) ||
         PyTuple_GET_SIZE(result) != 2) {
         PyErr_SetString(PyExc_TypeError,
@@ -439,7 +442,6 @@ PyObject *PyCodec_Decode(PyObject *object,
     Py_XDECREF(args);
     Py_XDECREF(decoder);
     Py_XDECREF(result);
-    wrap_codec_error("decoding", encoding);
     return NULL;
 }