Testing

Ariel OS supports in-hardware testing using the embedded-test crate. embedded-test, used in conjunction with probe-rs, serves as a replacement for the regular cargo test based test harness, as the latter cannot be used on no_std (embedded) devices. Please refer to the embedded-test documentation for more info.

The build system of Ariel OS integrates the embedded-test-based testing so that once set up, tests can be run by issuing laze build -b <board> test. embedded-tests can be used for any target that has probe-rs support (which currently means all targets). Both async and non-async code can be tested.

Currently, Ariel OS requires a fork of embedded-test. When using Ariel's build system, this will be used automatically.

Differences from vanilla embedded-test

In Ariel OS, the OS itself will start and initialize components before the tests are run. Logging, networking, ... will be available as for regular Ariel OS applications.

As a consequence, no Cargo features other than ariel-os should be enabled on the embedded-test dependency. In order to not require default-features = false, the (default) panic-handler feature is ignored when the ariel-os feature is enabled.

Setting up embedded-test for Ariel OS applications or libraries

Steps for enabling tests:

  1. Add embedded-test as a dev-dependency of your crate, and enable its ariel-os Cargo feature, as follows:
[dev-dependencies]
embedded-test = { version = "0.5.0", features = ["ariel-os"] }
  1. Disable the default test harness:

This depends on whether a lib, a bin or a separate test should be tested.

Add the following to your Cargo.toml:

# for a library crate
[lib]
harness = false

or

# for the default `bin`, "name" needs to match the package name
[[bin]]
name = "ariel-os-hello"
harness = false

or

# for a separate test in `test.rs`
[[test]]
name = "test"
harness = false
  1. Enable the embedded-test or embedded-test-only laze module:
apps:
# for an application:
  - name: your-application
    selects:
      - embedded-test

# for a library:
  - name: crate/your-library
    selects:
      - embedded-test-only

Even a library crate needs an entry in laze's apps in order to make the test task available. Selecting embedded-test-only will make sure that laze run is disabled.

  1. Add the following boilerplate to lib.rs, main.rs or test.rs:
#![allow(unused)]
fn main() {
This goes to the top of the file
#![no_main]
#![no_std]
#![feature(used_with_arg)]
#![feature(impl_trait_in_assoc_type)]
}
  1. Write the tests:
#![allow(unused)]
fn main() {
#[cfg(test)]
#[embedded_test::tests]
mod tests {
    // Optional: An init function which is called before every test
    #[init]
    fn init() -> u32 {
        return 42;
    }

    // A test which takes the state returned by the init function (optional)
    // This is an async function, it will be executed on the system executor.
    #[test]
    async fn trivial_async(n: u32) {
        assert!(n == 42)
    }
}
}

Again, please refer to the embedded-test documentation for more information.

Running the tests

To run a test, execute from within the crate's directory:

laze build -b <board> test