os-test-framework 0.1.2

Test framework for embedded systems and OS kernels.
Documentation

os-test-framework

Test framework for embedded systems and OS kernels.

os-test-framework requires alloc, so your kernel will need a global-allocator.

Getting Started

First, enable custom_test_frameworks, set test_runner as the test runner from os-test-framework, and reexport_test_harness_main.

#![feature(custom_test_frameworks)]
#![reexport_test_harness_main = "test_main"]
#![test_runner(os_test_framework::run_tests)]

Implement Platform. The framework writes output through core::fmt::Write and finishes the run through Platform::exit:

use core::fmt::Write;

use os_test_framework::platform::{ExitState, Platform};

struct MyPlatform;

impl Platform for MyPlatform {
    fn exit(&self, state: ExitState) -> ! {
        match state {
            ExitState::Success => todo!(),
            ExitState::Failed => todo!(),
        }
    }
}

impl Write for MyPlatform {
    fn write_str(&mut self, s: &str) -> core::fmt::Result {
        // Write to serial, frame buffer, UART, etc.
        let _ = s;
        todo!()
    }
}

Call init_platform with your Platform, and test_main from your kernel entry point:

use os_test_framework::platform::init_platform;

fn kernel_entry() {
    init_platform(MyPlatform);
    test_main();
}

Forward panics from your OS to os-test-framework:

use core::panic::PanicInfo;

#[cfg(test)]
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
    os_test_framework::panic::handle_panic(info)
}

Adding A Test

You can declare tests like this:

use os_test_framework::test;

test! {
    "Hello" {
        assert!(true);
    }
}

You can add multiple tests in the same file:

use os_test_framework::test;

test! {
    "Hello" {
        assert!(true);
    }
}

test! {
    "Hello2" {
        assert!(true);
    }
}