diff --git a/docs/DEVELOPMENT_GUIDE.md b/docs/DEVELOPMENT_GUIDE.md index be111e1a9..630869fd2 100644 --- a/docs/DEVELOPMENT_GUIDE.md +++ b/docs/DEVELOPMENT_GUIDE.md @@ -232,9 +232,6 @@ pytest -x # Run specific test file pytest tests/test_params.py -# Run with physical device -pytest --fc -s - # Run specific test pytest -k "test_param_set" diff --git a/radio/app/controllers/missionController.py b/radio/app/controllers/missionController.py index e155f7b29..7d4464e4e 100644 --- a/radio/app/controllers/missionController.py +++ b/radio/app/controllers/missionController.py @@ -61,6 +61,27 @@ def _convertCoordinate(coordinate) -> Number: ) +def _wp_to_dict( + wp: mavutil.mavlink.MAVLink_mission_item_int_message, + altitude_decimal_places: int = 4, +) -> dict: + """ + Convert a MAVLink mission item to a dict, rounding the altitude (z) field + to a fixed number of decimal places to avoid floating-point noise. + + Args: + wp: A MAVLink mission item object with a to_dict() method. + altitude_decimal_places (int): Number of decimal places to round z to. + + Returns: + dict: The waypoint as a dictionary with z rounded. + """ + d = wp.to_dict() + if "z" in d and isinstance(d["z"], float): + d["z"] = round(d["z"], altitude_decimal_places) + return d + + def _getMissionName(mission_type: int) -> str: """ Get the name of the mission type. @@ -285,7 +306,7 @@ def importMissionFromFile( return { "success": True, "message": f"Waypoint file loaded {loader.count()} points successfully", - "data": [wp.to_dict() for wp in loader.wpoints], + "data": [_wp_to_dict(wp) for wp in loader.wpoints], } @@ -419,7 +440,7 @@ def getCurrentMission( return { "success": True, - "data": [item.to_dict() for item in mission_items.get("data", [])], + "data": [_wp_to_dict(item) for item in mission_items.get("data", [])], } except serial.serialutil.SerialException: return { @@ -456,9 +477,9 @@ def getCurrentMissionAll(self) -> Response: return { "success": True, "data": { - "mission_items": [item.to_dict() for item in mission_items], - "fence_items": [item.to_dict() for item in fence_items], - "rally_items": [item.to_dict() for item in rally_items], + "mission_items": [_wp_to_dict(item) for item in mission_items], + "fence_items": [_wp_to_dict(item) for item in fence_items], + "rally_items": [_wp_to_dict(item) for item in rally_items], }, } diff --git a/radio/tests/__init__.py b/radio/tests/__init__.py index 9842c6ce7..04e0ca1c2 100644 --- a/radio/tests/__init__.py +++ b/radio/tests/__init__.py @@ -1,7 +1,3 @@ -from typing import Callable, Optional - -import app.droneStatus as droneStatus -import pytest from app import create_app, socketio from flask.testing import FlaskClient from flask_socketio.test_client import SocketIOTestClient @@ -27,42 +23,3 @@ def ignore_link_debug_stats(data): socketio_client: SocketIOTestClient = socketio.test_client( app, flask_test_client=flask_client ) - - -def falcon_test(pass_drone_status: bool = False, pass_flask: bool = False) -> Callable: - """ - A wrapper to connect to backend and pass necessary details to test function - - Args: - pass_drone_status (bool): True if you want to accept the droneStatus file to the test func - pass_flask (bool): True if you want to accept the flask_test_client file to the test func - """ - - def run_test(test_func: Optional[Callable] = None): - """Inner wrapper to run test""" - - if test_func is None: - raise ValueError( - "You forgot to write parenthesis around falcon_test() so test_func was set to None" - ) - - def inner(*args, **kwargs): - # Make sure the server did not rejected the connection - assert socketio_client.is_connected() - - # Get variables to pass into test_func - passing_variables = {} - if pass_drone_status: - passing_variables["droneStatus"] = droneStatus - if pass_flask: - passing_variables["flask_client"] = flask_client - - # Run test - if droneStatus.drone is None and pass_drone_status: - pytest.skip("Passing as no flight controller was found.") - else: - test_func(socketio_client, *args, **passing_variables, **kwargs) - - return inner - - return run_test diff --git a/radio/tests/conftest.py b/radio/tests/conftest.py index 467f7bf96..7830e2309 100644 --- a/radio/tests/conftest.py +++ b/radio/tests/conftest.py @@ -1,7 +1,8 @@ -import app.droneStatus as droneStatus # noqa: F401 +import app.droneStatus as _droneStatus_module import pytest from app.drone import Drone -from app.utils import getComPort + +from tests import socketio_client as _socketio_client def pytest_configure(config): @@ -19,57 +20,55 @@ def setupDrone(connectionString: str) -> bool: Setup the drone globally, this is done before running pytest Args: - connectionString (str): Either the port for a physical device or network connection string for a simulator + connectionString (str): Network connection string for a simulator """ - global droneStatus - drone = Drone(connectionString) if drone.master is None: return False - droneStatus.drone = drone + _droneStatus_module.drone = drone return True -def pytest_addoption(parser): - parser.addoption("--fc", action="store_true") - - def pytest_sessionstart(session): """ Called after the Session object has been created and before performing collection and entering the run test loop. """ - global droneStatus - - connection_string = "tcp:127.0.0.1:5760" - - if session.config.getoption("--fc"): - print("\033[1;31;40mRUNNING TESTS WITH A PHYSICAL DEVICE \033[0m") - connection_string = getComPort() + print("\033[1;31;40mRUNNING TESTS WITH A SIMULATOR \033[0m") - else: - print("\033[1;31;40mRUNNING TESTS WITH A SIMULATOR \033[0m") - - success = setupDrone(connection_string) + success = setupDrone("tcp:127.0.0.1:5760") if not success: print("\033[1;31;40mFAILED TO CONNECT TO DRONE, EXITING TESTS\033[0m") pytest.exit(1) +@pytest.fixture +def droneStatus(): + """Fixture providing the droneStatus module""" + return _droneStatus_module + + +@pytest.fixture +def socketio_client(): + """Fixture providing the socketio test client""" + assert _socketio_client.is_connected(), "SocketIO test client is not connected" + return _socketio_client + + @pytest.fixture(autouse=True) def check_aircraft_type(request): """Fixture to skip tests based on aircraft type markers""" markers = [marker.name for marker in request.node.iter_markers()] - if droneStatus.drone is None: + if _droneStatus_module.drone is None: pytest.skip("No drone connected") return - aircraft_type = droneStatus.drone.aircraft_type + aircraft_type = _droneStatus_module.drone.aircraft_type # Skip if marked as plane_only but not a plane if "plane_only" in markers and aircraft_type != 1: diff --git a/radio/tests/ftp_test_files/expected_locations.txt b/radio/tests/ftp_test_files/expected_locations.txt deleted file mode 100644 index 3930c5745..000000000 --- a/radio/tests/ftp_test_files/expected_locations.txt +++ /dev/null @@ -1,106 +0,0 @@ -#NAME=latitude,longitude,absolute-altitude,heading -OSRF0=37.4003371,-122.0800351,0,353 -OSRF0_PILOTSBOX=37.4003371,-122.0800351,2,270 -CMAC=-35.363261,149.165230,584,353 -CMAC2=-35.362889,149.165221,584,270 -CMAC_South=-35.363261,149.165230,584,173 -CMAC_PILOTSBOX=-35.362734,149.165300,586,270 -CMAC_PILOTSBOX2=-35.362749,149.165359,584,270 -Kingaroy=-26.583528,151.840440,444,169 -AVC=40.0713749,-105.2297889,1583.702759,246 -AVC_copter=40.072842,-105.230575,1586,0 -AVC_plane=40.072842,-105.230575,1586,80 -McMillan=35.718719,-120.769818,275,295 -McMillan_East=35.7168007,-120.7644466,275,295 -TomCarpark=26.048950,-80.254219,6,270 -Ballarat=-37.598705,143.881744,485,165 -CRAMS=-27.675284,152.519307,58,285 # Calvert Radio Aero Modeller's Society -3DRBerkeley=37.872991,-122.302348,20,260 -BMAC=-35.226343,149.132122,588,301 -LGAT=37.889063,23.731863,21,330 -BHV=53.547767,8.626440,0,324 -QMAC=-35.363724,149.430011,740,312 -Karuizawa=36.323203,138.618215,926,0 -Dalby=-27.274439,151.290064,343,8.7 -RFRanch=37.118079,-2.773690,1297.88,180 -KSFO=37.619373,-122.376637,5.3,118 -NFSC=53.637561,9.929800,13,345 -Rotherham=53.275131,-1.19404,21,360 -LeeField=32.42553,-84.79109,75,260 -Sterling=38.982480,-77.439567,88,90 -EPIgijon=43.521902,-5.624310,22,0 -PerkinsField=36.163609,-78.806864,137,20 -KNUI=38.145322,-76.426652,7,70 -Range11=41.360461,-74.032838,220,180 -Flicker=39.018801,-104.893081,2158,180 -ElliottField=34.458281,-84.180209,450,130 -CobbCountyRC=34.013819,-84.724446,280,105 -GrupoSicoss=19.316518,-99.220255,0,0 -Garrawarra=-34.159752,150.967395,293,165 -Snarbyeidet=69.775839,19.548929,87,170 -Breivikeidet=69.624025,19.414047,55,235 -Hata=35.671497,140.083934,6,165 -TagusPark=38.740195,-9.301843,151,0 -Marcopter=44.806968,11.610389,0,90 -HMAS=-33.661500,150.841431,18,0 -RATBeach=33.810313,-118.393867,0,270 -Carstensz=-35.331302,149.132103,606,60 -Skyrocket=33.982069,-118.426372,11,134 -SkyViperFactory=23.021754,114.073139,13,0 -KazakoshiPark=36.321909,138.596021,932,0 -SKT=44.850687,-0.684029,45,0 -UChicago=41.7886079,-87.59871329999999,191,0 -Yachiyo=35.770481,140.107929,36,90 -Tyndall=30.0142232,-85.4984701,7,0 -Elvenes=68.871422,17.986690,17,256 -Kawachi=35.879129,140.339683,7,0 -SpringValley=-35.280252,149.005821,580.8,5 -SpringValley2=-35.28240059,149.00542037,582,10 -SpringValley3=-35.28240515,149.00716878,579,12.6 -SpringValley4=-35.2824768,149.0071759,594.99,0 -SpringValleyRoad=-35.28899126,149.00553365,603,162.7 -Pyramid=29.9764,31.1339,0,0 -AAMEastField=39.842288,-105.212928,1809,106 -HachinoheMine=40.4539496,141.5419051,56,270 -HighwayField=-33.950458,22.977709,240,300 -AAMWestField=39.842218,-105.219375,1814,90.5 -EliField=40.059488,-88.551314,206,37 -Goretovka=55.9689,37.1101,200,290 -Kris=22.74005960,120.30975281,21,0 -ARACE_copter=47.5211929,18.8082355,198,55 -ARACE_plane=47.5210876,18.8083948,198,55 -ARACE_hand=47.5211516,18.8081607,198,55 -NDRCC=33.24065965,-96.93759168,163.5,167 -Boquig=16.090473,120.361478,3,0 -Semisopochnoi=51.9634,179.756,120.0,90.0 -Unalga=51.578,-179.0483,42.0,270.0 -Rabi=-16.51273251,179.97642023,7.5,90 -KFC=34.8412920,136.2154873,196.36,338 -KawaguchiLake=35.4712023,138.7450261,965,90 -GrandCanyon=36.146,-113.89,1425.6,90 -YPG=32.976658,-114.266699,252.97,235 -Yuma=32.638083,-114.403104,95,0 -Williams=39.16124,-122.13187,23,0 -WilliamsVtol=39.1652640,-122.131755,23,180 -SCCMAS=37.1730398,-121.6815865,102,315 -ARPstrip_NZ=-43.6544343,172.5031829,0,156 #Strip in New Zealand -ARPstrip_NZ_S=-43.6541316,172.5029844,0,156 #Strip in New Zealand, South takeoff -ARPstrip_NZ_N=-43.6545022,172.5031883,0,336 #Strip in New Zealand, North takeoff -CMAC_NZ_E=-43.47493266,172.318144,0,84 #Christchurch MAC, New Zealand, East takeoff -CMAC_NZ_W=-43.47493266,172.318144,0,264 #Christchurch MAC, New Zealand, West takeoff -OSPN=30.53202,-97.62892,199,7 #Old Settlers Park , Austin, TX, North takeof -OSP=30.53202,-97.62892,199,187 #Old Settlers Park , Austin, TX, South takeof -KalaupapaCliffs=21.16564233,-156.88680160,165.25,0 -Portmoak=56.191,-3.323271,164,270 -LakeGeorgeLookout=-35.10122092,149.37517574,708.12,90 -RF_AirStadium=36.893328,-2.720371,1434,0 -RF_BuenaVista=37.093686,-2.890969,2390,0 -RF_Castle=37.090662,-3.074557,2736,0 -RF_Garage=37.621798,-2.646596,788,0 -Madera=36.9287648,-119.8498046,82,290 -Peg=36.7099085,-119.4076592,141,289 -SFO_Bay=37.62561973,-122.33235387,0.0,0 -Egge=60.215720,10.324071,198,303 -Gundaroo=-35.02349196,149.26496411,576.8,0 -Kaga=36.3268982,136.3316638,44,0 -UCSB=34.413963,-119.848946,0,0 diff --git a/radio/tests/mission_test_files/exported_mission_check.txt b/radio/tests/mission_test_files/exported_mission_check.txt index 1b5bb8de9..ebffedf37 100644 --- a/radio/tests/mission_test_files/exported_mission_check.txt +++ b/radio/tests/mission_test_files/exported_mission_check.txt @@ -1,5 +1,5 @@ QGC WPL 110 -0 0 0 16 0.000000 0.000000 0.000000 0.000000 52.780569 -0.707924 0.100000 1 +0 0 0 16 0.000000 0.000000 0.000000 0.000000 52.780569 -0.707923 0.190000 1 1 0 3 22 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 30.000000 1 2 0 3 16 0.000000 0.000000 0.000000 0.000000 52.780320 -0.709793 30.000000 1 3 0 3 16 0.000000 0.000000 0.000000 0.000000 52.781228 -0.709895 30.000000 1 diff --git a/radio/tests/mission_test_files/test_getCurrentMission_correctMission_result.json b/radio/tests/mission_test_files/test_getCurrentMission_correctMission_result.json index 017a018a1..63977e8b1 100644 --- a/radio/tests/mission_test_files/test_getCurrentMission_correctMission_result.json +++ b/radio/tests/mission_test_files/test_getCurrentMission_correctMission_result.json @@ -16,9 +16,9 @@ "seq": 0, "target_component": 190, "target_system": 255, - "x": 527805690, - "y": -7079236, - "z": 0.09999999403953552 + "x": 527805691, + "y": -7079234, + "z": 0.19 }, { "mavpackettype": "MISSION_ITEM_INT", diff --git a/radio/tests/mission_test_files/test_getCurrentMission_correctState_result.json b/radio/tests/mission_test_files/test_getCurrentMission_correctState_result.json index 1bff5b12f..fc00b9148 100644 --- a/radio/tests/mission_test_files/test_getCurrentMission_correctState_result.json +++ b/radio/tests/mission_test_files/test_getCurrentMission_correctState_result.json @@ -15,9 +15,9 @@ "seq": 0, "target_component": 190, "target_system": 255, - "x": 527805690, - "y": -7079236, - "z": 0.09999999403953552 + "x": 527805691, + "y": -7079234, + "z": 0.19 }, { "mavpackettype": "MISSION_ITEM_INT", diff --git a/radio/tests/mission_test_files/test_writeCurrentMission_uploadMissionSuccess_data.json b/radio/tests/mission_test_files/test_writeCurrentMission_uploadMissionSuccess_data.json index 8e91611c9..65e2006ee 100644 --- a/radio/tests/mission_test_files/test_writeCurrentMission_uploadMissionSuccess_data.json +++ b/radio/tests/mission_test_files/test_writeCurrentMission_uploadMissionSuccess_data.json @@ -15,9 +15,9 @@ "seq": 0, "target_component": 190, "target_system": 255, - "x": 527805690, - "y": -7079236, - "z": 0.09999999403953552 + "x": 527805691, + "y": -7079234, + "z": 0.19 }, { "mavpackettype": "MISSION_ITEM_INT", diff --git a/radio/tests/test_FlightModesController.py b/radio/tests/test_FlightModesController.py index 8a3ba6205..82cb837f4 100644 --- a/radio/tests/test_FlightModesController.py +++ b/radio/tests/test_FlightModesController.py @@ -1,9 +1,7 @@ import time import pytest -from flask_socketio.test_client import SocketIOTestClient -from . import falcon_test from .helpers import ( FakeTCP, WaitForMessageReturnsNone, @@ -28,22 +26,19 @@ def run_once_after_all_tests(): droneStatus.drone.flightModesController.setFlightMode(1, 7) -@falcon_test(pass_drone_status=True) -def test_getFlightModeChannel_success(client: SocketIOTestClient, droneStatus): +def test_getFlightModeChannel_success(droneStatus): droneStatus.drone.flightModesController.getFlightModeChannel() assert droneStatus.drone.flightModesController.flight_mode_channel != "UNKNOWN" -@falcon_test(pass_drone_status=True) -def test_getFlightModes_success(client: SocketIOTestClient, droneStatus): +def test_getFlightModes_success(droneStatus): droneStatus.drone.flightModesController.getFlightModes() assert len(droneStatus.drone.flightModesController.flight_modes) == 6 for items in droneStatus.drone.flightModesController.flight_modes: assert items != "UNKNOWN" -@falcon_test(pass_drone_status=True) -def test_getFlightModes_failure(client: SocketIOTestClient, droneStatus): +def test_getFlightModes_failure(droneStatus): with WaitForMessageReturnsNone(): droneStatus.drone.flightModesController.getFlightModes() assert len(droneStatus.drone.flightModesController.flight_modes) == 6 @@ -51,8 +46,7 @@ def test_getFlightModes_failure(client: SocketIOTestClient, droneStatus): assert items == "UNKNOWN" -@falcon_test(pass_drone_status=True) -def test_getFlightModeChannel_failure(client: SocketIOTestClient, droneStatus): +def test_getFlightModeChannel_failure(droneStatus): with WaitForMessageReturnsNone(): original_flight_mode_channel = ( droneStatus.drone.flightModesController.flight_mode_channel @@ -65,14 +59,12 @@ def test_getFlightModeChannel_failure(client: SocketIOTestClient, droneStatus): ) -@falcon_test(pass_drone_status=True) -def test_refreshdata(client: SocketIOTestClient, droneStatus): +def test_refreshdata(droneStatus): droneStatus.drone.flightModesController.refreshData() assert len(droneStatus.drone.flightModesController.flight_modes) == 6 -@falcon_test(pass_drone_status=True) -def test_setCurrentFlightMode(client: SocketIOTestClient, droneStatus): +def test_setCurrentFlightMode(droneStatus): with FakeTCP(): response = droneStatus.drone.flightModesController.setCurrentFlightMode(1) assert response == { @@ -94,8 +86,7 @@ def test_setCurrentFlightMode(client: SocketIOTestClient, droneStatus): } -@falcon_test(pass_drone_status=True) -def test_setFlightMode_invalidData(client: SocketIOTestClient, droneStatus): +def test_setFlightMode_invalidData(droneStatus): response = droneStatus.drone.flightModesController.setFlightMode(0, 1) assert response == { "success": False, @@ -122,8 +113,7 @@ def test_setFlightMode_invalidData(client: SocketIOTestClient, droneStatus): @pytest.mark.copter_only -@falcon_test(pass_drone_status=True) -def test_setFlightMode_invalidData_copter(client: SocketIOTestClient, droneStatus): +def test_setFlightMode_invalidData_copter(droneStatus): response = droneStatus.drone.flightModesController.setFlightMode(1, -2) assert response == { "success": False, @@ -145,19 +135,17 @@ def test_setFlightMode_invalidData_copter(client: SocketIOTestClient, droneStatu @pytest.mark.copter_only -@falcon_test(pass_drone_status=True) -def test_setFlightMode_success_copter(client: SocketIOTestClient, droneStatus): - response = droneStatus.drone.flightModesController.setFlightMode(1, 5) +def test_setFlightMode_success_copter(droneStatus): + response = droneStatus.drone.flightModesController.setFlightMode(1, 2) assert response == { "success": True, - "message": "Flight mode 1 set to COPTER_MODE_LOITER", + "message": "Flight mode 1 set to COPTER_MODE_ALT_HOLD", } - assert droneStatus.drone.flightModesController.flight_modes[0] == 5 + assert droneStatus.drone.flightModesController.flight_modes[0] == 2 @pytest.mark.plane_only -@falcon_test(pass_drone_status=True) -def test_setFlightMode_invalidData_plane(client: SocketIOTestClient, droneStatus): +def test_setFlightMode_invalidData_plane(droneStatus): response = droneStatus.drone.flightModesController.setFlightMode(1, -2) assert response == { "success": False, @@ -179,8 +167,7 @@ def test_setFlightMode_invalidData_plane(client: SocketIOTestClient, droneStatus @pytest.mark.plane_only -@falcon_test(pass_drone_status=True) -def test_setFlightMode_success_plane(client: SocketIOTestClient, droneStatus): +def test_setFlightMode_success_plane(droneStatus): response = droneStatus.drone.flightModesController.setFlightMode(1, 5) assert response == { "success": True, @@ -189,8 +176,7 @@ def test_setFlightMode_success_plane(client: SocketIOTestClient, droneStatus): assert droneStatus.drone.flightModesController.flight_modes[0] == 5 -@falcon_test(pass_drone_status=True) -def test_setFlightModeChannel_invalidData(client: SocketIOTestClient, droneStatus): +def test_setFlightModeChannel_invalidData(droneStatus): response = droneStatus.drone.flightModesController.setFlightModeChannel(0) assert response == { "success": False, diff --git a/radio/tests/test_arm.py b/radio/tests/test_arm.py index a242f02fb..f0124408b 100644 --- a/radio/tests/test_arm.py +++ b/radio/tests/test_arm.py @@ -3,7 +3,6 @@ import pytest from flask_socketio.test_client import SocketIOTestClient -from . import falcon_test from .helpers import FakeTCP, NoDrone @@ -52,7 +51,6 @@ def assert_drone_armed(droneStatus, armed: bool) -> None: assert bool(droneStatus.drone.master.motors_armed()) == armed -@falcon_test(pass_drone_status=True) def test_arm_succeeds_when_disarmed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -71,7 +69,6 @@ def test_arm_succeeds_when_disarmed( assert_drone_armed(droneStatus, armed=True) -@falcon_test(pass_drone_status=True) def test_arm_fails_when_already_armed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -92,7 +89,6 @@ def test_arm_fails_when_already_armed( assert_drone_armed(droneStatus, armed=True) -@falcon_test(pass_drone_status=True) def test_disarm_succeeds_when_armed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -113,7 +109,6 @@ def test_disarm_succeeds_when_armed( assert_drone_armed(droneStatus, armed=False) -@falcon_test(pass_drone_status=True) def test_disarm_fails_when_already_disarmed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -132,7 +127,6 @@ def test_disarm_fails_when_already_disarmed( assert_drone_armed(droneStatus, armed=False) -@falcon_test(pass_drone_status=True) def test_force_arm_succeeds_when_disarmed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -151,7 +145,6 @@ def test_force_arm_succeeds_when_disarmed( assert_drone_armed(droneStatus, armed=True) -@falcon_test(pass_drone_status=True) def test_force_arm_fails_when_already_armed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -172,7 +165,6 @@ def test_force_arm_fails_when_already_armed( assert_drone_armed(droneStatus, armed=True) -@falcon_test(pass_drone_status=True) def test_force_disarm_succeeds_when_armed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -193,7 +185,6 @@ def test_force_disarm_succeeds_when_armed( assert_drone_armed(droneStatus, armed=False) -@falcon_test(pass_drone_status=True) def test_force_disarm_fails_when_already_disarmed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -212,7 +203,6 @@ def test_force_disarm_fails_when_already_disarmed( assert_drone_armed(droneStatus, armed=False) -@falcon_test(pass_drone_status=True) def test_arm_fails_with_serial_exception( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -231,7 +221,6 @@ def test_arm_fails_with_serial_exception( } -@falcon_test(pass_drone_status=True) def test_force_arm_fails_with_serial_exception( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -250,7 +239,6 @@ def test_force_arm_fails_with_serial_exception( } -@falcon_test(pass_drone_status=True) def test_disarm_fails_with_serial_exception( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -271,7 +259,6 @@ def test_disarm_fails_with_serial_exception( } -@falcon_test(pass_drone_status=True) def test_force_disarm_fails_with_serial_exception( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -292,7 +279,6 @@ def test_force_disarm_fails_with_serial_exception( } -@falcon_test(pass_drone_status=True) def test_arm_fails_when_no_drone_connected( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -306,7 +292,6 @@ def test_arm_fails_when_no_drone_connected( } -@falcon_test(pass_drone_status=True) def test_force_disarm_fails_when_no_drone_connected( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -320,7 +305,6 @@ def test_force_disarm_fails_when_no_drone_connected( } -@falcon_test(pass_drone_status=True) def test_arm_disarm_fails_with_missing_arm_parameter( socketio_client: SocketIOTestClient, droneStatus ) -> None: diff --git a/radio/tests/test_autopilot.py b/radio/tests/test_autopilot.py index 76f54cc7d..50536afc4 100644 --- a/radio/tests/test_autopilot.py +++ b/radio/tests/test_autopilot.py @@ -1,11 +1,8 @@ import pytest from flask_socketio.test_client import SocketIOTestClient -from . import falcon_test - @pytest.mark.timeout(30) -@falcon_test() def test_reboot_success(socketio_client: SocketIOTestClient): """ Tests if the autopilot has been rebooted diff --git a/radio/tests/test_connections.py b/radio/tests/test_connections.py index 58588075a..2c38fec96 100644 --- a/radio/tests/test_connections.py +++ b/radio/tests/test_connections.py @@ -1,7 +1,6 @@ import pytest from flask_socketio.test_client import SocketIOTestClient -from . import falcon_test from .helpers import NoDrone @@ -24,7 +23,6 @@ def run_once_after_all_tests(): droneStatus.drone.logger.info(f"Re-connected to drone on {VALID_DRONE_PORT}") -@falcon_test() def test_connect(socketio_client: SocketIOTestClient): """Test connecting to socket""" socketio_client.emit("connect") @@ -32,7 +30,6 @@ def test_connect(socketio_client: SocketIOTestClient): assert len(socketio_result) == 0 # No message sent back -@falcon_test(pass_drone_status=True) def test_isConnectedToDrone_with_drone( socketio_client: SocketIOTestClient, droneStatus ): @@ -45,7 +42,6 @@ def test_isConnectedToDrone_with_drone( assert socketio_result[0]["name"] == "is_connected_to_drone" # Correct name emitted -@falcon_test(pass_drone_status=True) def test_getTargetInfo(socketio_client: SocketIOTestClient, droneStatus): socketio_client.emit("get_target_info") socketio_result = socketio_client.get_received() @@ -58,7 +54,6 @@ def test_getTargetInfo(socketio_client: SocketIOTestClient, droneStatus): } -@falcon_test(pass_drone_status=True) def test_startForwarding_noDroneConnected( socketio_client: SocketIOTestClient, droneStatus ): @@ -73,7 +68,6 @@ def test_startForwarding_noDroneConnected( } -@falcon_test(pass_drone_status=True) def test_startForwarding_missingAddress( socketio_client: SocketIOTestClient, droneStatus ): @@ -87,7 +81,6 @@ def test_startForwarding_missingAddress( } -@falcon_test(pass_drone_status=True) def test_startForwarding_badAddressFormat( socketio_client: SocketIOTestClient, droneStatus ): @@ -117,7 +110,6 @@ def test_startForwarding_badAddressFormat( } -@falcon_test(pass_drone_status=True) def test_startForwarding_success(socketio_client: SocketIOTestClient, droneStatus): socketio_client.emit("start_forwarding", {"address": "udpout:127.0.0.1:14550"}) socketio_result = socketio_client.get_received() @@ -129,7 +121,6 @@ def test_startForwarding_success(socketio_client: SocketIOTestClient, droneStatu assert droneStatus.drone.forwarding_address == "udpout:127.0.0.1:14550" -@falcon_test(pass_drone_status=True) def test_startForwarding_alreadyForwarding( socketio_client: SocketIOTestClient, droneStatus ): @@ -143,7 +134,6 @@ def test_startForwarding_alreadyForwarding( } -@falcon_test(pass_drone_status=True) def test_stopForwarding_noDroneConnected( socketio_client: SocketIOTestClient, droneStatus ): @@ -158,7 +148,6 @@ def test_stopForwarding_noDroneConnected( } -@falcon_test(pass_drone_status=True) def test_stopForwarding_success(socketio_client: SocketIOTestClient, droneStatus): assert droneStatus.drone.forwarding_address == "udpout:127.0.0.1:14550" socketio_client.emit("stop_forwarding") @@ -171,7 +160,6 @@ def test_stopForwarding_success(socketio_client: SocketIOTestClient, droneStatus assert droneStatus.drone.forwarding_address is None -@falcon_test(pass_drone_status=True) def test_stopForwarding_notForwarding(socketio_client: SocketIOTestClient, droneStatus): assert droneStatus.drone.forwarding_address is None socketio_client.emit("stop_forwarding") @@ -184,7 +172,6 @@ def test_stopForwarding_notForwarding(socketio_client: SocketIOTestClient, drone # Has to be the final test otherwise the socket disconnects -@falcon_test(pass_drone_status=True) def test_disconnect(socketio_client: SocketIOTestClient, droneStatus): """Test disconnecting from socket""" socketio_client.emit("disconnect") diff --git a/radio/tests/test_flightMode.py b/radio/tests/test_flightMode.py index b5aca84b0..a81ea01fb 100644 --- a/radio/tests/test_flightMode.py +++ b/radio/tests/test_flightMode.py @@ -2,7 +2,6 @@ from flask_socketio.test_client import SocketIOTestClient from pymavlink.mavutil import mavlink -from . import falcon_test from .helpers import NoDrone, set_params @@ -41,7 +40,6 @@ def run_once_after_all_tests(): drone.master.set_mode(0) -@falcon_test(pass_drone_status=True) def test_getFlightModeConfig_wrongState( socketio_client: SocketIOTestClient, droneStatus ): @@ -55,7 +53,6 @@ def test_getFlightModeConfig_wrongState( } -@falcon_test(pass_drone_status=True) def test_getFlightModeConfig_correctState( socketio_client: SocketIOTestClient, droneStatus ): @@ -70,7 +67,6 @@ def test_getFlightModeConfig_correctState( } -@falcon_test(pass_drone_status=True) def test_setFlightModeConfig_wrongState( socketio_client: SocketIOTestClient, droneStatus ): @@ -84,7 +80,6 @@ def test_setFlightModeConfig_wrongState( } -@falcon_test(pass_drone_status=True) def test_setFlightMode_missingFlightMode( socketio_client: SocketIOTestClient, droneStatus ): @@ -98,7 +93,6 @@ def test_setFlightMode_missingFlightMode( } -@falcon_test(pass_drone_status=True) def test_setFlightMode_missingModeNumber( socketio_client: SocketIOTestClient, droneStatus ): @@ -112,7 +106,6 @@ def test_setFlightMode_missingModeNumber( } -@falcon_test(pass_drone_status=True) def test_setFlightMode_missingData(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.flight_modes" socketio_client.emit("set_flight_mode", {}) @@ -124,7 +117,6 @@ def test_setFlightMode_missingData(socketio_client: SocketIOTestClient, droneSta } -@falcon_test(pass_drone_status=True) def test_setFlightMode_wrongModeNumber( socketio_client: SocketIOTestClient, droneStatus ): @@ -139,7 +131,6 @@ def test_setFlightMode_wrongModeNumber( } -@falcon_test(pass_drone_status=True) def test_setFlightMode_successfullySet( socketio_client: SocketIOTestClient, droneStatus ): @@ -155,7 +146,6 @@ def test_setFlightMode_successfullySet( assert droneStatus.drone.flightModesController.flight_modes == [7, 9, 6, 3, 5, 0] -@falcon_test(pass_drone_status=True) def test_setFlightModeChannel_wrongState( socketio_client: SocketIOTestClient, droneStatus ): @@ -169,7 +159,6 @@ def test_setFlightModeChannel_wrongState( } -@falcon_test(pass_drone_status=True) def test_setFlightModeChannel_missingData( socketio_client: SocketIOTestClient, droneStatus ): @@ -183,7 +172,6 @@ def test_setFlightModeChannel_missingData( } -@falcon_test(pass_drone_status=True) def test_setFlightModeChannel_invalidType( socketio_client: SocketIOTestClient, droneStatus ): @@ -197,7 +185,6 @@ def test_setFlightModeChannel_invalidType( } -@falcon_test(pass_drone_status=True) def test_setFlightModeChannel_successfullySet( socketio_client: SocketIOTestClient, droneStatus ): @@ -219,7 +206,6 @@ def test_setFlightModeChannel_successfullySet( socketio_client.get_received()[0] -@falcon_test(pass_drone_status=True) def test_refreshFlightModeData_wrongState( socketio_client: SocketIOTestClient, droneStatus ): @@ -233,7 +219,6 @@ def test_refreshFlightModeData_wrongState( } -@falcon_test(pass_drone_status=True) def test_refreshFlightModeData_success( socketio_client: SocketIOTestClient, droneStatus ): @@ -244,7 +229,6 @@ def test_refreshFlightModeData_success( assert socketio_result["name"] == "flight_mode_config" -@falcon_test(pass_drone_status=True) def test_setCurrentFlightMode_wrongState( socketio_client: SocketIOTestClient, droneStatus ): @@ -258,7 +242,6 @@ def test_setCurrentFlightMode_wrongState( } -@falcon_test(pass_drone_status=True) def test_setCurrentFlightMode_missingData( socketio_client: SocketIOTestClient, droneStatus ): @@ -270,7 +253,6 @@ def test_setCurrentFlightMode_missingData( assert socketio_result["args"][0] == {"message": "Flight mode must be specified."} -@falcon_test(pass_drone_status=True) def test_setCurrentFlightMode_successfullySet( socketio_client: SocketIOTestClient, droneStatus ): @@ -285,7 +267,6 @@ def test_setCurrentFlightMode_successfullySet( } -@falcon_test(pass_drone_status=True) def test_flightModeEndpoints_noDrone(socketio_client: SocketIOTestClient, droneStatus): with NoDrone(): # Test get flight mode config diff --git a/radio/tests/test_frames.py b/radio/tests/test_frames.py index 25b2d8dc1..3894645a7 100644 --- a/radio/tests/test_frames.py +++ b/radio/tests/test_frames.py @@ -2,7 +2,6 @@ from flask_socketio.test_client import SocketIOTestClient from pymavlink.mavutil import mavlink -from . import falcon_test from .helpers import NoDrone, set_params @@ -20,7 +19,6 @@ def setup_function(): set_params(params) -@falcon_test(pass_drone_status=True) def test_getFrameDetails_wrongState(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "params" socketio_client.emit("get_frame_config") @@ -32,7 +30,6 @@ def test_getFrameDetails_wrongState(socketio_client: SocketIOTestClient, droneSt } -@falcon_test(pass_drone_status=True) def test_getFrameDetails_correctState(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.motor_test" socketio_client.emit("get_frame_config") @@ -45,7 +42,6 @@ def test_getFrameDetails_correctState(socketio_client: SocketIOTestClient, drone } -@falcon_test(pass_drone_status=True) def test_getFrameDetails_noDroneConnection( socketio_client: SocketIOTestClient, droneStatus ): diff --git a/radio/tests/test_ftp.py b/radio/tests/test_ftp.py index eff91a758..a1a8dfeba 100644 --- a/radio/tests/test_ftp.py +++ b/radio/tests/test_ftp.py @@ -1,17 +1,8 @@ -import os - from flask_socketio.test_client import SocketIOTestClient -from . import falcon_test from .helpers import NoDrone -FTP_FILES_PATH = os.path.join( - os.path.dirname(__file__), - "ftp_test_files", -) - -@falcon_test(pass_drone_status=True) def test_listFiles_noPath_success(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.ftp" socketio_client.emit("list_files", {}) @@ -32,7 +23,6 @@ def test_listFiles_noPath_success(socketio_client: SocketIOTestClient, droneStat } -@falcon_test(pass_drone_status=True) def test_listFiles_emptyPath_failure(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.ftp" socketio_client.emit("list_files", {"path": ""}) @@ -45,7 +35,6 @@ def test_listFiles_emptyPath_failure(socketio_client: SocketIOTestClient, droneS } -@falcon_test(pass_drone_status=True) def test_listFiles_homePath_success(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.ftp" socketio_client.emit("list_files", {"path": "/"}) @@ -66,7 +55,6 @@ def test_listFiles_homePath_success(socketio_client: SocketIOTestClient, droneSt } -@falcon_test(pass_drone_status=True) def test_listFiles_subPath_success(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.ftp" socketio_client.emit("list_files", {"path": "/terrain"}) @@ -99,7 +87,6 @@ def test_listFiles_subPath_success(socketio_client: SocketIOTestClient, droneSta } -@falcon_test(pass_drone_status=True) def test_listFiles_unknownPath_failure( socketio_client: SocketIOTestClient, droneStatus ): @@ -114,7 +101,6 @@ def test_listFiles_unknownPath_failure( } -@falcon_test(pass_drone_status=True) def test_listFiles_noDroneConnection_failure( socketio_client: SocketIOTestClient, droneStatus ): @@ -130,7 +116,6 @@ def test_listFiles_noDroneConnection_failure( } -@falcon_test(pass_drone_status=True) def test_readFile_missingPath_failure(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.ftp" socketio_client.emit("read_file", {}) @@ -143,7 +128,6 @@ def test_readFile_missingPath_failure(socketio_client: SocketIOTestClient, drone } -@falcon_test(pass_drone_status=True) def test_readFile_emptyPath_failure(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.ftp" socketio_client.emit("read_file", {"path": ""}) @@ -156,7 +140,6 @@ def test_readFile_emptyPath_failure(socketio_client: SocketIOTestClient, droneSt } -@falcon_test(pass_drone_status=True) def test_readFile_validFile_success(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.ftp" socketio_client.emit("read_file", {"path": "/@ROMFS/locations.txt"}) @@ -173,18 +156,13 @@ def test_readFile_validFile_success(socketio_client: SocketIOTestClient, droneSt # Ensure we found the result message assert socketio_result is not None, "Did not receive read_file_result message" - expected_file_path = os.path.join(FTP_FILES_PATH, "expected_locations.txt") - with open(expected_file_path, "rb") as f: - expected_content = f.read() - assert socketio_result["name"] == "read_file_result" assert socketio_result["args"][0]["success"] is True assert socketio_result["args"][0]["message"] == "File read successfully" - assert socketio_result["args"][0]["data"]["file_data"] == list(expected_content) + assert len(socketio_result["args"][0]["data"]["file_data"]) > 0 assert socketio_result["args"][0]["data"]["file_name"] == "locations.txt" -@falcon_test(pass_drone_status=True) def test_readFile_nonExistentFile_failure( socketio_client: SocketIOTestClient, droneStatus ): @@ -199,7 +177,6 @@ def test_readFile_nonExistentFile_failure( } -@falcon_test(pass_drone_status=True) def test_readFile_directoryPath_failure( socketio_client: SocketIOTestClient, droneStatus ): @@ -214,7 +191,6 @@ def test_readFile_directoryPath_failure( } -@falcon_test(pass_drone_status=True) def test_readFile_noDroneConnection_failure( socketio_client: SocketIOTestClient, droneStatus ): @@ -230,7 +206,6 @@ def test_readFile_noDroneConnection_failure( } -@falcon_test(pass_drone_status=True) def test_listLogFiles_noDroneConnection_failure( socketio_client: SocketIOTestClient, droneStatus ): diff --git a/radio/tests/test_ftpController.py b/radio/tests/test_ftpController.py index 15a0cdfc0..68958ad94 100644 --- a/radio/tests/test_ftpController.py +++ b/radio/tests/test_ftpController.py @@ -1,15 +1,9 @@ from typing import List -from flask_socketio.test_client import SocketIOTestClient from pymavlink import mavftp -from . import falcon_test - -@falcon_test(pass_drone_status=True) -def test_convertDirectoryEntriesToDicts_success( - client: SocketIOTestClient, droneStatus -): +def test_convertDirectoryEntriesToDicts_success(droneStatus): entries: List[mavftp.DirectoryEntry] = [ mavftp.DirectoryEntry(name=".", is_dir=True, size_b=0), mavftp.DirectoryEntry(name="..", is_dir=True, size_b=0), @@ -29,10 +23,7 @@ def test_convertDirectoryEntriesToDicts_success( ] -@falcon_test(pass_drone_status=True) -def test_convertDirectoryEntriesToDicts_subPathSuccess( - client: SocketIOTestClient, droneStatus -): +def test_convertDirectoryEntriesToDicts_subPathSuccess(droneStatus): entries: List[mavftp.DirectoryEntry] = [ mavftp.DirectoryEntry(name=".", is_dir=True, size_b=0), mavftp.DirectoryEntry(name="..", is_dir=True, size_b=0), @@ -57,10 +48,7 @@ def test_convertDirectoryEntriesToDicts_subPathSuccess( ] -@falcon_test(pass_drone_status=True) -def test_convertDirectoryEntriesToDicts_emptyEntriesNoPath_success( - client: SocketIOTestClient, droneStatus -): +def test_convertDirectoryEntriesToDicts_emptyEntriesNoPath_success(droneStatus): entries: List[mavftp.DirectoryEntry] = [] result = droneStatus.drone.ftpController._convertDirectoryEntriesToDicts(entries) @@ -68,10 +56,7 @@ def test_convertDirectoryEntriesToDicts_emptyEntriesNoPath_success( assert result == [] -@falcon_test(pass_drone_status=True) -def test_convertDirectoryEntriesToDicts_emptyEntries_success( - client: SocketIOTestClient, droneStatus -): +def test_convertDirectoryEntriesToDicts_emptyEntries_success(droneStatus): entries: List[mavftp.DirectoryEntry] = [] result = droneStatus.drone.ftpController._convertDirectoryEntriesToDicts( @@ -81,8 +66,7 @@ def test_convertDirectoryEntriesToDicts_emptyEntries_success( assert result == [] -@falcon_test(pass_drone_status=True) -def test_listFiles_blockedByCurrentOp(client: SocketIOTestClient, droneStatus): +def test_listFiles_blockedByCurrentOp(droneStatus): """Test that listFiles is blocked when another operation is in progress""" droneStatus.drone.ftpController.current_op = "read_file" @@ -96,8 +80,7 @@ def test_listFiles_blockedByCurrentOp(client: SocketIOTestClient, droneStatus): droneStatus.drone.ftpController.current_op = None -@falcon_test(pass_drone_status=True) -def test_readFile_blockedByCurrentOp(client: SocketIOTestClient, droneStatus): +def test_readFile_blockedByCurrentOp(droneStatus): """Test that readFile is blocked when another operation is in progress""" droneStatus.drone.ftpController.current_op = "list_files" @@ -111,8 +94,7 @@ def test_readFile_blockedByCurrentOp(client: SocketIOTestClient, droneStatus): droneStatus.drone.ftpController.current_op = None -@falcon_test(pass_drone_status=True) -def test_currentOp_clearedOnListFilesError(client: SocketIOTestClient, droneStatus): +def test_currentOp_clearedOnListFilesError(droneStatus): """Test that current_op is cleared even when listFiles fails""" assert droneStatus.drone.ftpController.current_op is None @@ -123,8 +105,7 @@ def test_currentOp_clearedOnListFilesError(client: SocketIOTestClient, droneStat assert droneStatus.drone.ftpController.current_op is None -@falcon_test(pass_drone_status=True) -def test_currentOp_clearedOnReadFileError(client: SocketIOTestClient, droneStatus): +def test_currentOp_clearedOnReadFileError(droneStatus): """Test that current_op is cleared even when readFile fails""" assert droneStatus.drone.ftpController.current_op is None @@ -136,8 +117,7 @@ def test_currentOp_clearedOnReadFileError(client: SocketIOTestClient, droneStatu assert droneStatus.drone.ftpController.current_op is None -@falcon_test(pass_drone_status=True) -def test_multipleOperations_sequential(client: SocketIOTestClient, droneStatus): +def test_multipleOperations_sequential(droneStatus): """Test that operations can run sequentially after previous one completes""" # Verify current_op is None initially assert droneStatus.drone.ftpController.current_op is None diff --git a/radio/tests/test_gripper.py b/radio/tests/test_gripper.py index 9641a3c11..005863b8b 100644 --- a/radio/tests/test_gripper.py +++ b/radio/tests/test_gripper.py @@ -5,7 +5,6 @@ from pymavlink import mavutil from pymavlink.mavutil import mavlink -from . import falcon_test from .helpers import FakeTCP, NoDrone, send_and_receive, set_params @@ -42,7 +41,6 @@ def run_once_after_all_tests(): time.sleep(0.5) -@falcon_test(pass_drone_status=True) def test_gripperEnabled(socketio_client: SocketIOTestClient, droneStatus): # Failure with no drone connected droneStatus.state = "config.gripper" @@ -55,7 +53,6 @@ def test_gripperEnabled(socketio_client: SocketIOTestClient, droneStatus): assert send_and_receive("get_gripper_enabled") is True -@falcon_test(pass_drone_status=True) def test_setGripper(socketio_client: SocketIOTestClient, droneStatus): # Failure on wrong drone state droneStatus.state = "params" @@ -95,7 +92,6 @@ def test_setGripper(socketio_client: SocketIOTestClient, droneStatus): } -@falcon_test(pass_drone_status=True) def test_gripperDisabled(socketio_client: SocketIOTestClient, droneStatus) -> None: droneStatus.drone.paramsController.setParam( "GRIP_ENABLE", 0, mavutil.mavlink.MAV_PARAM_TYPE_REAL32 @@ -110,7 +106,6 @@ def test_gripperDisabled(socketio_client: SocketIOTestClient, droneStatus) -> No } -@falcon_test() def test_setGripperEnabled(socketio_client: SocketIOTestClient) -> None: assert send_and_receive("set_gripper_enabled") == { "success": True, @@ -118,7 +113,6 @@ def test_setGripperEnabled(socketio_client: SocketIOTestClient) -> None: } -@falcon_test() def test_setGripperDisabled(socketio_client: SocketIOTestClient) -> None: assert send_and_receive("set_gripper_disabled") == { "success": True, diff --git a/radio/tests/test_mission.py b/radio/tests/test_mission.py index 430a7854c..36242b845 100644 --- a/radio/tests/test_mission.py +++ b/radio/tests/test_mission.py @@ -4,7 +4,6 @@ import pytest from flask_socketio.test_client import SocketIOTestClient -from . import falcon_test from .helpers import NoDrone from .mission_test_files.upload_mission_helper import uploadMission @@ -71,7 +70,6 @@ def delete_export_files(): os.remove(file_path) -@falcon_test(pass_drone_status=True) def test_getCurrentMissionAll_wrongState( socketio_client: SocketIOTestClient, droneStatus ): @@ -86,7 +84,6 @@ def test_getCurrentMissionAll_wrongState( @pytest.mark.usefixtures("upload_default_mission") -@falcon_test(pass_drone_status=True) def test_getCurrentMissionAll_correctState( socketio_client: SocketIOTestClient, droneStatus ): @@ -107,7 +104,6 @@ def test_getCurrentMissionAll_correctState( assert socketio_result["args"][0] == result_data -@falcon_test(pass_drone_status=True) def test_getCurrentMissionAll_noDroneConnection( socketio_client: SocketIOTestClient, droneStatus ): @@ -123,7 +119,6 @@ def test_getCurrentMissionAll_noDroneConnection( } -@falcon_test(pass_drone_status=True) def test_getCurrentMission_wrongState(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "params" socketio_client.emit("get_current_mission", {"type": "mission"}) @@ -136,7 +131,6 @@ def test_getCurrentMission_wrongState(socketio_client: SocketIOTestClient, drone @pytest.mark.usefixtures("upload_default_mission") -@falcon_test(pass_drone_status=True) def test_getCurrentMission_correctMission( socketio_client: SocketIOTestClient, droneStatus ): @@ -158,7 +152,6 @@ def test_getCurrentMission_correctMission( @pytest.mark.usefixtures("upload_default_mission") -@falcon_test(pass_drone_status=True) def test_getCurrentMission_correctFence( socketio_client: SocketIOTestClient, droneStatus ): @@ -180,7 +173,6 @@ def test_getCurrentMission_correctFence( @pytest.mark.usefixtures("upload_default_mission") -@falcon_test(pass_drone_status=True) def test_getCurrentMission_correctRally( socketio_client: SocketIOTestClient, droneStatus ): @@ -201,7 +193,6 @@ def test_getCurrentMission_correctRally( assert socketio_result["args"][0] == result_data -@falcon_test(pass_drone_status=True) def test_writeCurrentMission_wrongState( socketio_client: SocketIOTestClient, droneStatus ): @@ -215,7 +206,6 @@ def test_writeCurrentMission_wrongState( } -@falcon_test(pass_drone_status=True) def test_writeCurrentMission_uploadMissionSuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -249,7 +239,6 @@ def test_writeCurrentMission_uploadMissionSuccess( assert written_items == returned_items -@falcon_test(pass_drone_status=True) def test_writeCurrentMission_uploadFenceSuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -282,7 +271,6 @@ def test_writeCurrentMission_uploadFenceSuccess( assert written_items == returned_items -@falcon_test(pass_drone_status=True) def test_writeCurrentMission_uploadRallySuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -315,7 +303,6 @@ def test_writeCurrentMission_uploadRallySuccess( assert written_items == returned_items -@falcon_test(pass_drone_status=True) def test_writeCurrentMission_incorrectMissionType( socketio_client: SocketIOTestClient, droneStatus ): @@ -335,7 +322,6 @@ def test_writeCurrentMission_incorrectMissionType( } -@falcon_test(pass_drone_status=True) def test_writeCurrentMission_noWaypoints( socketio_client: SocketIOTestClient, droneStatus ): @@ -355,7 +341,6 @@ def test_writeCurrentMission_noWaypoints( } -@falcon_test(pass_drone_status=True) def test_importMissionFromFile_missionImportSuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -379,7 +364,6 @@ def test_importMissionFromFile_missionImportSuccess( assert result["args"][0] == result_data -@falcon_test(pass_drone_status=True) def test_importMissionFromFile_fenceImportSuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -403,7 +387,6 @@ def test_importMissionFromFile_fenceImportSuccess( assert result["args"][0] == result_data -@falcon_test(pass_drone_status=True) def test_importMissionFromFile_rallyImportSuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -427,7 +410,6 @@ def test_importMissionFromFile_rallyImportSuccess( assert result["args"][0] == result_data -@falcon_test(pass_drone_status=True) def test_importMissionFromFile_fileNotFound( socketio_client: SocketIOTestClient, droneStatus ): @@ -446,7 +428,6 @@ def test_importMissionFromFile_fileNotFound( } -@falcon_test(pass_drone_status=True) def test_importMissionFromFile_incorrectMissionType_rallyWithMission( socketio_client: SocketIOTestClient, droneStatus ): @@ -465,7 +446,6 @@ def test_importMissionFromFile_incorrectMissionType_rallyWithMission( } -@falcon_test(pass_drone_status=True) def test_importMissionFromFile_incorrectMissionType_fenceWithMission( socketio_client: SocketIOTestClient, droneStatus ): @@ -484,7 +464,6 @@ def test_importMissionFromFile_incorrectMissionType_fenceWithMission( } -@falcon_test(pass_drone_status=True) def test_importMissionFromFile_incorrectMissionType_rallyWithFence( socketio_client: SocketIOTestClient, droneStatus ): @@ -503,7 +482,6 @@ def test_importMissionFromFile_incorrectMissionType_rallyWithFence( } -@falcon_test(pass_drone_status=True) def test_importMissionFromFile_incorrectMissionType_fenceWithRally( socketio_client: SocketIOTestClient, droneStatus ): @@ -524,7 +502,6 @@ def test_importMissionFromFile_incorrectMissionType_fenceWithRally( @pytest.mark.usefixtures("delete_export_files") @pytest.mark.usefixtures("upload_default_mission") -@falcon_test(pass_drone_status=True) def test_exportMissionToFile_missionExportSuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -560,7 +537,6 @@ def test_exportMissionToFile_missionExportSuccess( @pytest.mark.usefixtures("delete_export_files") @pytest.mark.usefixtures("upload_default_mission") -@falcon_test(pass_drone_status=True) def test_exportMissionToFile_fenceExportSuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -596,7 +572,6 @@ def test_exportMissionToFile_fenceExportSuccess( @pytest.mark.usefixtures("delete_export_files") @pytest.mark.usefixtures("upload_default_mission") -@falcon_test(pass_drone_status=True) def test_exportMissionToFile_rallyExportSuccess( socketio_client: SocketIOTestClient, droneStatus ): @@ -630,7 +605,6 @@ def test_exportMissionToFile_rallyExportSuccess( assert f.read() == f_expected.read() -@falcon_test(pass_drone_status=True) def test_exportMissionToFile_noWaypoints( socketio_client: SocketIOTestClient, droneStatus ): diff --git a/radio/tests/test_motorController.py b/radio/tests/test_motorController.py index baac9f632..7ceef5f42 100644 --- a/radio/tests/test_motorController.py +++ b/radio/tests/test_motorController.py @@ -1,6 +1,3 @@ -from flask_socketio.test_client import SocketIOTestClient - -from . import falcon_test from .helpers import FakeTCP, WaitForMessageReturnsNone @@ -25,8 +22,7 @@ def run_motor_test(droneStatus, test_func, params, expected_success, expected_me assert data.get("message") == expected_message -@falcon_test(pass_drone_status=True) -def test_checkMotorTestValues(client: SocketIOTestClient, droneStatus): +def test_checkMotorTestValues(droneStatus): # Invalid throttle tests - Invalid 1, Invalid Boundary 1, Invalid 2, Invalid Boundary 2, Invalid 3 validate_motor_test_values( droneStatus, @@ -81,8 +77,7 @@ def test_checkMotorTestValues(client: SocketIOTestClient, droneStatus): ) -@falcon_test(pass_drone_status=True) -def test_testOneMotor(client: SocketIOTestClient, droneStatus): +def test_testOneMotor(droneStatus): test_func = droneStatus.drone.motorTestController.testOneMotor # Invalid throttle tests - Invalid 1, Invalid Boundary Upper, Invalid 2, Invalid Boundary Lower, Invalid 3 @@ -198,8 +193,7 @@ def test_testOneMotor(client: SocketIOTestClient, droneStatus): ) -@falcon_test(pass_drone_status=True) -def test_testMotorSequence(client: SocketIOTestClient, droneStatus): +def test_testMotorSequence(droneStatus): test_func = droneStatus.drone.motorTestController.testMotorSequence # Invalid throttle tests - Invalid 1, Invalid Boundary Upper, Invalid 2, Invalid Boundary Lower, Invalid 3 @@ -315,8 +309,7 @@ def test_testMotorSequence(client: SocketIOTestClient, droneStatus): ) -@falcon_test(pass_drone_status=True) -def test_testAllMotors(client: SocketIOTestClient, droneStatus): +def test_testAllMotors(droneStatus): test_func = droneStatus.drone.motorTestController.testAllMotors # Invalid throttle tests - Invalid 1, Invalid Boundary Upper, Invalid 2, Invalid Boundary Lower, Invalid 3 diff --git a/radio/tests/test_motors.py b/radio/tests/test_motors.py index b232a006f..2ff043e79 100644 --- a/radio/tests/test_motors.py +++ b/radio/tests/test_motors.py @@ -1,7 +1,6 @@ from typing import Optional from flask_socketio.test_client import SocketIOTestClient -from . import falcon_test from .helpers import FakeTCP, NoDrone @@ -75,7 +74,6 @@ def send_testMotors( return client.get_received()[0] -@falcon_test(pass_drone_status=True) def test_testOneMotor(socketio_client: SocketIOTestClient, droneStatus) -> None: # Test correct motor being tested result = send_testOneMotor(socketio_client, 1, 50, 1) @@ -127,7 +125,6 @@ def test_testOneMotor(socketio_client: SocketIOTestClient, droneStatus) -> None: } -@falcon_test(pass_drone_status=True) def test_testMotorSequence(socketio_client: SocketIOTestClient, droneStatus) -> None: # Test with varying number of motors and valid throttle / duration result = send_testMotors(socketio_client, 50, 1, num_motors=1) @@ -173,7 +170,6 @@ def test_testMotorSequence(socketio_client: SocketIOTestClient, droneStatus) -> } -@falcon_test() def test_testAllMotors(socketio_client: SocketIOTestClient) -> None: # Test with varying number of motors and valid throttle / duration result = send_testMotors(socketio_client, 50, 1, num_motors=1, test_all=True) diff --git a/radio/tests/test_params.py b/radio/tests/test_params.py index 6d238691c..4e5b832f7 100644 --- a/radio/tests/test_params.py +++ b/radio/tests/test_params.py @@ -6,7 +6,6 @@ from flask_socketio.test_client import SocketIOTestClient from pymavlink.mavutil import mavlink -from . import falcon_test from .helpers import ParamRefreshTimeout, WaitForMessageReturnsNone, set_params PARAM_FILES_PATH = os.path.join( @@ -120,7 +119,6 @@ def send_and_receive_params( time.sleep(0.05) # Sleep briefly to avoid busy waiting -@falcon_test(pass_drone_status=True) def test_setMultipleParams_wrongState( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -135,7 +133,6 @@ def test_setMultipleParams_wrongState( } -@falcon_test(pass_drone_status=True) def test_setMultipleParams_missingData( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -151,7 +148,6 @@ def test_setMultipleParams_missingData( } -@falcon_test(pass_drone_status=True) def test_setMultipleParams_invalidData( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -394,7 +390,6 @@ def test_setMultipleParams_invalidData( } -@falcon_test(pass_drone_status=True) def test_setMultipleParams_WaitForMessageReturnsNone( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -418,7 +413,6 @@ def test_setMultipleParams_WaitForMessageReturnsNone( } -@falcon_test(pass_drone_status=True) def test_setMultipleParams_successfullySet_paramsState( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -442,7 +436,6 @@ def test_setMultipleParams_successfullySet_paramsState( } -@falcon_test(pass_drone_status=True) def test_refreshParams_wrongState( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -456,7 +449,6 @@ def test_refreshParams_wrongState( @pytest.mark.skip(reason="Need to find a better way to simulate a timeout") -@falcon_test(pass_drone_status=True) def test_refreshParams_timeout( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -478,7 +470,6 @@ def test_refreshParams_timeout( ) -@falcon_test(pass_drone_status=True) def test_refreshParams_successfullyRefreshed( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -500,7 +491,6 @@ def test_refreshParams_successfullyRefreshed( assert socketio_result["args"][0] == droneStatus.drone.paramsController.params -@falcon_test(pass_drone_status=True) def test_exportParamsToFile_wrongState( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -517,7 +507,6 @@ def test_exportParamsToFile_wrongState( } -@falcon_test(pass_drone_status=True) def test_exportParamsToFile_noFilePath( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -532,7 +521,6 @@ def test_exportParamsToFile_noFilePath( } -@falcon_test(pass_drone_status=True) def test_exportParamsToFile_incorrectFilePath( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -557,7 +545,6 @@ def test_exportParamsToFile_incorrectFilePath( @pytest.mark.usefixtures("delete_export_files") @pytest.mark.usefixtures("inject_params") -@falcon_test(pass_drone_status=True) def test_exportParamsToFile_success( socketio_client: SocketIOTestClient, droneStatus ) -> None: diff --git a/radio/tests/test_rc.py b/radio/tests/test_rc.py index 698fe5cf3..031fa66e8 100644 --- a/radio/tests/test_rc.py +++ b/radio/tests/test_rc.py @@ -2,7 +2,6 @@ from flask_socketio.test_client import SocketIOTestClient from pymavlink.mavutil import mavlink -from . import falcon_test from .helpers import NoDrone, set_params @@ -52,7 +51,6 @@ def setup_function(): droneStatus.drone.rcController.fetchParams() # Refresh RC data -@falcon_test(pass_drone_status=True) def test_getRcConfig_wrongState(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "params" socketio_client.emit("get_rc_config") @@ -64,7 +62,6 @@ def test_getRcConfig_wrongState(socketio_client: SocketIOTestClient, droneStatus } -@falcon_test(pass_drone_status=True) def test_getRcConfig_correctState(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.rc" socketio_client.emit("get_rc_config") @@ -96,7 +93,6 @@ def test_getRcConfig_correctState(socketio_client: SocketIOTestClient, droneStat } -@falcon_test(pass_drone_status=True) def test_getRcConfig_noDroneConnection( socketio_client: SocketIOTestClient, droneStatus ): @@ -112,7 +108,6 @@ def test_getRcConfig_noDroneConnection( } -@falcon_test(pass_drone_status=True) def test_setRcConfigParam_wrongState(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "params" socketio_client.emit("set_rc_config_param", {"param_id": "RC1_OPTION", "value": 10}) @@ -124,7 +119,6 @@ def test_setRcConfigParam_wrongState(socketio_client: SocketIOTestClient, droneS } -@falcon_test(pass_drone_status=True) def test_setRcConfigParam_noDroneConnection( socketio_client: SocketIOTestClient, droneStatus ): @@ -142,7 +136,6 @@ def test_setRcConfigParam_noDroneConnection( } -@falcon_test(pass_drone_status=True) def test_setRcConfigParam_missingData(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.rc" @@ -165,7 +158,6 @@ def test_setRcConfigParam_missingData(socketio_client: SocketIOTestClient, drone } -@falcon_test(pass_drone_status=True) def test_setRcConfigParam_success(socketio_client: SocketIOTestClient, droneStatus): droneStatus.state = "config.rc" @@ -181,7 +173,6 @@ def test_setRcConfigParam_success(socketio_client: SocketIOTestClient, droneStat } -@falcon_test(pass_drone_status=True) def test_batchSetRcConfigParams_wrongState( socketio_client: SocketIOTestClient, droneStatus ): @@ -203,7 +194,6 @@ def test_batchSetRcConfigParams_wrongState( } -@falcon_test(pass_drone_status=True) def test_batchSetRcConfigParams_noDroneConnection( socketio_client: SocketIOTestClient, droneStatus ): @@ -227,7 +217,6 @@ def test_batchSetRcConfigParams_noDroneConnection( } -@falcon_test(pass_drone_status=True) def test_batchSetRcConfigParams_emptyParams( socketio_client: SocketIOTestClient, droneStatus ): @@ -243,7 +232,6 @@ def test_batchSetRcConfigParams_emptyParams( } -@falcon_test(pass_drone_status=True) def test_batchSetRcConfigParams_missingData( socketio_client: SocketIOTestClient, droneStatus ): @@ -263,7 +251,6 @@ def test_batchSetRcConfigParams_missingData( ) -@falcon_test(pass_drone_status=True) def test_batchSetRcConfigParams_success( socketio_client: SocketIOTestClient, droneStatus ): @@ -291,7 +278,6 @@ def test_batchSetRcConfigParams_success( ] -@falcon_test(pass_drone_status=True) def test_batchSetRcConfigParams_partialFailure( socketio_client: SocketIOTestClient, droneStatus ): diff --git a/radio/tests/test_states.py b/radio/tests/test_states.py index 7c9652457..26ef3c98f 100644 --- a/radio/tests/test_states.py +++ b/radio/tests/test_states.py @@ -1,10 +1,8 @@ from flask_socketio import SocketIOTestClient -from . import falcon_test from .helpers import NoDrone, send_and_receive -@falcon_test(pass_drone_status=True) def test_setState_no_drone_connection( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -15,7 +13,6 @@ def test_setState_no_drone_connection( assert droneStatus.state == "dashboard" -@falcon_test(pass_drone_status=True) def test_setState_missing_state_parameter( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -25,7 +22,6 @@ def test_setState_missing_state_parameter( } -@falcon_test(pass_drone_status=True) def test_setState_dashboard_state( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -35,7 +31,6 @@ def test_setState_dashboard_state( assert len(droneStatus.drone.message_listeners) == 16 -@falcon_test(pass_drone_status=True) def test_setState_graphs_state( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -47,7 +42,6 @@ def test_setState_graphs_state( assert len(droneStatus.drone.message_listeners) == 6 -@falcon_test(pass_drone_status=True) def test_setState_config_flight_modes_state( socketio_client: SocketIOTestClient, droneStatus ) -> None: @@ -59,7 +53,6 @@ def test_setState_config_flight_modes_state( assert len(droneStatus.drone.message_listeners) == 5 -@falcon_test(pass_drone_status=True) def test_setState_config_rc_state( socketio_client: SocketIOTestClient, droneStatus ) -> None: diff --git a/sitl_setup/run.sh b/sitl_setup/run.sh index 0d0ea2305..720aa5a52 100644 --- a/sitl_setup/run.sh +++ b/sitl_setup/run.sh @@ -1,9 +1,9 @@ #!/bin/bash # Make sure line endings are LF for this file!!! -LAT=52.780569089726455 -LON=-0.707923685716297 -ALT=0 +LAT=52.7805691 +LON=-0.7079235 +ALT=0.1 DIR=270 VEHICLE="ArduCopter"