""" Tests for pika.heartbeat """ import unittest import mock from pika import connection, frame, heartbeat class HeartbeatTests(unittest.TestCase): INTERVAL = 60 SEND_INTERVAL = float(INTERVAL) / 2 CHECK_INTERVAL = INTERVAL + 5 def setUp(self): self.mock_conn = mock.Mock(spec=connection.Connection) self.mock_conn.bytes_received = 100 self.mock_conn.bytes_sent = 100 self.mock_conn.heartbeat = mock.Mock(spec=heartbeat.HeartbeatChecker) self.obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) def tearDown(self): del self.obj del self.mock_conn def test_constructor_assignment_connection(self): self.assertIs(self.obj._connection, self.mock_conn) def test_constructor_assignment_intervals(self): self.assertEqual(self.obj._send_interval, self.SEND_INTERVAL) self.assertEqual(self.obj._check_interval, self.CHECK_INTERVAL) def test_constructor_initial_bytes_received(self): # Note: _bytes_received is initialized by calls # to _start_check_timer which calls _update_counters # which reads the initial values from the connection self.assertEqual(self.obj._bytes_received, self.mock_conn.bytes_received) def test_constructor_initial_bytes_sent(self): # Note: _bytes_received is initialized by calls # to _start_check_timer which calls _update_counters # which reads the initial values from the connection self.assertEqual(self.obj._bytes_sent, self.mock_conn.bytes_sent) def test_constructor_initial_heartbeat_frames_received(self): self.assertEqual(self.obj._heartbeat_frames_received, 0) def test_constructor_initial_heartbeat_frames_sent(self): self.assertEqual(self.obj._heartbeat_frames_sent, 0) def test_constructor_initial_idle_byte_intervals(self): self.assertEqual(self.obj._idle_byte_intervals, 0) @mock.patch('pika.heartbeat.HeartbeatChecker._start_send_timer') def test_constructor_called_start_send_timer(self, timer): heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) timer.assert_called_once_with() @mock.patch('pika.heartbeat.HeartbeatChecker._start_check_timer') def test_constructor_called_start_check_timer(self, timer): heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) timer.assert_called_once_with() def test_bytes_received_on_connection(self): self.mock_conn.bytes_received = 128 self.assertEqual(self.obj.bytes_received_on_connection, 128) def test_connection_is_idle_false(self): self.assertFalse(self.obj.connection_is_idle) def test_connection_is_idle_true(self): self.obj._idle_byte_intervals = self.INTERVAL self.assertTrue(self.obj.connection_is_idle) def test_received(self): self.obj.received() self.assertTrue(self.obj._heartbeat_frames_received, 1) @mock.patch('pika.heartbeat.HeartbeatChecker._close_connection') def test_send_heartbeat_not_closed(self, close_connection): obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) obj._send_heartbeat() close_connection.assert_not_called() @mock.patch('pika.heartbeat.HeartbeatChecker._close_connection') def test_check_heartbeat_not_closed(self, close_connection): obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) self.mock_conn.bytes_received = 128 obj._check_heartbeat() close_connection.assert_not_called() @mock.patch('pika.heartbeat.HeartbeatChecker._close_connection') def test_check_heartbeat_missed_bytes(self, close_connection): obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) obj._idle_byte_intervals = self.INTERVAL obj._check_heartbeat() close_connection.assert_called_once_with() def test_check_heartbeat_increment_no_bytes(self): self.mock_conn.bytes_received = 100 self.obj._bytes_received = 100 self.obj._check_heartbeat() self.assertEqual(self.obj._idle_byte_intervals, 1) def test_check_heartbeat_increment_bytes(self): self.mock_conn.bytes_received = 100 self.obj._bytes_received = 128 self.obj._check_heartbeat() self.assertEqual(self.obj._idle_byte_intervals, 0) @mock.patch('pika.heartbeat.HeartbeatChecker._update_counters') def test_check_heartbeat_update_counters(self, update_counters): heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) update_counters.assert_called_once_with() @mock.patch('pika.heartbeat.HeartbeatChecker._send_heartbeat_frame') def test_send_heartbeat_sends_heartbeat_frame(self, send_heartbeat_frame): obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) obj._send_heartbeat() send_heartbeat_frame.assert_called_once_with() @mock.patch('pika.heartbeat.HeartbeatChecker._start_send_timer') def test_send_heartbeat_start_timer(self, start_send_timer): heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) start_send_timer.assert_called_once_with() @mock.patch('pika.heartbeat.HeartbeatChecker._start_check_timer') def test_check_heartbeat_start_timer(self, start_check_timer): heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL) start_check_timer.assert_called_once_with() def test_connection_close(self): self.obj._idle_byte_intervals = 3 self.obj._idle_heartbeat_intervals = 4 self.obj._close_connection() reason = self.obj._STALE_CONNECTION % self.obj._timeout self.mock_conn.close.assert_called_once_with( self.obj._CONNECTION_FORCED, reason) self.mock_conn._on_terminate.assert_called_once_with( self.obj._CONNECTION_FORCED, reason) def test_has_received_data_false(self): self.obj._bytes_received = 100 self.assertFalse(self.obj._has_received_data) def test_has_received_data_true(self): self.mock_conn.bytes_received = 128 self.obj._bytes_received = 100 self.assertTrue(self.obj._has_received_data) def test_new_heartbeat_frame(self): self.assertIsInstance(self.obj._new_heartbeat_frame(), frame.Heartbeat) def test_send_heartbeat_send_frame_called(self): frame_value = self.obj._new_heartbeat_frame() with mock.patch.object(self.obj, '_new_heartbeat_frame') as new_frame: new_frame.return_value = frame_value self.obj._send_heartbeat_frame() self.mock_conn._send_frame.assert_called_once_with(frame_value) def test_send_heartbeat_counter_incremented(self): self.obj._send_heartbeat_frame() self.assertEqual(self.obj._heartbeat_frames_sent, 1) def test_start_send_timer_called(self): want = [mock.call(self.SEND_INTERVAL, self.obj._send_heartbeat), mock.call(self.CHECK_INTERVAL, self.obj._check_heartbeat)] got = self.mock_conn.add_timeout.call_args_list self.assertEqual(got, want) @mock.patch('pika.heartbeat.HeartbeatChecker._start_send_timer') def test_start_timer_active(self, setup_send_timer): self.mock_conn.heartbeat = self.obj self.obj._start_send_timer() self.assertTrue(setup_send_timer.called) def test_update_counters_bytes_received(self): self.mock_conn.bytes_received = 256 self.obj._update_counters() self.assertEqual(self.obj._bytes_received, 256) def test_update_counters_bytes_sent(self): self.mock_conn.bytes_sent = 256 self.obj._update_counters() self.assertEqual(self.obj._bytes_sent, 256)