issue #170: implement timers.
parent
4fedf88d38
commit
2fbc77a155
@ -0,0 +1,174 @@
|
||||
|
||||
import time
|
||||
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
import mitogen.core
|
||||
import mitogen.parent
|
||||
|
||||
import testlib
|
||||
|
||||
|
||||
class TimerListMixin(object):
|
||||
klass = mitogen.parent.TimerList
|
||||
|
||||
def setUp(self):
|
||||
self.list = self.klass()
|
||||
|
||||
|
||||
class GetTimeoutTest(TimerListMixin, testlib.TestCase):
|
||||
def test_empty(self):
|
||||
self.assertEquals(None, self.list.get_timeout())
|
||||
|
||||
def test_one_event(self):
|
||||
self.list.schedule(2, lambda: None)
|
||||
self.list._now = lambda: 1
|
||||
self.assertEquals(1, self.list.get_timeout())
|
||||
|
||||
def test_two_events_same_moment(self):
|
||||
self.list.schedule(2, lambda: None)
|
||||
self.list.schedule(2, lambda: None)
|
||||
self.list._now = lambda: 1
|
||||
self.assertEquals(1, self.list.get_timeout())
|
||||
|
||||
def test_two_events(self):
|
||||
self.list.schedule(2, lambda: None)
|
||||
self.list.schedule(3, lambda: None)
|
||||
self.list._now = lambda: 1
|
||||
self.assertEquals(1, self.list.get_timeout())
|
||||
|
||||
def test_two_events_expired(self):
|
||||
self.list.schedule(2, lambda: None)
|
||||
self.list.schedule(3, lambda: None)
|
||||
self.list._now = lambda: 3
|
||||
self.assertEquals(0, self.list.get_timeout())
|
||||
|
||||
def test_two_events_in_past(self):
|
||||
self.list.schedule(2, lambda: None)
|
||||
self.list.schedule(3, lambda: None)
|
||||
self.list._now = lambda: 30
|
||||
self.assertEquals(0, self.list.get_timeout())
|
||||
|
||||
def test_two_events_in_past(self):
|
||||
self.list.schedule(2, lambda: None)
|
||||
self.list.schedule(3, lambda: None)
|
||||
self.list._now = lambda: 30
|
||||
self.assertEquals(0, self.list.get_timeout())
|
||||
|
||||
|
||||
class ScheduleTest(TimerListMixin, testlib.TestCase):
|
||||
def test_in_past(self):
|
||||
self.list._now = lambda: 30
|
||||
timer = self.list.schedule(29, lambda: None)
|
||||
self.assertEquals(29, timer.when)
|
||||
self.assertEquals(0, self.list.get_timeout())
|
||||
|
||||
def test_in_future(self):
|
||||
self.list._now = lambda: 30
|
||||
timer = self.list.schedule(31, lambda: None)
|
||||
self.assertEquals(31, timer.when)
|
||||
self.assertEquals(1, self.list.get_timeout())
|
||||
|
||||
def test_same_moment(self):
|
||||
self.list._now = lambda: 30
|
||||
timer = self.list.schedule(31, lambda: None)
|
||||
timer2 = self.list.schedule(31, lambda: None)
|
||||
self.assertEquals(31, timer.when)
|
||||
self.assertEquals(31, timer2.when)
|
||||
self.assertTrue(timer is not timer2)
|
||||
self.assertEquals(1, self.list.get_timeout())
|
||||
|
||||
|
||||
class ExpireTest(TimerListMixin, testlib.TestCase):
|
||||
def test_in_past(self):
|
||||
timer = self.list.schedule(29, mock.Mock())
|
||||
self.list._now = lambda: 30
|
||||
self.list.expire()
|
||||
self.assertEquals(1, len(timer.func.mock_calls))
|
||||
|
||||
def test_in_future(self):
|
||||
timer = self.list.schedule(29, mock.Mock())
|
||||
self.list._now = lambda: 28
|
||||
self.list.expire()
|
||||
self.assertEquals(0, len(timer.func.mock_calls))
|
||||
|
||||
def test_same_moment(self):
|
||||
timer = self.list.schedule(29, mock.Mock())
|
||||
timer2 = self.list.schedule(29, mock.Mock())
|
||||
self.list._now = lambda: 29
|
||||
self.list.expire()
|
||||
self.assertEquals(1, len(timer.func.mock_calls))
|
||||
self.assertEquals(1, len(timer2.func.mock_calls))
|
||||
|
||||
def test_cancelled(self):
|
||||
self.list._now = lambda: 29
|
||||
timer = self.list.schedule(29, mock.Mock())
|
||||
timer.cancel()
|
||||
self.assertEquals(0, self.list.get_timeout())
|
||||
self.list._now = lambda: 29
|
||||
self.list.expire()
|
||||
self.assertEquals(0, len(timer.func.mock_calls))
|
||||
self.assertEquals(None, self.list.get_timeout())
|
||||
|
||||
|
||||
class CancelTest(TimerListMixin, testlib.TestCase):
|
||||
def test_single_cancel(self):
|
||||
self.list._now = lambda: 29
|
||||
timer = self.list.schedule(29, mock.Mock())
|
||||
timer.cancel()
|
||||
self.list.expire()
|
||||
self.assertEquals(0, len(timer.func.mock_calls))
|
||||
|
||||
def test_double_cancel(self):
|
||||
self.list._now = lambda: 29
|
||||
timer = self.list.schedule(29, mock.Mock())
|
||||
timer.cancel()
|
||||
timer.cancel()
|
||||
self.list.expire()
|
||||
self.assertEquals(0, len(timer.func.mock_calls))
|
||||
|
||||
|
||||
@mitogen.core.takes_econtext
|
||||
def do_timer_test_econtext(econtext):
|
||||
do_timer_test(econtext.broker)
|
||||
|
||||
|
||||
def do_timer_test(broker):
|
||||
now = time.time()
|
||||
latch = mitogen.core.Latch()
|
||||
broker.defer(lambda:
|
||||
broker.timers.schedule(
|
||||
now + 0.250,
|
||||
lambda: latch.put('hi'),
|
||||
)
|
||||
)
|
||||
|
||||
assert 'hi' == latch.get()
|
||||
assert time.time() > (now + 0.250)
|
||||
|
||||
|
||||
class BrokerTimerTest(testlib.TestCase):
|
||||
klass = mitogen.master.Broker
|
||||
|
||||
def test_call_later(self):
|
||||
broker = self.klass()
|
||||
try:
|
||||
do_timer_test(broker)
|
||||
finally:
|
||||
broker.shutdown()
|
||||
broker.join()
|
||||
|
||||
def test_child_upgrade(self):
|
||||
router = mitogen.master.Router()
|
||||
try:
|
||||
c = router.local()
|
||||
c.call(mitogen.parent.upgrade_router)
|
||||
c.call(do_timer_test_econtext)
|
||||
finally:
|
||||
router.broker.shutdown()
|
||||
router.broker.join()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest2.main()
|
Loading…
Reference in New Issue