Crates.io | avr-tester |
lib.rs | avr-tester |
version | 0.6.1 |
created_at | 2022-06-11 17:55:57.178951+00 |
updated_at | 2025-09-20 11:03:29.219573+00 |
description | Framework for testing AVR binaries |
homepage | |
repository | https://codeberg.org/pwy/avr-tester |
max_upload_size | |
id | 604163 |
size | 109,084 |
Framework for testing AVR binaries, powered by simavr.
tl;dr get your microcontroller's firmware black-box-tested in seconds!
Create a crate dedicated to your firmware's tests:
$ cargo new firmware-tests --lib
... add avr-tester
as its dependency:
# firmware-tests/Cargo.toml
[dependencies]
avr-tester = "0.6"
... and start writing tests:
// firmware-tests/src/lib.rs
use avr_tester::*;
fn avr() -> AvrTester {
AvrTester::atmega328p()
.with_clock_of_16_mhz()
.load("../../firmware/target/avr-none/release/firmware.elf")
}
// Assuming `firmware` implements a ROT-13 encoder:
#[test]
fn short_text() {
let mut avr = avr();
// Let's give our firmware a moment to initialize:
avr.run_for_ms(1);
// Now, let's send the string:
avr.uart0().write("Hello, World!");
// ... give the AVR a moment to retrieve it & send back, encoded:
avr.run_for_ms(1);
// ... and, finally, let's assert the outcome:
assert_eq!("Uryyb, Jbeyq!", avr.uart0().read::<String>());
}
#[test]
fn long_text() {
let mut avr = avr();
avr.run_for_ms(1);
avr.uart0().write("Lorem ipsum dolor sit amet, consectetur adipiscing elit");
avr.run_for_ms(10);
assert_eq!(
"Yberz vcfhz qbybe fvg nzrg, pbafrpgrghe nqvcvfpvat ryvg",
avr.uart0().read::<String>(),
);
}
... having the tests ready, just run cargo test
inside firmware-tests
.
Since AvrTester emulates an actual AVR, you don't have to modify your firmware at all - it can use timers, GPIOs etc. and everything should just work ™.
In fact, your project doesn't even have to be written in Rust - you can create Rust tests for a firmware written in C, Zig and anything else!
See more: ./avr-tester/tests/examples.
See: simavr-ffi.
Following features are supported by simavr, but haven't been yet exposed in AvrTester:
Your firmware can use those features, you just won't be able to test them.
Pull requests are very much welcome!
Use just test
to test AvrTester (so meta!) -- note that you might need some
additional dependencies:
$ nix develop
# and then `just test`
$ sudo apt install avr-libc build-essential clang elfutils gcc-avr libelf-dev pkg-config
# and then `just test`
See also: .devcontainer.
Copyright (c) 2022 Patryk Wychowaniec pwychowaniec@pm.me.
Licensed under the MIT license.