diff -rN -u old-tahoe/src/allmydata/test/no_network.py new-tahoe/src/allmydata/test/no_network.py --- old-tahoe/src/allmydata/test/no_network.py 2010-01-28 06:42:33.700000000 +0000 +++ new-tahoe/src/allmydata/test/no_network.py 2010-01-28 06:42:37.414000000 +0000 @@ -16,7 +16,7 @@ import os.path from zope.interface import implements from twisted.application import service -from twisted.internet import reactor +from twisted.internet import defer, reactor from twisted.python.failure import Failure from foolscap.api import Referenceable, fireEventually, RemoteException from base64 import b32encode @@ -38,6 +38,7 @@ def __init__(self, original): self.original = original self.broken = False + self.hung_until = None self.post_call_notifier = None self.disconnectors = {} @@ -57,11 +58,25 @@ return a args = tuple([wrap(a) for a in args]) kwargs = dict([(k,wrap(kwargs[k])) for k in kwargs]) + + def _really_call(): + meth = getattr(self.original, "remote_" + methname) + return meth(*args, **kwargs) + def _call(): if self.broken: raise IntentionalError("I was asked to break") - meth = getattr(self.original, "remote_" + methname) - return meth(*args, **kwargs) + if self.hung_until: + d2 = defer.Deferred() + self.hung_until.addCallback(lambda ign: _really_call()) + self.hung_until.addCallback(lambda res: d2.callback(res)) + def _err(res): + d2.errback(res) + return res + self.hung_until.addErrback(_err) + return d2 + return _really_call() + d = fireEventually() d.addCallback(lambda res: _call()) def _wrap_exception(f): @@ -240,6 +255,11 @@ # asked to hold a share self.servers_by_id[serverid].broken = True + def hang_server(self, serverid, until=defer.Deferred()): + # hang the given server until 'until' fires + self.servers_by_id[serverid].hung_until = until + + class GridTestMixin: def setUp(self): self.s = service.MultiService()