Merge branch '4042-run-command-MxN' closes #4042
[arvados.git] / services / nodemanager / tests / test_timedcallback.py
1 #!/usr/bin/env python
2
3 from __future__ import absolute_import, print_function
4
5 import time
6 import unittest
7
8 import mock
9 import pykka
10
11 import arvnodeman.timedcallback as timedcallback
12 from . import testutil
13
14 @testutil.no_sleep
15 class TimedCallBackActorTestCase(testutil.ActorTestMixin, unittest.TestCase):
16     def test_immediate_turnaround(self):
17         future = self.FUTURE_CLASS()
18         deliverer = timedcallback.TimedCallBackActor.start().proxy()
19         deliverer.schedule(time.time() - 1, future.set, 'immediate')
20         self.assertEqual('immediate', future.get(self.TIMEOUT))
21
22     def test_delayed_turnaround(self):
23         future = self.FUTURE_CLASS()
24         with mock.patch('time.time', return_value=0) as mock_now:
25             deliverer = timedcallback.TimedCallBackActor.start().proxy()
26             deliverer.schedule(1, future.set, 'delayed')
27             self.assertRaises(pykka.Timeout, future.get, .5)
28             mock_now.return_value = 2
29             self.assertEqual('delayed', future.get(self.TIMEOUT))
30
31     def test_out_of_order_scheduling(self):
32         future1 = self.FUTURE_CLASS()
33         future2 = self.FUTURE_CLASS()
34         with mock.patch('time.time', return_value=1.5) as mock_now:
35             deliverer = timedcallback.TimedCallBackActor.start().proxy()
36             deliverer.schedule(2, future2.set, 'second')
37             deliverer.schedule(1, future1.set, 'first')
38             self.assertEqual('first', future1.get(self.TIMEOUT))
39             self.assertRaises(pykka.Timeout, future2.get, .1)
40             mock_now.return_value = 3
41             self.assertEqual('second', future2.get(self.TIMEOUT))
42
43     def test_dead_actors_ignored(self):
44         receiver = mock.Mock(name='dead_actor', spec=pykka.ActorRef)
45         receiver.tell.side_effect = pykka.ActorDeadError
46         deliverer = timedcallback.TimedCallBackActor.start().proxy()
47         deliverer.schedule(time.time() - 1, receiver.tell, 'error')
48         self.wait_for_call(receiver.tell)
49         receiver.tell.assert_called_with('error')
50         self.assertTrue(deliverer.actor_ref.is_alive(), "deliverer died")
51
52
53 if __name__ == '__main__':
54     unittest.main()
55