mirror of
https://github.com/phil-opp/blog_os.git
synced 2025-12-16 14:27:49 +00:00
Delete panic handler test
This commit is contained in:
@@ -4,10 +4,6 @@ version = "0.1.0"
|
|||||||
authors = ["Philipp Oppermann <dev@phil-opp.com>"]
|
authors = ["Philipp Oppermann <dev@phil-opp.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[[test]]
|
|
||||||
name = "panic_handler"
|
|
||||||
harness = false
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bootloader = "0.6.4"
|
bootloader = "0.6.4"
|
||||||
volatile = "0.2.3"
|
volatile = "0.2.3"
|
||||||
|
|||||||
@@ -1,74 +0,0 @@
|
|||||||
#![no_std]
|
|
||||||
#![no_main]
|
|
||||||
#![feature(panic_info_message)]
|
|
||||||
|
|
||||||
use blog_os::{exit_qemu, serial_print, serial_println, QemuExitCode};
|
|
||||||
use core::{
|
|
||||||
fmt::{self, Write},
|
|
||||||
panic::PanicInfo,
|
|
||||||
};
|
|
||||||
|
|
||||||
const MESSAGE: &str = "Example panic message from panic_handler test";
|
|
||||||
const PANIC_LINE: u32 = 17; // adjust this when moving the `panic!` call
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn _start() -> ! {
|
|
||||||
serial_print!("panic_handler... ");
|
|
||||||
panic!(MESSAGE); // must be in line `PANIC_LINE`
|
|
||||||
}
|
|
||||||
|
|
||||||
#[panic_handler]
|
|
||||||
fn panic(info: &PanicInfo) -> ! {
|
|
||||||
check_location(info);
|
|
||||||
check_message(info);
|
|
||||||
|
|
||||||
serial_println!("[ok]");
|
|
||||||
exit_qemu(QemuExitCode::Success);
|
|
||||||
loop {}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fail(error: &str) -> ! {
|
|
||||||
serial_println!("[failed]");
|
|
||||||
serial_println!("{}", error);
|
|
||||||
exit_qemu(QemuExitCode::Failed);
|
|
||||||
loop {}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn check_location(info: &PanicInfo) {
|
|
||||||
let location = info.location().unwrap_or_else(|| fail("no location"));
|
|
||||||
if location.file() != file!() {
|
|
||||||
fail("file name wrong");
|
|
||||||
}
|
|
||||||
if location.line() != PANIC_LINE {
|
|
||||||
fail("file line wrong");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn check_message(info: &PanicInfo) {
|
|
||||||
let message = info.message().unwrap_or_else(|| fail("no message"));
|
|
||||||
let mut compare_message = CompareMessage { expected: MESSAGE };
|
|
||||||
write!(&mut compare_message, "{}", message).unwrap_or_else(|_| fail("write failed"));
|
|
||||||
if compare_message.expected.len() != 0 {
|
|
||||||
fail("message shorter than expected message");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Compares a `fmt::Arguments` instance with the `MESSAGE` string
|
|
||||||
///
|
|
||||||
/// To use this type, write the `fmt::Arguments` instance to it using the
|
|
||||||
/// `write` macro. If the message component matches `MESSAGE`, the `expected`
|
|
||||||
/// field is the empty string.
|
|
||||||
struct CompareMessage {
|
|
||||||
expected: &'static str,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Write for CompareMessage {
|
|
||||||
fn write_str(&mut self, s: &str) -> fmt::Result {
|
|
||||||
if self.expected.starts_with(s) {
|
|
||||||
self.expected = &self.expected[s.len()..];
|
|
||||||
} else {
|
|
||||||
fail("message not equal to expected message");
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user