diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2024-07-25 06:57:22 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-25 06:57:22 (GMT) |
commit | 9b4fe9b718f27352ba0c1cf1184f5b90d77d7df4 (patch) | |
tree | bf4135378eaf39a3017a74157c7dc4901a15e8e6 /Lib/test/test_warnings | |
parent | 5592399313c963c110280a7c98de974889e1d353 (diff) | |
download | cpython-9b4fe9b718f27352ba0c1cf1184f5b90d77d7df4.zip cpython-9b4fe9b718f27352ba0c1cf1184f5b90d77d7df4.tar.gz cpython-9b4fe9b718f27352ba0c1cf1184f5b90d77d7df4.tar.bz2 |
gh-122191: Fix test_warnings failure if run with -Werror (GH-122222)
__spec__.loader is now required in the module globals (see gh-86298).
Diffstat (limited to 'Lib/test/test_warnings')
-rw-r--r-- | Lib/test/test_warnings/__init__.py | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 7d04371..95515a4 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -1,6 +1,7 @@ from contextlib import contextmanager import linecache import os +import importlib import inspect from io import StringIO import re @@ -887,37 +888,46 @@ class _WarningsTests(BaseTest, unittest.TestCase): # warn_explicit() should neither raise a SystemError nor cause an # assertion failure, in case the return value of get_source() has a # bad splitlines() method. - def get_bad_loader(splitlines_ret_val): + get_source_called = [] + def get_module_globals(*, splitlines_ret_val): + class BadSource(str): + def splitlines(self): + return splitlines_ret_val + class BadLoader: def get_source(self, fullname): - class BadSource(str): - def splitlines(self): - return splitlines_ret_val + get_source_called.append(splitlines_ret_val) return BadSource('spam') - return BadLoader() + + loader = BadLoader() + spec = importlib.machinery.ModuleSpec('foobar', loader) + return {'__loader__': loader, + '__spec__': spec, + '__name__': 'foobar'} + wmod = self.module with original_warnings.catch_warnings(module=wmod): wmod.filterwarnings('default', category=UserWarning) + linecache.clearcache() with support.captured_stderr() as stderr: wmod.warn_explicit( 'foo', UserWarning, 'bar', 1, - module_globals={'__loader__': get_bad_loader(42), - '__name__': 'foobar'}) + module_globals=get_module_globals(splitlines_ret_val=42)) self.assertIn('UserWarning: foo', stderr.getvalue()) + self.assertEqual(get_source_called, [42]) - show = wmod._showwarnmsg - try: + linecache.clearcache() + with support.swap_attr(wmod, '_showwarnmsg', None): del wmod._showwarnmsg with support.captured_stderr() as stderr: wmod.warn_explicit( 'eggs', UserWarning, 'bar', 1, - module_globals={'__loader__': get_bad_loader([42]), - '__name__': 'foobar'}) + module_globals=get_module_globals(splitlines_ret_val=[42])) self.assertIn('UserWarning: eggs', stderr.getvalue()) - finally: - wmod._showwarnmsg = show + self.assertEqual(get_source_called, [42, [42]]) + linecache.clearcache() @support.cpython_only def test_issue31411(self): |