--- /dev/null
+#!/usr/bin/env python
+
+from __future__ import absolute_import, print_function
+
+import time
+import unittest
+
+import mock
+import pykka
+
+import arvnodeman.timedcallback as timedcallback
+from . import testutil
+
+@testutil.no_sleep
+class TimedCallBackActorTestCase(testutil.ActorTestMixin, unittest.TestCase):
+ def test_immediate_turnaround(self):
+ future = self.FUTURE_CLASS()
+ deliverer = timedcallback.TimedCallBackActor.start().proxy()
+ deliverer.schedule(time.time() - 1, future.set, 'immediate')
+ self.assertEqual('immediate', future.get(self.TIMEOUT))
+
+ def test_delayed_turnaround(self):
+ future = self.FUTURE_CLASS()
+ with mock.patch('time.time', return_value=0) as mock_now:
+ deliverer = timedcallback.TimedCallBackActor.start().proxy()
+ deliverer.schedule(1, future.set, 'delayed')
+ self.assertRaises(pykka.Timeout, future.get, .5)
+ mock_now.return_value = 2
+ self.assertEqual('delayed', future.get(self.TIMEOUT))
+
+ def test_out_of_order_scheduling(self):
+ future1 = self.FUTURE_CLASS()
+ future2 = self.FUTURE_CLASS()
+ with mock.patch('time.time', return_value=1.5) as mock_now:
+ deliverer = timedcallback.TimedCallBackActor.start().proxy()
+ deliverer.schedule(2, future2.set, 'second')
+ deliverer.schedule(1, future1.set, 'first')
+ self.assertEqual('first', future1.get(self.TIMEOUT))
+ self.assertRaises(pykka.Timeout, future2.get, .1)
+ mock_now.return_value = 3
+ self.assertEqual('second', future2.get(self.TIMEOUT))
+
+ def test_dead_actors_ignored(self):
+ receiver = mock.Mock(name='dead_actor', spec=pykka.ActorRef)
+ receiver.tell.side_effect = pykka.ActorDeadError
+ deliverer = timedcallback.TimedCallBackActor.start().proxy()
+ deliverer.schedule(time.time() - 1, receiver.tell, 'error')
+ self.wait_for_call(receiver.tell)
+ receiver.tell.assert_called_with('error')
+ self.assertTrue(deliverer.actor_ref.is_alive(), "deliverer died")
+
+
+if __name__ == '__main__':
+ unittest.main()
+