diff options
author | Christian Heimes <christian@cheimes.de> | 2013-12-21 15:19:57 (GMT) |
---|---|---|
committer | Christian Heimes <christian@cheimes.de> | 2013-12-21 15:19:57 (GMT) |
commit | 266772abe90779690753fb0b38d5cd81a5be6283 (patch) | |
tree | 74b359c2e4754b7c87cdb54aed0feced267f594d /Lib/test | |
parent | af01f668173d4061893148b54a0f01b91c7716c2 (diff) | |
parent | 712cb734bda0227861630b365a97dfec88798c3b (diff) | |
download | cpython-266772abe90779690753fb0b38d5cd81a5be6283.zip cpython-266772abe90779690753fb0b38d5cd81a5be6283.tar.gz cpython-266772abe90779690753fb0b38d5cd81a5be6283.tar.bz2 |
merge
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_io.py | 41 | ||||
-rw-r--r-- | Lib/test/test_logging.py | 20 |
2 files changed, 60 insertions, 1 deletions
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 344425b..355a33e 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -36,6 +36,7 @@ import _testcapi from collections import deque, UserList from itertools import cycle, count from test import support +from test.script_helper import assert_python_ok import codecs import io # C implementation of io @@ -2589,8 +2590,46 @@ class TextIOWrapperTest(unittest.TestCase): encoding='quopri_codec') self.assertRaises(TypeError, t.read) + def _check_create_at_shutdown(self, **kwargs): + # Issue #20037: creating a TextIOWrapper at shutdown + # shouldn't crash the interpreter. + iomod = self.io.__name__ + code = """if 1: + import codecs + import {iomod} as io + + # Avoid looking up codecs at shutdown + codecs.lookup('utf-8') + + class C: + def __init__(self): + self.buf = io.BytesIO() + def __del__(self): + io.TextIOWrapper(self.buf, **{kwargs}) + print("ok") + c = C() + """.format(iomod=iomod, kwargs=kwargs) + return assert_python_ok("-c", code) + + def test_create_at_shutdown_without_encoding(self): + rc, out, err = self._check_create_at_shutdown() + if err: + # Can error out with a RuntimeError if the module state + # isn't found. + self.assertIn("RuntimeError: could not find io module state", + err.decode()) + else: + self.assertEqual("ok", out.decode().strip()) + + def test_create_at_shutdown_with_encoding(self): + rc, out, err = self._check_create_at_shutdown(encoding='utf-8', + errors='strict') + self.assertFalse(err) + self.assertEqual("ok", out.decode().strip()) + class CTextIOWrapperTest(TextIOWrapperTest): + io = io def test_initialization(self): r = self.BytesIO(b"\xc3\xa9\n\n") @@ -2634,7 +2673,7 @@ class CTextIOWrapperTest(TextIOWrapperTest): class PyTextIOWrapperTest(TextIOWrapperTest): - pass + io = pyio class IncrementalNewlineDecoderTest(unittest.TestCase): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index ce3f84c..3765f36 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -41,6 +41,7 @@ import socket import struct import sys import tempfile +from test.script_helper import assert_python_ok from test.support import (captured_stdout, run_with_locale, run_unittest, patch, requires_zlib, TestHandler, Matcher) import textwrap @@ -3397,6 +3398,25 @@ class ModuleLevelMiscTest(BaseTest): logging.setLoggerClass(logging.Logger) self.assertEqual(logging.getLoggerClass(), logging.Logger) + def test_logging_at_shutdown(self): + # Issue #20037 + code = """if 1: + import logging + + class A: + def __del__(self): + try: + raise ValueError("some error") + except Exception: + logging.exception("exception in __del__") + + a = A()""" + rc, out, err = assert_python_ok("-c", code) + err = err.decode() + self.assertIn("exception in __del__", err) + self.assertIn("ValueError: some error", err) + + class LogRecordTest(BaseTest): def test_str_rep(self): r = logging.makeLogRecord({}) |