[CalendarServer-changes] [14684] CalendarServer/trunk/calendarserver/tap/test/test_caldav.py
source_changes at macosforge.org
source_changes at macosforge.org
Fri Apr 17 11:32:48 PDT 2015
Revision: 14684
http://trac.calendarserver.org//changeset/14684
Author: sagen at apple.com
Date: 2015-04-17 11:32:48 -0700 (Fri, 17 Apr 2015)
Log Message:
-----------
Fix the memcache tests so stopService( ) returns a deferred
Modified Paths:
--------------
CalendarServer/trunk/calendarserver/tap/test/test_caldav.py
Modified: CalendarServer/trunk/calendarserver/tap/test/test_caldav.py
===================================================================
--- CalendarServer/trunk/calendarserver/tap/test/test_caldav.py 2015-04-17 18:11:45 UTC (rev 14683)
+++ CalendarServer/trunk/calendarserver/tap/test/test_caldav.py 2015-04-17 18:32:48 UTC (rev 14684)
@@ -26,17 +26,18 @@
from zope.interface import implements
+from twisted.application import service
from twisted.python import log as logging
from twisted.python.threadable import isInIOThread
from twisted.internet.reactor import callFromThread
from twisted.python.usage import Options, UsageError
from twisted.python.procutils import which
-from twisted.runner.procmon import ProcessMonitor
+from twisted.runner.procmon import ProcessMonitor, LoggingProtocol
from twisted.internet.interfaces import IProcessTransport, IReactorProcess
from twisted.internet.protocol import ServerFactory
-from twisted.internet.defer import Deferred, inlineCallbacks, succeed
+from twisted.internet.defer import Deferred, inlineCallbacks, succeed, gatherResults
from twisted.internet.task import Clock
from twisted.internet import reactor
from twisted.application.service import (IService, IServiceCollection
@@ -443,12 +444,70 @@
self.assertEquals(socketService.gid, self.alternateGroup)
+class TestLoggingProtocol(LoggingProtocol):
+ def processEnded(self, reason):
+ LoggingProtocol.processEnded(self, reason)
+ self.service.processEnded(self.name)
+
+
+class TestProcessMonitor(ProcessMonitor):
+
+ def startProcess(self, name):
+ """
+ @param name: The name of the process to be started
+ """
+ # If a protocol instance already exists, it means the process is
+ # already running
+ if name in self.protocols:
+ return
+
+ args, uid, gid, env = self.processes[name]
+
+ proto = TestLoggingProtocol()
+ proto.service = self
+ proto.name = name
+ self.protocols[name] = proto
+ self.timeStarted[name] = self._reactor.seconds()
+ self._reactor.spawnProcess(
+ proto, args[0], args, uid=uid, gid=gid, env=env
+ )
+
+ def stopService(self):
+ """
+ Return a deferred that fires when all child processes have ended.
+ """
+ service.Service.stopService(self)
+
+ self.stopping = True
+ self.deferreds = {}
+ for name in self.processes:
+ self.deferreds[name] = Deferred()
+
+ # Cancel any outstanding restarts
+ for name, delayedCall in self.restart.items():
+ if delayedCall.active():
+ delayedCall.cancel()
+
+ for name in self.processes:
+ self.stopProcess(name)
+
+ return gatherResults(self.deferreds.values())
+
+
+ def processEnded(self, name):
+ if self.stopping:
+ deferred = self.deferreds.pop(name, None)
+ if deferred is not None:
+ deferred.callback(None)
+
class MemcacheSpawner(TestCase):
def setUp(self):
super(MemcacheSpawner, self).setUp()
- self.monitor = ProcessMonitor()
+ self.patch(config.Memcached.Pools.Default, "ServerEnabled", True)
+
+ self.monitor = TestProcessMonitor()
self.monitor.startService()
self.socket = os.path.join(tempfile.gettempdir(), "memcache.sock")
self.patch(config.Memcached.Pools.Default, "ServerEnabled", True)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20150417/b39e6346/attachment.html>
More information about the calendarserver-changes
mailing list