Have MockClock detect attempts to cancel expired timers, to prevent a repeat of SYN-230

This commit is contained in:
Paul "LeoNerd" Evans 2015-01-13 16:57:55 +00:00
parent c2e7c84e58
commit cf7e723808
1 changed files with 16 additions and 4 deletions

View File

@ -138,7 +138,8 @@ class MockClock(object):
now = 1000
def __init__(self):
# list of tuples of (absolute_time, callback) in no particular order
# list of lists of [absolute_time, callback, expired] in no particular
# order
self.timers = []
def time(self):
@ -154,11 +155,16 @@ class MockClock(object):
LoggingContext.thread_local.current_context = current_context
callback()
t = (self.now + delay, wrapped_callback)
t = [self.now + delay, wrapped_callback, False]
self.timers.append(t)
return t
def cancel_call_later(self, timer):
if timer[2]:
raise Exception("Cannot cancel an expired timer")
timer[2] = True
self.timers = [t for t in self.timers if t != timer]
# For unit testing
@ -168,11 +174,17 @@ class MockClock(object):
timers = self.timers
self.timers = []
for time, callback in timers:
for t in timers:
time, callback, expired = t
if expired:
raise Exception("Timer already expired")
if self.now >= time:
t[2] = True
callback()
else:
self.timers.append((time, callback))
self.timers.append(t)
class SQLiteMemoryDbPool(ConnectionPool, object):