From f897f4e558a7d9f099b83700944c867762947563 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Fri, 29 Dec 2023 17:02:01 +0800 Subject: [PATCH] feat: introduce test infrastructure --- src/arch/riscv/lowlevel.rs | 4 ++-- src/entry.rs | 3 ++- src/main.rs | 3 +++ src/test_runner.rs | 29 +++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/test_runner.rs diff --git a/src/arch/riscv/lowlevel.rs b/src/arch/riscv/lowlevel.rs index 1d51067..018bc23 100644 --- a/src/arch/riscv/lowlevel.rs +++ b/src/arch/riscv/lowlevel.rs @@ -21,7 +21,7 @@ impl LowLevel for Hardware { #[cfg(feature = "board_virt")] unsafe { - TEST_DEVICE.write_volatile(0x0042_3333) + TEST_DEVICE.write_volatile(0x0001_3333) } } else { #[cfg(not(feature = "board_virt"))] @@ -29,7 +29,7 @@ impl LowLevel for Hardware { #[cfg(feature = "board_virt")] unsafe { - TEST_DEVICE.write_volatile(0x0042_5555) + TEST_DEVICE.write_volatile(0x0000_5555) } } diff --git a/src/entry.rs b/src/entry.rs index e0eee2c..8702b25 100644 --- a/src/entry.rs +++ b/src/entry.rs @@ -5,7 +5,8 @@ use crate::utils::lowlevel::{Hardware, LowLevel}; pub extern "C" fn rust_main(hart_id: usize, device_tree_addr: usize) -> ! { crate::logging::init(); - info!("[rust_main] Kernel Started"); + #[cfg(test)] + crate::test_main(); // test_main will exit info!("Hello World!"); info!("hart_id = {}", hart_id); diff --git a/src/main.rs b/src/main.rs index 1846267..9022461 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,3 +32,6 @@ pub mod utils; // logging pub mod logging; +// test infrastructure +#[cfg(test)] +mod test_runner; diff --git a/src/test_runner.rs b/src/test_runner.rs new file mode 100644 index 0000000..7386d44 --- /dev/null +++ b/src/test_runner.rs @@ -0,0 +1,29 @@ +use log::info; + +use crate::utils::lowlevel::{Hardware, LowLevel}; + +// Reference: https://os.phil-opp.com/testing/ + +#[cfg(test)] +pub fn runner(tests: &[&dyn Testable]) { + info!("[TEST] Running {} tests", tests.len()); + for test in tests { + test.run(); + } + Hardware::shutdown(false); +} + +pub trait Testable { + fn run(&self); +} + +impl Testable for T +where + T: Fn(), +{ + fn run(&self) { + info!("[TEST] [{}] Testing", core::any::type_name::()); + self(); + info!("[TEST] [{}] Passed", core::any::type_name::()); + } +}