testutil.PollMixin: use a custom exception (and convert it) to avoid the ugly 'stash' cycle

This commit is contained in:
Brian Warner 2008-09-02 20:32:51 -07:00
parent 8f2410cd30
commit bab799297f

View File

@ -41,6 +41,9 @@ class SignalMixin:
class TimeoutError(Exception): class TimeoutError(Exception):
pass pass
class PollComplete(Exception):
pass
class PollMixin: class PollMixin:
def poll(self, check_f, pollinterval=0.01, timeout=None): def poll(self, check_f, pollinterval=0.01, timeout=None):
@ -48,22 +51,24 @@ class PollMixin:
# True, at which point the Deferred will fire.. If check_f raises an # True, at which point the Deferred will fire.. If check_f raises an
# exception, the Deferred will errback. If the check_f does not # exception, the Deferred will errback. If the check_f does not
# indicate success within timeout= seconds, the Deferred will # indicate success within timeout= seconds, the Deferred will
# errback. If timeout=None, no timeout will be enforced. # errback. If timeout=None, no timeout will be enforced, and the loop
# will poll forever (or really until Trial times out).
cutoff = None cutoff = None
if timeout is not None: if timeout is not None:
cutoff = time.time() + timeout cutoff = time.time() + timeout
stash = [] # ick. We have to pass the LoopingCall into itself lc = task.LoopingCall(self._poll, check_f, cutoff)
lc = task.LoopingCall(self._poll, check_f, stash, cutoff)
stash.append(lc)
d = lc.start(pollinterval) d = lc.start(pollinterval)
def _convert_done(f):
f.trap(PollComplete)
return None
d.addErrback(_convert_done)
return d return d
def _poll(self, check_f, stash, cutoff): def _poll(self, check_f, cutoff):
if cutoff is not None and time.time() > cutoff: if cutoff is not None and time.time() > cutoff:
raise TimeoutError() raise TimeoutError()
lc = stash[0]
if check_f(): if check_f():
lc.stop() raise PollComplete()
class StallMixin: class StallMixin:
def stall(self, res=None, delay=1): def stall(self, res=None, delay=1):