Files
sarasacw-omrf/omrf/tests/last_error.rs
T
yyc12345 7834741d90 feat: improve object pool
- improve object pool
- add docstring for test coverage
2026-08-01 17:25:38 +08:00

85 lines
2.8 KiB
Rust

//! Integration tests for the `last_error` module.
use sarasacw_omrf::last_error::{self, CError, CERROR_OK, CStrPtr};
use thiserror::Error;
#[derive(Debug, Error)]
enum TestErr {
#[error("boom error")]
Boom,
#[error("bad\x00value")]
WithNul,
}
impl From<TestErr> for CError {
fn from(e: TestErr) -> Self {
match e {
TestErr::Boom => 7,
TestErr::WithNul => 9,
}
}
}
fn parse_cstr(ptr: CStrPtr) -> String {
assert!(!ptr.is_null());
unsafe { std::ffi::CStr::from_ptr(ptr) }
.to_string_lossy()
.into_owned()
}
/// Coverage: the cleared/default state -- no outcome recorded, code is `CERROR_OK`, message empty.
#[test]
fn fresh_state_is_absolute_success() {
last_error::clear_last_error();
assert!(!last_error::has_last_message());
assert_eq!(last_error::get_error_code(), CERROR_OK);
assert_eq!(parse_cstr(last_error::get_error_message()), "");
}
/// Coverage: `set_last_error` records both the `Into<CError>`-mapped code and the `Display`-derived
/// message, and `has_last_message` becomes true.
#[test]
fn set_records_code_and_message() {
last_error::clear_last_error();
last_error::set_last_error(TestErr::Boom);
assert!(last_error::has_last_message());
assert_eq!(last_error::get_error_code(), 7);
assert_eq!(parse_cstr(last_error::get_error_message()), "boom error");
}
/// Coverage: `clear_last_error` resets a previously-recorded outcome back to the absolute-success
/// state (no code, empty message).
#[test]
fn clear_resets_to_absolute_success() {
last_error::set_last_error(TestErr::Boom);
assert!(last_error::has_last_message());
last_error::clear_last_error();
assert!(!last_error::has_last_message());
assert_eq!(last_error::get_error_code(), CERROR_OK);
assert_eq!(parse_cstr(last_error::get_error_message()), "");
}
/// Coverage: interior NUL bytes in an error's `Display` text are replaced so the message C string
/// builds without panicking, and the code is still recorded.
#[test]
fn interior_nul_in_message_is_sanitized() {
last_error::clear_last_error();
last_error::set_last_error(TestErr::WithNul);
assert_eq!(last_error::get_error_code(), 9);
let msg = parse_cstr(last_error::get_error_message());
assert!(!msg.contains('\0'));
assert!(msg.contains("bad"));
assert!(msg.contains("value"));
}
/// Coverage: a second `set_last_error` fully overwrites the previously recorded code and message.
#[test]
fn overwriting_replaces_previous_state() {
last_error::clear_last_error();
last_error::set_last_error(TestErr::Boom);
last_error::set_last_error(TestErr::WithNul);
assert_eq!(last_error::get_error_code(), 9);
let msg = parse_cstr(last_error::get_error_message());
assert!(!msg.contains("boom"));
}