Commit 4d42f2b4 authored by Florent Xicluna's avatar Florent Xicluna

#7772: Fix test_py3kwarn. Now the test suite could pass with "-3" flag.

parent e30bc38c
...@@ -3,11 +3,26 @@ import sys ...@@ -3,11 +3,26 @@ import sys
from test.test_support import check_warnings, CleanImport, run_unittest from test.test_support import check_warnings, CleanImport, run_unittest
import warnings import warnings
from contextlib import nested
if not sys.py3kwarning: if not sys.py3kwarning:
raise unittest.SkipTest('%s must be run with the -3 flag' % __name__) raise unittest.SkipTest('%s must be run with the -3 flag' % __name__)
try:
from test.test_support import __warningregistry__ as _registry
except ImportError:
def check_deprecated_module(module_name):
return False
else:
past_warnings = _registry.keys()
del _registry
def check_deprecated_module(module_name):
"""Lookup the past warnings for module already loaded using
test_support.import_module(..., deprecated=True)
"""
return any(module_name in msg and ' removed' in msg
and issubclass(cls, DeprecationWarning)
and (' module' in msg or ' package' in msg)
for (msg, cls, line) in past_warnings)
def reset_module_registry(module): def reset_module_registry(module):
try: try:
registry = module.__warningregistry__ registry = module.__warningregistry__
...@@ -341,11 +356,10 @@ class TestStdlibRemovals(unittest.TestCase): ...@@ -341,11 +356,10 @@ class TestStdlibRemovals(unittest.TestCase):
def check_removal(self, module_name, optional=False): def check_removal(self, module_name, optional=False):
"""Make sure the specified module, when imported, raises a """Make sure the specified module, when imported, raises a
DeprecationWarning and specifies itself in the message.""" DeprecationWarning and specifies itself in the message."""
with nested(CleanImport(module_name), warnings.catch_warnings()): with CleanImport(module_name), warnings.catch_warnings():
# XXX: This is not quite enough for extension modules - those warnings.filterwarnings("error", ".+ (module|package) .+ removed",
# won't rerun their init code even with CleanImport. DeprecationWarning, __name__)
# You can see this easily by running the whole test suite with -3 warnings.filterwarnings("error", ".+ removed .+ (module|package)",
warnings.filterwarnings("error", ".+ removed",
DeprecationWarning, __name__) DeprecationWarning, __name__)
try: try:
__import__(module_name, level=0) __import__(module_name, level=0)
...@@ -358,8 +372,11 @@ class TestStdlibRemovals(unittest.TestCase): ...@@ -358,8 +372,11 @@ class TestStdlibRemovals(unittest.TestCase):
self.fail("Non-optional module {0} raised an " self.fail("Non-optional module {0} raised an "
"ImportError.".format(module_name)) "ImportError.".format(module_name))
else: else:
self.fail("DeprecationWarning not raised for {0}" # For extension modules, check the __warningregistry__.
.format(module_name)) # They won't rerun their init code even with CleanImport.
if not check_deprecated_module(module_name):
self.fail("DeprecationWarning not raised for {0}"
.format(module_name))
def test_platform_independent_removals(self): def test_platform_independent_removals(self):
# Make sure that the modules that are available on all platforms raise # Make sure that the modules that are available on all platforms raise
...@@ -390,7 +407,7 @@ class TestStdlibRemovals(unittest.TestCase): ...@@ -390,7 +407,7 @@ class TestStdlibRemovals(unittest.TestCase):
def test_reduce_move(self): def test_reduce_move(self):
from operator import add from operator import add
# reduce tests may have already triggered this warning # reduce tests may have already triggered this warning
reset_module_registry(unittest) reset_module_registry(unittest.case)
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.filterwarnings("error", "reduce") warnings.filterwarnings("error", "reduce")
self.assertRaises(DeprecationWarning, reduce, add, range(10)) self.assertRaises(DeprecationWarning, reduce, add, range(10))
...@@ -407,10 +424,8 @@ class TestStdlibRemovals(unittest.TestCase): ...@@ -407,10 +424,8 @@ class TestStdlibRemovals(unittest.TestCase):
def test_main(): def test_main():
with check_warnings(): run_unittest(TestPy3KWarnings,
warnings.simplefilter("always") TestStdlibRemovals)
run_unittest(TestPy3KWarnings,
TestStdlibRemovals)
if __name__ == '__main__': if __name__ == '__main__':
test_main() test_main()
...@@ -519,10 +519,10 @@ def _filterwarnings(filters, quiet=False): ...@@ -519,10 +519,10 @@ def _filterwarnings(filters, quiet=False):
if registry: if registry:
registry.clear() registry.clear()
with warnings.catch_warnings(record=True) as w: with warnings.catch_warnings(record=True) as w:
# Disable filters, to record all warnings. Because # Set filter "always" to record all warnings. Because
# test_warnings swap the module, we need to look up # test_warnings swap the module, we need to look up in
# in the sys.modules dictionary. # the sys.modules dictionary.
sys.modules['warnings'].resetwarnings() sys.modules['warnings'].simplefilter("always")
yield WarningsRecorder(w) yield WarningsRecorder(w)
# Filter the recorded warnings # Filter the recorded warnings
reraise = [warning.message for warning in w] reraise = [warning.message for warning in w]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment