diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2020-06-11 11:34:42 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-11 14:34:42 -0400 |
commit | f881c869753fb2b1b7aef353416893190251c539 (patch) | |
tree | f3fa819f05fb4bc2cae6132c121c56a81610ccdf | |
parent | [3.7] bpo-40895: Update weakref documentation to remove old warnings (GH-2068... (diff) | |
download | cpython-f881c869753fb2b1b7aef353416893190251c539.tar.gz cpython-f881c869753fb2b1b7aef353416893190251c539.tar.bz2 cpython-f881c869753fb2b1b7aef353416893190251c539.zip |
bpo-29620: iterate over a copy of sys.modules (GH-4800) (GH-20817)
unittest.TestCase.assertWarns no longer raises a RuntimeException
when accessing a module's ``__warningregistry__`` causes importation of a new
module, or when a new module is imported in another thread.
(cherry picked from commit 46398fba4d66ad342cf2504ef947b5fb857423b2)
Co-authored-by: kernc <kerncece@gmail.com>
-rw-r--r-- | Lib/unittest/case.py | 2 | ||||
-rw-r--r-- | Lib/unittest/test/test_case.py | 15 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-08-21-16-20-33.bpo-29620.xxx666.rst | 3 |
3 files changed, 19 insertions, 1 deletions
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 24af2905764..d65ff1c5fba 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -227,7 +227,7 @@ class _AssertWarnsContext(_AssertRaisesBaseContext): def __enter__(self): # The __warningregistry__'s need to be in a pristine state for tests # to work properly. - for v in sys.modules.values(): + for v in list(sys.modules.values()): if getattr(v, '__warningregistry__', None): v.__warningregistry__ = {} self.warnings_manager = warnings.catch_warnings(record=True) diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 4fac8d59745..ff541f8cf05 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -8,6 +8,7 @@ import logging import warnings import weakref import inspect +import types from copy import deepcopy from test import support @@ -1352,6 +1353,20 @@ test case pass self.assertRaises(TypeError, self.assertWarnsRegex, MyWarn, lambda: True) + def testAssertWarnsModifySysModules(self): + # bpo-29620: handle modified sys.modules during iteration + class Foo(types.ModuleType): + @property + def __warningregistry__(self): + sys.modules['@bar@'] = 'bar' + + sys.modules['@foo@'] = Foo('foo') + try: + self.assertWarns(UserWarning, warnings.warn, 'expected') + finally: + del sys.modules['@foo@'] + del sys.modules['@bar@'] + def testAssertRaisesRegexMismatch(self): def Stub(): raise Exception('Unexpected') diff --git a/Misc/NEWS.d/next/Library/2018-08-21-16-20-33.bpo-29620.xxx666.rst b/Misc/NEWS.d/next/Library/2018-08-21-16-20-33.bpo-29620.xxx666.rst new file mode 100644 index 00000000000..d781919504e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-21-16-20-33.bpo-29620.xxx666.rst @@ -0,0 +1,3 @@ +:func:`~unittest.TestCase.assertWarns` no longer raises a ``RuntimeException`` +when accessing a module's ``__warningregistry__`` causes importation of a new +module, or when a new module is imported in another thread. Patch by Kernc. |