2 # Copyright (C) The Arvados Authors. All rights reserved.
4 # SPDX-License-Identifier: AGPL-3.0
6 from __future__ import absolute_import, print_function
14 import arvnodeman.timedcallback as timedcallback
15 from . import testutil
18 class TimedCallBackActorTestCase(testutil.ActorTestMixin, unittest.TestCase):
19 def test_immediate_turnaround(self):
20 receiver = mock.Mock()
21 deliverer = timedcallback.TimedCallBackActor.start().proxy()
22 deliverer.schedule(time.time() - 1, receiver,
23 'immediate').get(self.TIMEOUT)
24 self.stop_proxy(deliverer)
25 receiver.assert_called_with('immediate')
27 def test_delayed_turnaround(self):
28 receiver = mock.Mock()
29 with mock.patch('time.time', return_value=0) as mock_now:
30 deliverer = timedcallback.TimedCallBackActor.start().proxy()
31 deliverer.schedule(1, receiver, 'delayed')
32 deliverer.schedule(3, receiver, 'failure').get(self.TIMEOUT)
33 self.assertFalse(receiver.called)
34 mock_now.return_value = 2
35 deliverer.schedule(3, receiver, 'failure').get(self.TIMEOUT)
36 self.stop_proxy(deliverer)
37 receiver.assert_called_with('delayed')
39 def test_out_of_order_scheduling(self):
40 receiver = mock.Mock()
41 with mock.patch('time.time', return_value=1.5) as mock_now:
42 deliverer = timedcallback.TimedCallBackActor.start().proxy()
43 deliverer.schedule(2, receiver, 'second')
44 deliverer.schedule(1, receiver, 'first')
45 deliverer.schedule(3, receiver, 'failure').get(self.TIMEOUT)
46 receiver.assert_called_with('first')
47 mock_now.return_value = 2.5
48 deliverer.schedule(3, receiver, 'failure').get(self.TIMEOUT)
49 self.stop_proxy(deliverer)
50 receiver.assert_called_with('second')
52 def test_dead_actors_ignored(self):
53 receiver = mock.Mock(name='dead_actor', spec=pykka.ActorRef)
54 receiver.tell.side_effect = pykka.ActorDeadError
55 deliverer = timedcallback.TimedCallBackActor.start().proxy()
56 deliverer.schedule(time.time() - 1, receiver.tell,
57 'error').get(self.TIMEOUT)
58 self.assertTrue(self.stop_proxy(deliverer), "deliverer died")
59 receiver.tell.assert_called_with('error')
62 if __name__ == '__main__':