summaryrefslogtreecommitdiff
path: root/Lib/test/test_warnings/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_warnings/__init__.py')
-rw-r--r--Lib/test/test_warnings/__init__.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py
index 84a6fb5842..0cddf4a2f4 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -2,7 +2,9 @@ from contextlib import contextmanager
import linecache
import os
from io import StringIO
+import re
import sys
+import textwrap
import unittest
from test import support
from test.support.script_helper import assert_python_ok, assert_python_failure
@@ -720,6 +722,17 @@ class _WarningsTests(BaseTest, unittest.TestCase):
result = stream.getvalue()
self.assertIn(text, result)
+ def test_showwarnmsg_missing(self):
+ # Test that _showwarnmsg() missing is okay.
+ text = 'del _showwarnmsg test'
+ with original_warnings.catch_warnings(module=self.module):
+ self.module.filterwarnings("always", category=UserWarning)
+ del self.module._showwarnmsg
+ with support.captured_output('stderr') as stream:
+ self.module.warn(text)
+ result = stream.getvalue()
+ self.assertIn(text, result)
+
def test_showwarning_not_callable(self):
with original_warnings.catch_warnings(module=self.module):
self.module.filterwarnings("always", category=UserWarning)
@@ -821,12 +834,44 @@ class WarningsDisplayTests(BaseTest):
file_object, expected_file_line)
self.assertEqual(expect, file_object.getvalue())
+
class CWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase):
module = c_warnings
class PyWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase):
module = py_warnings
+ def test_tracemalloc(self):
+ self.addCleanup(support.unlink, support.TESTFN)
+
+ with open(support.TESTFN, 'w') as fp:
+ fp.write(textwrap.dedent("""
+ def func():
+ f = open(__file__)
+ # Emit ResourceWarning
+ f = None
+
+ func()
+ """))
+
+ res = assert_python_ok('-Wd', '-X', 'tracemalloc=2', support.TESTFN)
+
+ stderr = res.err.decode('ascii', 'replace')
+ # normalize newlines
+ stderr = '\n'.join(stderr.splitlines())
+ stderr = re.sub('<.*>', '<...>', stderr)
+ expected = textwrap.dedent('''
+ {fname}:5: ResourceWarning: unclosed file <...>
+ f = None
+ Object allocated at (most recent call first):
+ File "{fname}", lineno 3
+ f = open(__file__)
+ File "{fname}", lineno 7
+ func()
+ ''')
+ expected = expected.format(fname=support.TESTFN).strip()
+ self.assertEqual(stderr, expected)
+
class CatchWarningTests(BaseTest):
@@ -899,6 +944,51 @@ class CatchWarningTests(BaseTest):
self.assertTrue(wmod.filters is not orig_filters)
self.assertTrue(wmod.filters is orig_filters)
+ def test_record_override_showwarning_before(self):
+ # Issue #28835: If warnings.showwarning() was overriden, make sure
+ # that catch_warnings(record=True) overrides it again.
+ text = "This is a warning"
+ wmod = self.module
+ my_log = []
+
+ def my_logger(message, category, filename, lineno, file=None, line=None):
+ nonlocal my_log
+ my_log.append(message)
+
+ # Override warnings.showwarning() before calling catch_warnings()
+ with support.swap_attr(wmod, 'showwarning', my_logger):
+ with wmod.catch_warnings(module=wmod, record=True) as log:
+ self.assertIsNot(wmod.showwarning, my_logger)
+
+ wmod.simplefilter("always")
+ wmod.warn(text)
+
+ self.assertIs(wmod.showwarning, my_logger)
+
+ self.assertEqual(len(log), 1, log)
+ self.assertEqual(log[0].message.args[0], text)
+ self.assertEqual(my_log, [])
+
+ def test_record_override_showwarning_inside(self):
+ # Issue #28835: It is possible to override warnings.showwarning()
+ # in the catch_warnings(record=True) context manager.
+ text = "This is a warning"
+ wmod = self.module
+ my_log = []
+
+ def my_logger(message, category, filename, lineno, file=None, line=None):
+ nonlocal my_log
+ my_log.append(message)
+
+ with wmod.catch_warnings(module=wmod, record=True) as log:
+ wmod.simplefilter("always")
+ wmod.showwarning = my_logger
+ wmod.warn(text)
+
+ self.assertEqual(len(my_log), 1, my_log)
+ self.assertEqual(my_log[0].args[0], text)
+ self.assertEqual(log, [])
+
def test_check_warnings(self):
# Explicit tests for the test.support convenience wrapper
wmod = self.module