[3.13] gh-122191: Fix test_warnings failure if run with -Werror (GH-122222) (GH-122256)

__spec__.loader is now required in the module globals (see gh-86298).
(cherry picked from commit 9b4fe9b718)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2024-07-25 09:28:33 +02:00 committed by GitHub
parent 4e7716554b
commit 94db4cc5e6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 23 additions and 13 deletions

View File

@ -1,6 +1,7 @@
from contextlib import contextmanager from contextlib import contextmanager
import linecache import linecache
import os import os
import importlib
import inspect import inspect
from io import StringIO from io import StringIO
import re import re
@ -885,37 +886,46 @@ class _WarningsTests(BaseTest, unittest.TestCase):
# warn_explicit() should neither raise a SystemError nor cause an # warn_explicit() should neither raise a SystemError nor cause an
# assertion failure, in case the return value of get_source() has a # assertion failure, in case the return value of get_source() has a
# bad splitlines() method. # 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: class BadLoader:
def get_source(self, fullname): def get_source(self, fullname):
class BadSource(str): get_source_called.append(splitlines_ret_val)
def splitlines(self):
return splitlines_ret_val
return BadSource('spam') return BadSource('spam')
return BadLoader()
loader = BadLoader()
spec = importlib.machinery.ModuleSpec('foobar', loader)
return {'__loader__': loader,
'__spec__': spec,
'__name__': 'foobar'}
wmod = self.module wmod = self.module
with original_warnings.catch_warnings(module=wmod): with original_warnings.catch_warnings(module=wmod):
wmod.filterwarnings('default', category=UserWarning) wmod.filterwarnings('default', category=UserWarning)
linecache.clearcache()
with support.captured_stderr() as stderr: with support.captured_stderr() as stderr:
wmod.warn_explicit( wmod.warn_explicit(
'foo', UserWarning, 'bar', 1, 'foo', UserWarning, 'bar', 1,
module_globals={'__loader__': get_bad_loader(42), module_globals=get_module_globals(splitlines_ret_val=42))
'__name__': 'foobar'})
self.assertIn('UserWarning: foo', stderr.getvalue()) self.assertIn('UserWarning: foo', stderr.getvalue())
self.assertEqual(get_source_called, [42])
show = wmod._showwarnmsg linecache.clearcache()
try: with support.swap_attr(wmod, '_showwarnmsg', None):
del wmod._showwarnmsg del wmod._showwarnmsg
with support.captured_stderr() as stderr: with support.captured_stderr() as stderr:
wmod.warn_explicit( wmod.warn_explicit(
'eggs', UserWarning, 'bar', 1, 'eggs', UserWarning, 'bar', 1,
module_globals={'__loader__': get_bad_loader([42]), module_globals=get_module_globals(splitlines_ret_val=[42]))
'__name__': 'foobar'})
self.assertIn('UserWarning: eggs', stderr.getvalue()) self.assertIn('UserWarning: eggs', stderr.getvalue())
finally: self.assertEqual(get_source_called, [42, [42]])
wmod._showwarnmsg = show linecache.clearcache()
@support.cpython_only @support.cpython_only
def test_issue31411(self): def test_issue31411(self):