2881: Add Node Manager service.
[arvados.git] / services / nodemanager / tests / test_timedcallback.py
diff --git a/services/nodemanager/tests/test_timedcallback.py b/services/nodemanager/tests/test_timedcallback.py
new file mode 100644 (file)
index 0000000..60f7b81
--- /dev/null
@@ -0,0 +1,55 @@
+#!/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()
+