Testing and Validation
Docker Test Entry Point
The host is only used as a Docker client. The compiler, test runners, Python
packages, Node.js, Go toolchain, and ARM cross compiler are supplied by the
pinned docker/test/Dockerfile image.
For local iterations, run the quick feedback profile:
make check
It runs shared contracts, C++ host tests (the aiden_tests target), Go format/vet
and focused contract tests, Web tests, and a small benchmark sample plus SkillOpt.
It intentionally does not run every Go test, all 879 benchmark cases, the
long-running shell/release tests, or the 30-second CTest watchdog check.
It is not a substitute for the full test gate. Before merging, run:
make check-full
CI runs make check-full on every PR, including the suites omitted by the quick
profile. make test is also an alias for the full check. To run one suite while
iterating, use bash scripts/run_tests_in_docker.sh --suite go-unit (or another
name from bash scripts/run_tests_in_docker.sh --list). All commands still run
inside the same Docker test image.
Docker-backed package tests that need the host Docker socket are explicit and separate from the normal manifest because the socket grants access to the Docker daemon:
make check-docker
The Linux CI runner additionally uses --docker-socket --host-network to run
docker-sandbox-smoke inside the test image. These options are explicit and
not part of local make check or make check-full.
The suite list and quick commands live in tests/test-manifest.yaml.
A selected required suite with a missing dependency or an unexpected skip fails
the runner. The JSON result at output/test-summary.json records the profile
and the suites actually executed.
The production cross-build smoke test requires the SDK and pinned ARM vendor
inputs (pico-sdk and the RKNN archive). The Docker smoke runner downloads and
checksums the pinned OpenCV-Mobile source when it is not already cached:
make check-production
Tests cover UDS messaging, Frame Service protocol, Audio Service protocol, Ring Buffer, Wi-Fi / Agent TOML configuration parsing, image processing, and other modules.
Frame Service Validation
After the service is running:
frame_service_cli --socket /run/frame_service/frame_service.sock health
frame_service_cli --socket /run/frame_service/frame_service.sock screenshot --out /tmp/screenshot.bmp
frame_service_cli --socket /run/frame_service/frame_service.sock latest-frame --out /tmp/frame.raw
frame_service_cli --socket /run/frame_service/frame_service.sock list-frames
For temporary service execution on development machines, the default socket is /tmp/frame_service.sock:
/usr/lib/aiden/frame_service --socket /tmp/frame_service.sock
frame_service_cli --socket /tmp/frame_service.sock health
Audio Service Validation
audio_service_cli --socket /run/audio_service/audio_service.sock health
audio_service_cli --socket /run/audio_service/audio_service.sock get-volume
audio_service_cli --socket /run/audio_service/audio_service.sock set-volume --volume 80
Record to PCM:
audio_service_cli --socket /run/audio_service/audio_service.sock record-stream --seconds 3 > /tmp/record.pcm
Play PCM:
cat /tmp/record.pcm | audio_service_cli --socket /run/audio_service/audio_service.sock play-stream --rate 16000 --ch 1 --bits 16
USB HID Validation
sudo example_usb_hid setup composite
sudo example_usb_hid keyboard tap ENTER
sudo example_usb_hid keyboard text "hello from pico"
sudo example_usb_hid touch click 16000 16000
Agent Validation
Check the service on the device:
systemctl status aiden-agent.service --no-pager
The Agent Web UI is available in every input mode. Open:
http://<device-ip>:8080
Tool API:
curl http://<device-ip>:8080/api/tools
curl -X POST http://<device-ip>:8080/api/tools/shell \
-H 'Content-Type: application/json' \
-d '{"input":{"command":"pwd"}}'
Audio Model Roundtrip Script
scripts/test_audio_roundtrip.sh is used to generate audio via OpenRouter audio model, then send the audio back as input for recognition:
export OPENROUTER_KEY=sk-or-...
./scripts/test_audio_roundtrip.sh
Optionally set proxy:
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890