[Zope-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 Zope-Checkins mailing list