[Zope3-checkins] CVS: ZODB/src/ZODB/tests - warnhook.py:1.1
testConnection.py:1.6
Jeremy Hylton
jeremy at zope.com
Thu Mar 4 11:19:36 EST 2004
Update of /cvs-repository/ZODB/src/ZODB/tests
In directory cvs.zope.org:/tmp/cvs-serv24555/src/ZODB/tests
Modified Files:
testConnection.py
Added Files:
warnhook.py
Log Message:
Eliminate warnings output for tests of deprecated cache methods.
Add a limited mechanism to capture warnings instead of having them
printed to stderr.
Tests work in my local ZODB sandbox. Need to check whether any Zope 2
or Zope 3 tests call the deprecated methods, which could affect the
test results.
=== Added File ZODB/src/ZODB/tests/warnhook.py ===
##############################################################################
#
# Copyright (c) 2004 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
import warnings
class WarningsHook:
"""Hook to capture warnings generated by Python.
The function warnings.showwarning() is designed to be hooked by
application code, allowing the application to customize the way it
handles warnings.
This hook captures the unformatted warning information and stored
it in a list. A test can inspect this list after the test is over.
Issues:
The warnings module has lots of delicate internal state. If
a warning has been reported once, it won't be reported again. It
may be necessary to extend this class with a mechanism for
modifying the internal state so that we can be guaranteed a
warning will be reported.
If Python is run with a warnings filter, e.g. python -Werror,
then a test that is trying to inspect a particular warning will
fail. Perhaps this class can be extended to install more-specific
filters the test to work anyway.
"""
def __init__(self):
self.original = None
self.warnings = []
def install(self):
self.original = warnings.showwarning
warnings.showwarning = self.showwarning
def uninstall(self):
assert self.original is not None
warnings.showwarning = self.original
self.original = None
def showwarning(self, message, category, filename, lineno):
self.warnings.append((str(message), category, filename, lineno))
def clear(self):
self.warnings = []
=== ZODB/src/ZODB/tests/testConnection.py 1.5 => 1.6 ===
--- ZODB/src/ZODB/tests/testConnection.py:1.5 Fri Feb 27 09:55:49 2004
+++ ZODB/src/ZODB/tests/testConnection.py Thu Mar 4 11:19:35 2004
@@ -15,10 +15,12 @@
import doctest
import unittest
+import warnings
from persistent import Persistent
from ZODB.config import databaseFromString
from ZODB.utils import p64, u64
+from ZODB.tests.warnhook import WarningsHook
class ConnectionDotAdd(unittest.TestCase):
@@ -324,15 +326,63 @@
>>> db = databaseFromString("<zodb>\n<mappingstorage/>\n</zodb>")
>>> cn = db.open()
>>> r = cn.root()
- >>> r._p_activate()
- >>> cn.cacheFullSweep()
- >>> r._p_state
- 0
>>> cn.cacheMinimize()
>>> r._p_state
-1
- >>> cn.cacheFullSweep(12)
+
+ The next couple of tests are involved because they have to
+ cater to backwards compatibility issues. The cacheMinimize()
+ method used to take an argument, but now ignores it.
+ cacheFullSweep() used to do something different than
+ cacheMinimize(), but it doesn't anymore. We want to verify
+ that these methods do something, but all cause deprecation
+ warnings. To do that, we need a warnings hook.
+
+ >>> hook = WarningsHook()
+ >>> hook.install()
+
+ >>> r._p_activate()
>>> cn.cacheMinimize(12)
+ >>> r._p_state
+ -1
+ >>> len(hook.warnings)
+ 1
+ >>> message, category, filename, lineno = hook.warnings[0]
+ >>> message
+ 'The dt argument to cacheMinimize is ignored.'
+ >>> category.__name__
+ 'DeprecationWarning'
+ >>> hook.clear()
+
+ cacheFullSweep() is a doozy. It generates two deprecation
+ warnings, one from the Connection and one from the
+ cPickleCache. Maybe we should drop the cPickleCache warning,
+ but it's there for now. When passed an argument, it acts like
+ cacheGC(). When t isn't passed an argument it acts like
+ cacheMinimize().
+
+ >>> r._p_activate()
+ >>> cn.cacheFullSweep(12)
+ >>> r._p_state
+ 0
+ >>> len(hook.warnings)
+ 2
+ >>> message, category, filename, lineno = hook.warnings[0]
+ >>> message
+ 'cacheFullSweep is deprecated. Use cacheMinimize instead.'
+ >>> category.__name__
+ 'DeprecationWarning'
+ >>> message, category, filename, lineno = hook.warnings[1]
+ >>> message
+ 'No argument expected'
+ >>> category.__name__
+ 'DeprecationWarning'
+
+ We have to uninstall the hook so that other warnings don't get
+ lost.
+
+ >>> hook.uninstall()
+
"""
class InvalidationTests(unittest.TestCase):
More information about the Zope3-Checkins
mailing list