[Zope-Checkins] CVS: ZODB3/ZEO/tests - testConnection.py:1.1 ConnectionTests.py:1.4 testZEO.py:1.53

Guido van Rossum guido@python.org
Thu, 3 Oct 2002 13:19:39 -0400


Update of /cvs-repository/ZODB3/ZEO/tests
In directory cvs.zope.org:/tmp/cvs-serv28397/ZEO/tests

Modified Files:
	ConnectionTests.py testZEO.py 
Added Files:
	testConnection.py 
Log Message:
Refactored the tests, removing some unnecessary structure.

Got rid of PackWaitWrapper (since pack now waits by default).

Moved the connection test scaffolding to testConnection.py (new);
moved the openClientStorage() implementation into ConnectionTests.py
since it is not platform dependent.



=== Added File ZODB3/ZEO/tests/testConnection.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 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
#
##############################################################################
"""Test setup for ZEO connection logic.

The actual tests are in ConnectionTests.py; this file provides the
platform-dependent scaffolding.
"""

# System imports
import os
import time
import socket
import unittest

# Zope/ZODB3 imports
import zLOG

# ZEO test support
from ZEO.tests import forker

# Import the actual test class
from ZEO.tests.ConnectionTests import ConnectionTests

class UnixConnectionTests(ConnectionTests):

    """Add Unix-specific scaffolding to the generic test suite."""

    def startServer(self, create=1, index=0, read_only=0, ro_svr=0):
        zLOG.LOG("testZEO", zLOG.INFO,
                 "startServer(create=%d, index=%d, read_only=%d)" %
                 (create, index, read_only))
        path = "%s.%d" % (self.file, index)
        addr = self.addr[index]
        pid, server = forker.start_zeo_server(
            'FileStorage', (path, create, read_only), addr, ro_svr)
        self._pids.append(pid)
        self._servers.append(server)

    def shutdownServer(self, index=0):
        zLOG.LOG("testZEO", zLOG.INFO, "shutdownServer(index=%d)" % index)
        self._servers[index].close()
        if self._pids[index] is not None:
            try:
                os.waitpid(self._pids[index], 0)
                self._pids[index] = None
            except os.error, err:
                print err

class WindowsConnectionTests(ConnectionTests):

    """Add Windows-specific scaffolding to the generic test suite."""

    def startServer(self, create=1, index=0, read_only=0, ro_svr=0):
        zLOG.LOG("testZEO", zLOG.INFO,
                 "startServer(create=%d, index=%d, read_only=%d)" %
                 (create, index, read_only))
        path = "%s.%d" % (self.file, index)
        addr = self.addr[index]
        args = (path, '='+str(create), '='+str(read_only))
        _addr, test_addr, test_pid = forker.start_zeo_server(
            'FileStorage', args, addr, ro_svr)
        self._pids.append(test_pid)
        self._servers.append(test_addr)

    def shutdownServer(self, index=0):
        zLOG.LOG("testZEO", zLOG.INFO, "shutdownServer(index=%d)" % index)
        if self._servers[index] is not None:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(self._servers[index])
            s.close()
            self._servers[index] = None
            # XXX waitpid() isn't available until Python 2.3
            time.sleep(0.5)

if os.name == "posix":
    test_classes = [UnixConnectionTests]
elif os.name == "nt":
    test_classes = [WindowsConnectionTests]
else:
    raise RuntimeError, "unsupported os: %s" % os.name

def test_suite():

    # shutup warnings about mktemp
    import warnings
    warnings.filterwarnings("ignore", "mktemp")
    
    suite = unittest.TestSuite()
    for klass in test_classes:
        sub = unittest.makeSuite(klass, 'check')
        suite.addTest(sub)
    return suite

if __name__ == "__main__":
    unittest.main(defaultTest='test_suite')


=== ZODB3/ZEO/tests/ConnectionTests.py 1.3 => 1.4 ===
--- ZODB3/ZEO/tests/ConnectionTests.py:1.3	Tue Oct  1 13:10:32 2002
+++ ZODB3/ZEO/tests/ConnectionTests.py	Thu Oct  3 13:19:39 2002
@@ -23,7 +23,7 @@
 
 import zLOG
 
-import ZEO.ClientStorage
+from ZEO.ClientStorage import ClientStorage
 from ZEO.Exceptions import Disconnected
 from ZEO.zrpc.marshal import Marshaller
 
@@ -32,6 +32,10 @@
 from ZODB.tests import StorageTestBase
 from ZODB.tests.StorageTestBase import zodb_unpickle, MinPO
 
+class DummyDB:
+    def invalidate(self, *args):
+        pass
+
 class ConnectionTests(StorageTestBase.StorageTestBase):
     """Tests that explicitly manage the server process.
 
@@ -67,7 +71,16 @@
 
     def openClientStorage(self, cache='', cache_size=200000, wait=1,
                           read_only=0, read_only_fallback=0):
-        raise NotImplementedError
+        base = ClientStorage(self.addr,
+                             client=cache,
+                             cache_size=cache_size,
+                             wait=wait,
+                             min_disconnect_poll=0.1,
+                             read_only=read_only,
+                             read_only_fallback=read_only_fallback)
+        storage = base
+        storage.registerDB(DummyDB(), None)
+        return storage
 
     def shutdownServer(self, index=0):
         raise NotImplementedError
@@ -490,4 +503,3 @@
 
         self._storage = self.openClientStorage()
         self._dostore()
-        


=== ZODB3/ZEO/tests/testZEO.py 1.52 => 1.53 ===
--- ZODB3/ZEO/tests/testZEO.py:1.52	Tue Oct  1 12:09:25 2002
+++ ZODB3/ZEO/tests/testZEO.py	Thu Oct  3 13:19:39 2002
@@ -11,23 +11,32 @@
 # FOR A PARTICULAR PURPOSE
 #
 ##############################################################################
-"""Test suite for ZEO based on ZODB.tests"""
+"""Test suite for ZEO based on ZODB.tests."""
 
-import asyncore
+# System imports
 import os
+import sys
+import time
 import random
 import select
 import socket
-import sys
-import tempfile
 import thread
-import time
+import asyncore
+import tempfile
 import unittest
 
+# Zope/ZODB3 imports
+import zLOG
+
+# ZODB imports
 from ZODB.Transaction import get_transaction
 from ZODB.POSException import ReadOnlyError
-import zLOG
 
+# ZODB test support
+from ZODB.tests.MinPO import MinPO
+from ZODB.tests.StorageTestBase import zodb_unpickle
+
+# Handle potential absence of removefs
 try:
     from ZODB.tests.StorageTestBase import removefs
 except ImportError:
@@ -44,81 +53,29 @@
                 if err[0] != errno.ENOENT:
                     raise
 
-
-from ZEO.ClientStorage import ClientStorage
-from ZEO.tests import forker, Cache, CommitLockTests, ThreadTests
-from ZEO.tests.ConnectionTests import ConnectionTests
-from ZEO.Exceptions import Disconnected
-
+# ZODB test mixin classes
 from ZODB.tests import StorageTestBase, BasicStorage, VersionStorage, \
      TransactionalUndoStorage, TransactionalUndoVersionStorage, \
      PackableStorage, Synchronization, ConflictResolution, RevisionStorage, \
      MTStorage, ReadOnlyStorage
-from ZODB.tests.MinPO import MinPO
-from ZODB.tests.StorageTestBase import zodb_unpickle
 
-class DummyDB:
-    def invalidate(self, *args):
-        pass
+# ZEO imports
+from ZEO.ClientStorage import ClientStorage
+from ZEO.Exceptions import Disconnected
 
-class PackWaitWrapper:
-    def __init__(self, storage):
-        self.storage = storage
-
-    def __getattr__(self, attr):
-        return getattr(self.storage, attr)
-
-    def pack(self, t, f):
-        self.storage.pack(t, f, wait=1)
-
-class GenericTests(StorageTestBase.StorageTestBase,
-                   TransactionalUndoStorage.TransactionalUndoStorage,
-            TransactionalUndoVersionStorage.TransactionalUndoVersionStorage,
-                   ConflictResolution.ConflictResolvingStorage,
-                   ConflictResolution.ConflictResolvingTransUndoStorage,
-                   Cache.StorageWithCache,
-                   Cache.TransUndoStorageWithCache,
-                   BasicStorage.BasicStorage,
-                   VersionStorage.VersionStorage,
-                   RevisionStorage.RevisionStorage,
-                   PackableStorage.PackableStorage,
-                   Synchronization.SynchronizedStorage,
-                   MTStorage.MTStorage,
-                   ReadOnlyStorage.ReadOnlyStorage,
-                   CommitLockTests.CommitLockTests,
-                   ThreadTests.ThreadTests,
-                   ):
-    """An abstract base class for ZEO tests
-
-    A specific ZEO test run depends on having a real storage that the
-    StorageServer provides access to.  The GenericTests must be
-    subclassed to provide an implementation of getStorage() that
-    returns a specific storage, e.g. FileStorage.
-    """
+# ZEO test support
+from ZEO.tests import forker, Cache
 
-    def setUp(self):
-        zLOG.LOG("testZEO", zLOG.INFO, "setUp() %s" % self.id())
-        client, exit, pid = forker.start_zeo(*self.getStorage())
-        self._pids = [pid]
-        self._servers = [exit]
-        self._storage = PackWaitWrapper(client)
-        client.registerDB(DummyDB(), None)
+# ZEO test mixin classes
+from ZEO.tests import CommitLockTests, ThreadTests
 
-    def tearDown(self):
-        self._storage.close()
-        for server in self._servers:
-            server.close()
-        for pid in self._pids:
-            os.waitpid(pid, 0)
-        self.delStorage()
+class DummyDB:
+    def invalidate(self, *args):
+        pass
 
-    def open(self, read_only=0):
-        # XXX Needed to support ReadOnlyStorage tests.  Ought to be a
-        # cleaner way.
+class MiscZEOTests:
 
-        addr = self._storage._addr
-        self._storage.close()
-        self._storage = ClientStorage(addr, read_only=read_only, wait=1)
+    """ZEO tests that don't fit in elsewhere."""
 
     def checkLargeUpdate(self):
         obj = MinPO("X" * (10 * 128 * 1024))
@@ -146,13 +103,59 @@
         finally:
             storage2.close()
 
+class GenericTests(
+    # Base class for all ZODB tests
+    StorageTestBase.StorageTestBase,
+
+    # ZODB test mixin classes (in the same order as imported)
+    BasicStorage.BasicStorage,
+    VersionStorage.VersionStorage,
+    TransactionalUndoStorage.TransactionalUndoStorage,
+    TransactionalUndoVersionStorage.TransactionalUndoVersionStorage,
+    PackableStorage.PackableStorage,
+    Synchronization.SynchronizedStorage,
+    ConflictResolution.ConflictResolvingStorage,
+    ConflictResolution.ConflictResolvingTransUndoStorage,
+    RevisionStorage.RevisionStorage,
+    MTStorage.MTStorage,
+    ReadOnlyStorage.ReadOnlyStorage,
+
+    # ZEO test mixin classes (in the same order as imported)
+    Cache.StorageWithCache,
+    Cache.TransUndoStorageWithCache,
+    CommitLockTests.CommitLockTests,
+    ThreadTests.ThreadTests,
+    MiscZEOTests # Locally defined (see above)
+    ):
+
+    """Combine tests from various origins in one class."""
+
+    def open(self, read_only=0):
+        # XXX Needed to support ReadOnlyStorage tests.  Ought to be a
+        # cleaner way.
+        addr = self._storage._addr
+        self._storage.close()
+        self._storage = ClientStorage(addr, read_only=read_only, wait=1)
+
+class UnixTests(GenericTests):
 
-class ZEOFileStorageTests(GenericTests):
-    __super_setUp = GenericTests.setUp
+    """Add Unix-specific scaffolding to the generic test suite."""
 
     def setUp(self):
-        self.__fs_base = tempfile.mktemp()
-        self.__super_setUp()
+        zLOG.LOG("testZEO", zLOG.INFO, "setUp() %s" % self.id())
+        client, exit, pid = forker.start_zeo(*self.getStorage())
+        self._pids = [pid]
+        self._servers = [exit]
+        self._storage = client
+        client.registerDB(DummyDB(), None)
+
+    def tearDown(self):
+        self._storage.close()
+        for server in self._servers:
+            server.close()
+        for pid in self._pids:
+            os.waitpid(pid, 0)
+        self.delStorage()
 
     def getStorage(self):
         self.__fs_base = tempfile.mktemp()
@@ -161,13 +164,9 @@
     def delStorage(self):
         removefs(self.__fs_base)
 
-class WindowsGenericTests(GenericTests):
-    """Subclass to support server creation on Windows.
+class WindowsTests(GenericTests):
 
-    On Windows, the getStorage() design won't work because the storage
-    can't be created in the parent process and passed to the child.
-    All the work has to be done in the server's process.
-    """
+    """Add Windows-specific scaffolding to the generic test suite."""
 
     def setUp(self):
         zLOG.LOG("testZEO", zLOG.INFO, "setUp() %s" % self.id())
@@ -177,7 +176,7 @@
         zeo_addr, self.test_addr, self.test_pid = \
                   forker.start_zeo_server(name, args)
         storage = ClientStorage(zeo_addr, wait=1, min_disconnect_poll=0.1)
-        self._storage = PackWaitWrapper(storage)
+        self._storage = storage
         storage.registerDB(DummyDB(), None)
 
     def tearDown(self):
@@ -189,8 +188,6 @@
         time.sleep(0.5)
         self.delStorage()
 
-class WindowsZEOFileStorageTests(WindowsGenericTests):
-
     def getStorageInfo(self):
         self.__fs_base = tempfile.mktemp()
         return 'FileStorage', (self.__fs_base, '1') # create=1
@@ -198,73 +195,10 @@
     def delStorage(self):
         removefs(self.__fs_base)
 
-class BaseConnectionTests(ConnectionTests):
-    # provide an openClientStorage() method shared by Unix and Windows
-    
-    def openClientStorage(self, cache='', cache_size=200000, wait=1,
-                          read_only=0, read_only_fallback=0):
-        base = ClientStorage(self.addr,
-                             client=cache,
-                             cache_size=cache_size,
-                             wait=wait,
-                             min_disconnect_poll=0.1,
-                             read_only=read_only,
-                             read_only_fallback=read_only_fallback)
-        storage = PackWaitWrapper(base)
-        storage.registerDB(DummyDB(), None)
-        return storage
-
-class UnixConnectionTests(BaseConnectionTests):
-
-    def startServer(self, create=1, index=0, read_only=0, ro_svr=0):
-        zLOG.LOG("testZEO", zLOG.INFO,
-                 "startServer(create=%d, index=%d, read_only=%d)" %
-                 (create, index, read_only))
-        path = "%s.%d" % (self.file, index)
-        addr = self.addr[index]
-        pid, server = forker.start_zeo_server(
-            'FileStorage', (path, create, read_only), addr, ro_svr)
-        self._pids.append(pid)
-        self._servers.append(server)
-
-    def shutdownServer(self, index=0):
-        zLOG.LOG("testZEO", zLOG.INFO, "shutdownServer(index=%d)" % index)
-        self._servers[index].close()
-        if self._pids[index] is not None:
-            try:
-                os.waitpid(self._pids[index], 0)
-                self._pids[index] = None
-            except os.error, err:
-                print err
-
-class WindowsConnectionTests(BaseConnectionTests):
-
-    def startServer(self, create=1, index=0, read_only=0, ro_svr=0):
-        zLOG.LOG("testZEO", zLOG.INFO,
-                 "startServer(create=%d, index=%d, read_only=%d)" %
-                 (create, index, read_only))
-        path = "%s.%d" % (self.file, index)
-        addr = self.addr[index]
-        args = (path, '='+str(create), '='+str(read_only))
-        _addr, test_addr, test_pid = forker.start_zeo_server(
-            'FileStorage', args, addr, ro_svr)
-        self._pids.append(test_pid)
-        self._servers.append(test_addr)
-
-    def shutdownServer(self, index=0):
-        zLOG.LOG("testZEO", zLOG.INFO, "shutdownServer(index=%d)" % index)
-        if self._servers[index] is not None:
-            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            s.connect(self._servers[index])
-            s.close()
-            self._servers[index] = None
-            # XXX waitpid() isn't available until Python 2.3
-            time.sleep(0.5)
-
 if os.name == "posix":
-    test_classes = ZEOFileStorageTests, UnixConnectionTests
+    test_classes = [UnixTests]
 elif os.name == "nt":
-    test_classes = WindowsZEOFileStorageTests, WindowsConnectionTests
+    test_classes = [WindowsTests]
 else:
     raise RuntimeError, "unsupported os: %s" % os.name