|
| 1 | +import asyncio |
| 2 | +import pathlib |
| 3 | +import subprocess |
| 4 | +from unittest.mock import AsyncMock, MagicMock, patch |
| 5 | + |
| 6 | +import pytest |
| 7 | + |
| 8 | +from exceptions import FirmwareUploadFail, InvalidUploadTool, UploadToolNotFound |
| 9 | +from firmware.FirmwareUpload import FirmwareUploader |
| 10 | + |
| 11 | + |
| 12 | +class TestFirmwareUploader: |
| 13 | + """Test cases for FirmwareUploader class.""" |
| 14 | + |
| 15 | + def test_binary_name(self) -> None: |
| 16 | + """Test that binary_name returns the correct name.""" |
| 17 | + assert FirmwareUploader.binary_name() == "ardupilot_fw_uploader.py" |
| 18 | + |
| 19 | + @patch("shutil.which") |
| 20 | + def test_init_binary_not_found(self, mock_which: MagicMock) -> None: |
| 21 | + """Test that UploadToolNotFound is raised when binary is not found.""" |
| 22 | + mock_which.return_value = None |
| 23 | + with pytest.raises(UploadToolNotFound, match="Uploader binary not found on system's PATH."): |
| 24 | + FirmwareUploader() |
| 25 | + |
| 26 | + @patch("shutil.which") |
| 27 | + @patch("subprocess.check_output") |
| 28 | + def test_init_binary_invalid(self, mock_check_output: MagicMock, mock_which: MagicMock) -> None: |
| 29 | + """Test that InvalidUploadTool is raised when binary validation fails.""" |
| 30 | + mock_which.return_value = "/fake/path/ardupilot_fw_uploader.py" |
| 31 | + mock_check_output.side_effect = subprocess.CalledProcessError(1, "test") |
| 32 | + |
| 33 | + with pytest.raises(InvalidUploadTool): |
| 34 | + FirmwareUploader() |
| 35 | + |
| 36 | + @patch("shutil.which") |
| 37 | + @patch("subprocess.check_output") |
| 38 | + def test_init_success(self, mock_check_output: MagicMock, mock_which: MagicMock) -> None: |
| 39 | + """Test successful initialization.""" |
| 40 | + mock_which.return_value = "/fake/path/ardupilot_fw_uploader.py" |
| 41 | + mock_check_output.return_value = b"help output" |
| 42 | + |
| 43 | + uploader = FirmwareUploader() |
| 44 | + assert uploader.binary() == pathlib.Path("/fake/path/ardupilot_fw_uploader.py") |
| 45 | + |
| 46 | + @patch("shutil.which") |
| 47 | + @patch("subprocess.check_output") |
| 48 | + def test_set_autopilot_port(self, mock_check_output: MagicMock, mock_which: MagicMock) -> None: |
| 49 | + """Test setting autopilot port.""" |
| 50 | + mock_which.return_value = "/fake/path/ardupilot_fw_uploader.py" |
| 51 | + mock_check_output.return_value = b"help output" |
| 52 | + |
| 53 | + uploader = FirmwareUploader() |
| 54 | + new_port = pathlib.Path("/dev/ttyUSB0") |
| 55 | + uploader.set_autopilot_port(new_port) |
| 56 | + assert uploader._autopilot_port == new_port |
| 57 | + |
| 58 | + @patch("shutil.which") |
| 59 | + @patch("subprocess.check_output") |
| 60 | + def test_set_baudrate_bootloader(self, mock_check_output: MagicMock, mock_which: MagicMock) -> None: |
| 61 | + """Test setting bootloader baudrate.""" |
| 62 | + mock_which.return_value = "/fake/path/ardupilot_fw_uploader.py" |
| 63 | + mock_check_output.return_value = b"help output" |
| 64 | + |
| 65 | + uploader = FirmwareUploader() |
| 66 | + uploader.set_baudrate_bootloader(921600) |
| 67 | + assert uploader._baudrate_bootloader == 921600 |
| 68 | + |
| 69 | + @patch("shutil.which") |
| 70 | + @patch("subprocess.check_output") |
| 71 | + def test_set_baudrate_flightstack(self, mock_check_output: MagicMock, mock_which: MagicMock) -> None: |
| 72 | + """Test setting flightstack baudrate.""" |
| 73 | + mock_which.return_value = "/fake/path/ardupilot_fw_uploader.py" |
| 74 | + mock_check_output.return_value = b"help output" |
| 75 | + |
| 76 | + uploader = FirmwareUploader() |
| 77 | + uploader.set_baudrate_flightstack(115200) |
| 78 | + assert uploader._baudrate_flightstack == 115200 |
0 commit comments