|
5 | 5 | the default `get_max_packet_size` returns the correct value. |
6 | 6 | """ |
7 | 7 |
|
| 8 | +from unittest.mock import MagicMock |
| 9 | + |
8 | 10 | import pytest |
9 | 11 | from pysquared.hardware.radio.manager.base import BaseRadioManager |
10 | 12 | from pysquared.hardware.radio.modulation import LoRa |
@@ -82,3 +84,94 @@ def test_get_max_packet_size(): |
82 | 84 |
|
83 | 85 | # Check that get_max_packet_size returns the default packet size |
84 | 86 | assert mock_manager.get_max_packet_size() == 128 # Default value |
| 87 | + |
| 88 | + |
| 89 | +def test_send_oversized_packet_truncates(): |
| 90 | + """Tests that oversized packets are truncated and a warning is logged. |
| 91 | +
|
| 92 | + This test verifies that when a packet larger than max_packet_size is sent, |
| 93 | + the BaseRadioManager logs a warning and truncates the data to max_packet_size |
| 94 | + before sending. |
| 95 | + """ |
| 96 | + # Create a mock instance of the BaseRadioManager |
| 97 | + mock_manager = BaseRadioManager.__new__(BaseRadioManager) |
| 98 | + mock_manager._log = MagicMock() |
| 99 | + mock_manager._radio_config = MagicMock() |
| 100 | + mock_manager._radio_config.license = "test_license" |
| 101 | + |
| 102 | + # Mock get_max_packet_size to return a small value for testing |
| 103 | + mock_manager.get_max_packet_size = MagicMock(return_value=10) |
| 104 | + |
| 105 | + # Mock _send_internal to capture what data is actually sent |
| 106 | + sent_data = [] |
| 107 | + |
| 108 | + def capture_send(data: bytes) -> bool: |
| 109 | + """Captures sent data for verification.""" |
| 110 | + sent_data.append(data) |
| 111 | + return True |
| 112 | + |
| 113 | + mock_manager._send_internal = capture_send |
| 114 | + |
| 115 | + # Create data larger than max packet size |
| 116 | + oversized_data = b"This is a message that is longer than 10 bytes" |
| 117 | + |
| 118 | + # Send the oversized data |
| 119 | + result = mock_manager.send(oversized_data) |
| 120 | + |
| 121 | + # Verify that send was successful |
| 122 | + assert result is True |
| 123 | + |
| 124 | + # Verify that a warning was logged |
| 125 | + mock_manager._log.warning.assert_called_once() |
| 126 | + warning_call = mock_manager._log.warning.call_args |
| 127 | + assert warning_call[0][0] == "Data exceeds max packet size, truncating" |
| 128 | + assert warning_call[1]["data_length"] == len(oversized_data) |
| 129 | + assert warning_call[1]["max_packet_size"] == 10 |
| 130 | + |
| 131 | + # Verify that the data was truncated to max_packet_size |
| 132 | + assert len(sent_data) == 1 |
| 133 | + assert sent_data[0] == oversized_data[:10] |
| 134 | + assert len(sent_data[0]) == 10 |
| 135 | + |
| 136 | + |
| 137 | +def test_send_exact_size_packet_no_warning(): |
| 138 | + """Tests that packets at exactly max_packet_size do not trigger a warning. |
| 139 | +
|
| 140 | + This test verifies that when a packet of exactly max_packet_size is sent, |
| 141 | + no warning is logged and the data is sent as-is. |
| 142 | + """ |
| 143 | + # Create a mock instance of the BaseRadioManager |
| 144 | + mock_manager = BaseRadioManager.__new__(BaseRadioManager) |
| 145 | + mock_manager._log = MagicMock() |
| 146 | + mock_manager._radio_config = MagicMock() |
| 147 | + mock_manager._radio_config.license = "test_license" |
| 148 | + |
| 149 | + # Mock get_max_packet_size to return a small value for testing |
| 150 | + mock_manager.get_max_packet_size = MagicMock(return_value=10) |
| 151 | + |
| 152 | + # Mock _send_internal to capture what data is actually sent |
| 153 | + sent_data = [] |
| 154 | + |
| 155 | + def capture_send(data: bytes) -> bool: |
| 156 | + """Captures sent data for verification.""" |
| 157 | + sent_data.append(data) |
| 158 | + return True |
| 159 | + |
| 160 | + mock_manager._send_internal = capture_send |
| 161 | + |
| 162 | + # Create data exactly at max packet size |
| 163 | + exact_size_data = b"0123456789" # Exactly 10 bytes |
| 164 | + |
| 165 | + # Send the data |
| 166 | + result = mock_manager.send(exact_size_data) |
| 167 | + |
| 168 | + # Verify that send was successful |
| 169 | + assert result is True |
| 170 | + |
| 171 | + # Verify that no warning was logged about truncation |
| 172 | + mock_manager._log.warning.assert_not_called() |
| 173 | + |
| 174 | + # Verify that the data was sent as-is |
| 175 | + assert len(sent_data) == 1 |
| 176 | + assert sent_data[0] == exact_size_data |
| 177 | + assert len(sent_data[0]) == 10 |
0 commit comments