image: …/testbed-qemu@sha256:… script: - testbed-qemu run --image "$TESTBED_QEMU_IMAGE" --artifacts artifacts --accel kvm --debug-information always -- testbed-qemu cram $CRAM_TEST_SUITE
docker compose run testbed-qemu \ testbed-qemu run \ --image /firmware/prplos.img \ --artifacts /artifacts \ --accel auto \ -- testbed-qemu cram $(TESTS)
Both resolve the test list with resolve-component-tests.py from the prplOS tree.
For the private LAN and WAN, and for KVM when the host has it.
The firmware image is mounted read-only. Batch runs start factory-fresh.
git clone https://gitlab.com/prpl-foundation/\
prplos/ci/containers/testbed-qemu.git
cd testbed-qemu
make fetch test-qemu-shelltestbed-qemu wait && testbed-qemu sshmake test-qemu TESTS=connectivityNeeds Docker Compose, /dev/kvm, git and make.
README
testbed-qemu wait # until SSH answers
testbed-qemu ssh # root@192.168.1.1
testbed-qemu console # ttyS0, Ctrl-] exits
The prompt comes back at once. The DUT boots in the background.
# generic/hello-world.t
Hello world smoke test:
$ echo hello world
hello world
$ alias R="${CRAM_REMOTE_COMMAND:-}"
$ R "uname -m"
x86_64
$ testbed-qemu cram hello-world passed
$ sed -i 's/^ hello world$/ hello wrld/' \ …/generic/hello-world.t $ testbed-qemu cram hello-world
$ echo hello world - hello wrld + hello world # Ran 1 tests, 0 skipped, 1 failed.
$ make test-qemu \ TEST_COMPONENT=smoke
cram: running 6 tests generic/busybox.t: passed generic/network.t: passed … qemu-x86-64/reboot.t: passed # Ran 6 tests, 0 skipped, 0 failed.
One test as a batch run: make test-qemu TESTS=hello-world
Unions work: TEST_COMPONENT=smoke,prplmesh. A new test under generic/ lands in prplos and full.
make test-qemu TESTS=<test>testbed-qemu cram <test>AGENTS.md + skills/testbed-qemu/SKILL.md: claude, codex or agy runs the tests for you.> run obuspa.t in qemu and report the result
On demand in the shell: testbed-qemu debug-information