diff options
author | Paul "LeoNerd" Evans <paul@matrix.org> | 2015-01-13 16:57:55 +0000 |
---|---|---|
committer | Paul "LeoNerd" Evans <paul@matrix.org> | 2015-01-13 16:58:36 +0000 |
commit | cf7e723808fa5882f33b01274fb2b94e5abe9eca (patch) | |
tree | b72f709de1c4c1f4071e509c21fa5fd3715dc14b | |
parent | Don't try to cancel already-expired timers - SYN-230 (diff) | |
download | synapse-cf7e723808fa5882f33b01274fb2b94e5abe9eca.tar.xz |
Have MockClock detect attempts to cancel expired timers, to prevent a repeat of SYN-230
-rw-r--r-- | tests/utils.py | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/tests/utils.py b/tests/utils.py index 731e03f517..97fa8d8181 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -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): |