ados.sdk.testing in Python, ados_sdk::testing in Rust, and @altnautica/plugin-sdk/harness in TypeScript.
1. Agent-side unit tests with a mock backend
The cheapest pass. Driver plugins ship a mock backend that the driver constructor accepts in place of the real device: the FLIR Lepton plugin shipsMockUvcBackend, and the MAVLink Gimbal v2 plugin ships a mock router.
For a Python agent half, ados.sdk.testing adds PluginTestHarness, FakeVisionEngine and load_fixture. PluginTestHarness wires an in-process plugin context to a fake IPC client, so lifecycle hooks run under pytest without the plugin host, sockets or subprocesses. Grant capabilities explicitly and assert against captured events.
ados_sdk::testing::FakeVisionEngine emits synthetic frames through the same callback a plugin registers with ctx.vision.subscribe_frames, and captures the detections the plugin publishes:
FakeVisionEngine tests in crates/ados-sdk/src/testing/mod.rs for a worked example.
2. The plugin harness, GCS side
@altnautica/plugin-sdk/harness mounts your plugin against an in-memory transport, captures every RPC, and lets you inject telemetry, events, config changes and theme updates without running Mission Control.
3. SITL (software in the loop)
ArduPilot SITL covers the flight-controller side: arming, modes, missions, parameters, mount commands and ROI. The agent binds TCP 5760 itself, so SITL on the same host at 5760 collides. Run SITL (sim_vehicle.py) on another machine, or expose it on another port, then point the agent at it:
4. Hardware in the loop on a bench rig
The full pass: a real board with the agent installed, the real device on USB or serial, and your plugin packed and installed withados plugin install <archive>. Bench testing closes the loop on accuracy, timing jitter, hotplug behaviour and vendor-binary integration. Run it before you tag a release.
A good bench session captures:
- The plugin’s log while you exercise the device:
ados plugin logs <id> --follow. The file lives at/var/log/ados/plugins/<id-with-dashes>-<hash>.log; find the unit withsystemctl list-units 'ados-plugin-*'. - A telemetry log over the test window.
- A photo or short video of the rig and the device under test.
What the reference plugins ship
Next steps
Linting
Analyze the packed archive.
Python SDK
The
ados.sdk.testing reference.