[CalendarServer-changes] [8381] CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/ datastore/upgrade/test/test_migrate.py

source_changes at macosforge.org source_changes at macosforge.org
Sat Dec 3 00:37:25 PST 2011


Revision: 8381
          http://trac.macosforge.org/projects/calendarserver/changeset/8381
Author:   glyph at apple.com
Date:     2011-12-03 00:37:25 -0800 (Sat, 03 Dec 2011)
Log Message:
-----------
take advantage of childStore(), add separate (but functionally equivalent) parallel tests; disable memcache in subprocesses

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/datastore/upgrade/test/test_migrate.py

Modified: CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/datastore/upgrade/test/test_migrate.py
===================================================================
--- CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/datastore/upgrade/test/test_migrate.py	2011-12-03 08:37:15 UTC (rev 8380)
+++ CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/datastore/upgrade/test/test_migrate.py	2011-12-03 08:37:25 UTC (rev 8381)
@@ -23,6 +23,8 @@
 from twisted.application.service import Service, MultiService
 from twisted.internet.defer import inlineCallbacks, Deferred, returnValue
 from twisted.internet.protocol import Protocol
+from twisted.protocols.amp import AMP, Command, String
+from twisted.python.reflect import qual, namedAny
 from twisted.trial.unittest import TestCase
 from txdav.caldav.datastore.test.common import CommonTests
 from txdav.carddav.datastore.test.common import CommonTests as ABCommonTests
@@ -30,13 +32,100 @@
 from txdav.common.datastore.test.util import theStoreBuilder, \
     populateCalendarsFrom, StubNotifierFactory, resetCalendarMD5s,\
     populateAddressBooksFrom, resetAddressBookMD5s
-from txdav.common.datastore.upgrade.migrate import UpgradeToDatabaseService
+from twext.internet.spawnsvc import SpawnerService
+from txdav.common.datastore.test.util import SQLStoreBuilder
+from txdav.common.datastore.upgrade.migrate import UpgradeToDatabaseService, LogIt, logFailures
 
+
+class StoreCreateMaster(AMP):
+    """
+    Helper protocol.
+    """
+
+    @LogIt.responder
+    def logIt(self, message):
+        """
+        Log a message from the subprocess.
+        """
+        print 'LOG:', message
+        return {}
+
+
+
+class CreateStore(Command):
+    """
+    Create a store in a subprocess.
+    """
+
+    arguments = [('delegateTo', String())]
+
+
+
+
+class StoreCreatorSlave(AMP):
+    """
+    Helper protocol.
+    """
+
+    @CreateStore.responder
+    @logFailures
+    def createStore(self, delegateTo):
+        """
+        Create a store and pass it to the named delegate class.
+        """
+        from twistedcaldav.memcacher import Memcacher
+        from twistedcaldav.config import config
+
+        # Normally these would be patched out for an individual test, but in
+        # this case, the process lifetime will be shorter than the test.
+        config.Memcached.Pools.Default.ClientEnabled = False
+        config.Memcached.Pools.Default.ServerEnabled = False
+        Memcacher.allowTestCache = True
+
+        cls = namedAny(delegateTo)
+        store = SQLStoreBuilder.childStore()
+        newself = cls(store)
+        self.boxReceiver = newself
+        newself.startReceivingBoxes(self)
+        return {}
+
+
+
+class StubSpawner(SpawnerService):
+    """
+    Stub spawner service which populates the store forcibly.
+    """
+
+    @inlineCallbacks
+    def spawn(self, here, there):
+        """
+        'here' and 'there' are the helper protocols; 'there' will expect to
+        have 'storeCreated' called on it.
+        """
+        master = yield super(StubSpawner, self).spawn(
+            StoreCreateMaster(),
+            StoreCreatorSlave)
+        yield master.callRemote(CreateStore, delegateTo=qual(there))
+        master.boxReceiver = here
+        here.startReceivingBoxes(master)
+        returnValue(here)
+
+
+
 class HomeMigrationTests(TestCase):
     """
     Tests for L{UpgradeToDatabaseService}.
     """
 
+    def createUpgradeService(self):
+        """
+        Create an upgrade service.
+        """
+        return UpgradeToDatabaseService(
+            self.fileStore, self.sqlStore, self.stubService
+        )
+
+
     @inlineCallbacks
     def setUp(self):
         """
@@ -59,9 +148,7 @@
                 subStarted.callback(None)
         self.stubService = StubService()
         self.topService = MultiService()
-        self.upgrader = UpgradeToDatabaseService(
-            fileStore, self.sqlStore, self.stubService
-        )
+        self.upgrader = self.createUpgradeService()
         self.upgrader.setServiceParent(self.topService)
 
         requirements = CommonTests.requirements
@@ -216,3 +303,21 @@
         ):
             object = (yield adbk.addressbookObjectWithName(name))
             self.assertEquals(object.md5(), md5)
+
+
+
+class ParallelHomeMigrationTests(HomeMigrationTests):
+    """
+    Tests for home migrations running in parallel.  Functionally this should be
+    the same, so it's just a store created slightly differently.
+    """
+
+    def createUpgradeService(self):
+        """
+        Create an upgrade service.
+        """
+        return UpgradeToDatabaseService(
+            self.fileStore, self.sqlStore, self.stubService,
+            parallel=2, spawner=StubSpawner()
+        )
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20111203/ad095055/attachment-0001.html>


More information about the calendarserver-changes mailing list