Merged revisions 78758 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r78758 | florent.xicluna | 2010-03-07 14:18:33 +0200 (Sun, 07 Mar 2010) | 4 lines

  Issue #7849: Now the utility ``check_warnings`` verifies if the warnings are
  effectively raised.  A new utility ``check_py3k_warnings`` deals with py3k warnings.
........
This commit is contained in:
Ezio Melotti 2010-08-02 18:10:09 +00:00
parent 800a354fa9
commit f613f352d0
7 changed files with 110 additions and 23 deletions

View File

@ -686,8 +686,9 @@ class CommonTest(unittest.TestCase):
EQ("bobobXbobob", "bobobobXbobobob", "replace", "bobob", "bob") EQ("bobobXbobob", "bobobobXbobobob", "replace", "bobob", "bob")
EQ("BOBOBOB", "BOBOBOB", "replace", "bob", "bobby") EQ("BOBOBOB", "BOBOBOB", "replace", "bob", "bobby")
ba = buffer('a') with test_support._check_py3k_warnings():
bb = buffer('b') ba = buffer('a')
bb = buffer('b')
EQ("bbc", "abc", "replace", ba, bb) EQ("bbc", "abc", "replace", ba, bb)
EQ("aac", "abc", "replace", bb, ba) EQ("aac", "abc", "replace", bb, ba)

View File

@ -259,7 +259,7 @@ class OtherFileTests(unittest.TestCase):
self.assertRaises(TypeError, _fileio._FileIO, "1", 0, 0) self.assertRaises(TypeError, _fileio._FileIO, "1", 0, 0)
def testWarnings(self): def testWarnings(self):
with check_warnings() as w: with check_warnings(quiet=True) as w:
self.assertEqual(w.warnings, []) self.assertEqual(w.warnings, [])
self.assertRaises(TypeError, _fileio._FileIO, []) self.assertRaises(TypeError, _fileio._FileIO, [])
self.assertEqual(w.warnings, []) self.assertEqual(w.warnings, [])

View File

@ -195,8 +195,9 @@ class OverflowTestCase(unittest.TestCase):
x = GetItem() x = GetItem()
self.assertEqual(x[self.pos], self.pos) self.assertEqual(x[self.pos], self.pos)
self.assertEqual(x[self.neg], self.neg) self.assertEqual(x[self.neg], self.neg)
self.assertEqual(x[self.neg:self.pos], (maxint+minsize, maxsize)) with test_support._check_py3k_warnings():
self.assertEqual(x[self.neg:self.pos:1].indices(maxsize), (0, maxsize, 1)) self.assertEqual(x[self.neg:self.pos], (maxint+minsize, maxsize))
self.assertEqual(x[self.neg:self.pos:1].indices(maxsize), (0, maxsize, 1))
def test_getitem(self): def test_getitem(self):
self._getitem_helper(object) self._getitem_helper(object)

View File

@ -52,10 +52,11 @@ class TestBasicOps(unittest.TestCase):
state3 = self.gen.getstate() # s/b distinct from state2 state3 = self.gen.getstate() # s/b distinct from state2
self.assertNotEqual(state2, state3) self.assertNotEqual(state2, state3)
self.assertRaises(TypeError, self.gen.jumpahead) # needs an arg with test_support._check_py3k_warnings(quiet=True):
self.assertRaises(TypeError, self.gen.jumpahead, "ick") # wrong type self.assertRaises(TypeError, self.gen.jumpahead) # needs an arg
self.assertRaises(TypeError, self.gen.jumpahead, 2.3) # wrong type self.assertRaises(TypeError, self.gen.jumpahead, "ick") # wrong type
self.assertRaises(TypeError, self.gen.jumpahead, 2, 3) # too many self.assertRaises(TypeError, self.gen.jumpahead, 2.3) # wrong type
self.assertRaises(TypeError, self.gen.jumpahead, 2, 3) # too many
def test_sample(self): def test_sample(self):
# For the entire allowable range of 0 <= k <= N, validate that # For the entire allowable range of 0 <= k <= N, validate that

View File

@ -11,6 +11,7 @@ import os
import shutil import shutil
import warnings import warnings
import unittest import unittest
import re
__all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_module", __all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_module",
"verbose", "use_resources", "max_memuse", "record_original_stdout", "verbose", "use_resources", "max_memuse", "record_original_stdout",
@ -18,8 +19,8 @@ __all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_modul
"is_resource_enabled", "requires", "find_unused_port", "bind_port", "is_resource_enabled", "requires", "find_unused_port", "bind_port",
"fcmp", "have_unicode", "is_jython", "TESTFN", "HOST", "FUZZ", "fcmp", "have_unicode", "is_jython", "TESTFN", "HOST", "FUZZ",
"findfile", "verify", "vereq", "sortdict", "check_syntax_error", "findfile", "verify", "vereq", "sortdict", "check_syntax_error",
"open_urlresource", "check_warnings", "CleanImport", "open_urlresource", "check_warnings", "_check_py3k_warnings",
"EnvironmentVarGuard", "captured_output", "CleanImport", "EnvironmentVarGuard", "captured_output",
"captured_stdout", "TransientResource", "transient_internet", "captured_stdout", "TransientResource", "transient_internet",
"run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest", "run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest",
"BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup",
@ -406,22 +407,103 @@ class WarningsRecorder(object):
entry to the warnings.catch_warnings() context manager. entry to the warnings.catch_warnings() context manager.
""" """
def __init__(self, warnings_list): def __init__(self, warnings_list):
self.warnings = warnings_list self._warnings = warnings_list
self._last = 0
def __getattr__(self, attr): def __getattr__(self, attr):
if self.warnings: if len(self._warnings) > self._last:
return getattr(self.warnings[-1], attr) return getattr(self._warnings[-1], attr)
elif attr in warnings.WarningMessage._WARNING_DETAILS: elif attr in warnings.WarningMessage._WARNING_DETAILS:
return None return None
raise AttributeError("%r has no attribute %r" % (self, attr)) raise AttributeError("%r has no attribute %r" % (self, attr))
@property
def warnings(self):
return self._warnings[self._last:]
def reset(self): def reset(self):
del self.warnings[:] self._last = len(self._warnings)
def _filterwarnings(filters, quiet=False):
"""Catch the warnings, then check if all the expected
warnings have been raised and re-raise unexpected warnings.
If 'quiet' is True, only re-raise the unexpected warnings.
"""
# Clear the warning registry of the calling module
# in order to re-raise the warnings.
frame = sys._getframe(2)
registry = frame.f_globals.get('__warningregistry__')
if registry:
registry.clear()
with warnings.catch_warnings(record=True) as w:
# Disable filters, to record all warnings. Because
# test_warnings swap the module, we need to look up
# in the sys.modules dictionary.
sys.modules['warnings'].resetwarnings()
yield WarningsRecorder(w)
# Filter the recorded warnings
reraise = [warning.message for warning in w]
missing = []
for msg, cat in filters:
seen = False
for exc in reraise[:]:
message = str(exc)
# Filter out the matching messages
if (re.match(msg, message, re.I) and
issubclass(exc.__class__, cat)):
seen = True
reraise.remove(exc)
if not seen and not quiet:
# This filter caught nothing
missing.append((msg, cat.__name__))
for exc in reraise:
raise AssertionError("unhandled warning %r" % exc)
for filter in missing:
raise AssertionError("filter (%r, %s) did not caught any warning" %
filter)
@contextlib.contextmanager @contextlib.contextmanager
def check_warnings(): def check_warnings(*filters, **kwargs):
with warnings.catch_warnings(record=True) as w: """Context manager to silence warnings.
yield WarningsRecorder(w)
Accept 2-tuples as positional arguments:
("message regexp", WarningCategory)
Optional argument:
- if 'quiet' is True, it does not fail if a filter catches nothing
(default False)
Without argument, it defaults to:
check_warnings(("", Warning), quiet=False)
"""
if not filters:
filters = (("", Warning),)
return _filterwarnings(filters, kwargs.get('quiet'))
@contextlib.contextmanager
def _check_py3k_warnings(*filters, **kwargs):
"""Context manager to silence py3k warnings.
Accept 2-tuples as positional arguments:
("message regexp", WarningCategory)
Optional argument:
- if 'quiet' is True, it does not fail if a filter catches nothing
(default False)
Without argument, it defaults to:
_check_py3k_warnings(("", DeprecationWarning), quiet=False)
"""
if sys.py3kwarning:
if not filters:
filters = (("", DeprecationWarning),)
else:
# It should not raise any py3k warning
filters = ()
return _filterwarnings(filters, kwargs.get('quiet'))
class CleanImport(object): class CleanImport(object):
@ -595,7 +677,6 @@ _4G = 4 * _1G
MAX_Py_ssize_t = sys.maxsize MAX_Py_ssize_t = sys.maxsize
def set_memlimit(limit): def set_memlimit(limit):
import re
global max_memuse global max_memuse
global real_max_memuse global real_max_memuse
sizes = { sizes = {

View File

@ -511,9 +511,11 @@ class UnicodeTest(
) )
if not sys.platform.startswith('java'): if not sys.platform.startswith('java'):
with test_support._check_py3k_warnings():
buf = buffer('character buffers are decoded to unicode')
self.assertEqual( self.assertEqual(
unicode( unicode(
buffer('character buffers are decoded to unicode'), buf,
'utf-8', 'utf-8',
'strict' 'strict'
), ),

View File

@ -35,9 +35,6 @@ Core and Builtins
when turned into an exception: in this case the exception simply when turned into an exception: in this case the exception simply
gets ignored. gets ignored.
- Issue #7372: Fix pstats regression when stripping paths from profile
data generated with the profile module.
- Issue #4108: In urllib.robotparser, if there are multiple 'User-agent: *' - Issue #4108: In urllib.robotparser, if there are multiple 'User-agent: *'
entries, consider the first one. entries, consider the first one.
@ -422,6 +419,10 @@ Build
Tests Tests
----- -----
- Issue #7849: Now the utility ``check_warnings`` verifies if the warnings are
effectively raised. A new private utility ``_check_py3k_warnings`` has been
backported to help silencing py3k warnings.
- Issue #8672: Add a zlib test ensuring that an incomplete stream can be - Issue #8672: Add a zlib test ensuring that an incomplete stream can be
handled by a decompressor object without errors (it returns incomplete handled by a decompressor object without errors (it returns incomplete
uncompressed data). uncompressed data).