6 releases
0.2.4 | Aug 13, 2024 |
---|---|
0.2.3 | Jun 10, 2024 |
0.2.2 | Jun 10, 2023 |
0.2.1 | Mar 8, 2023 |
0.1.0 | Jun 11, 2022 |
#87 in Embedded development
98KB
2K
SLoC
avr-tester
Functional testing framework for AVR firmware, powered by simavr.
tl;dr get your microcontroller's firmware black-box-tested in seconds!
Getting Started
Create a crate dedicated to your project's tests:
$ cargo new yourproject-tests --lib
... add avr-tester
as its dependency:
# yourproject-tests/Cargo.toml
[dependencies]
avr-tester = "0.2"
... and, just like that, start writing tests:
// yourproject-tests/src/lib.rs
use avr_tester::*;
fn avr() -> AvrTester {
AvrTester::atmega328p()
.with_clock_of_16_mhz()
.load("../../yourproject/target/atmega328p/release/yourproject.elf")
}
// Assuming `yourproject` 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 yourproject-tests
:-)
Note that because AvrTester simulates an actual AVR, you don't have to modify
yourproject
at all - it's free to use timers, GPIOs etc. and everything
should just work ™.
In fact, yourproject
doesn't even have to be written in Rust - you can create
Rust-based tests for a firmware written in C, Zig or anything else!
Examples
Requirements & supported platforms
See: simavr-ffi.
Roadmap
Following features seem to be supported by simavr, but haven't been yet exposed in AvrTester:
- interrupts,
- EEPROM,
- I2C,
- watchdog,
- TWI,
- https://lib.rs/crates/simavr-section,
- USB.
(your firmware can use those features, but you just won't be able to test them.)
Caveats
- Triggering AVR's sleep mode will cause the Rust code to panic, because the only way to wake an AVR is to trigger an interrupt and those are not yet supported.
Contributing
Pull requests are very much welcome!
Tests
AvrTester's integration tests lay in avr-tester/tests
- you can run them with:
$ cd avr-tester
$ cargo test
Note that for those tests to work, you might need some additional dependencies:
... on Nix (Linux / MacOS)
$ nix-shell
# and then `cargo test`
... on Ubuntu
$ sudo apt install avr-libc gcc-avr
# and then `cargo test`
License
Copyright (c) 2022 Patryk Wychowaniec pwychowaniec@pm.me.
Licensed under the MIT license.
Dependencies
~3.5–6MB
~64K SLoC