feat: improve last_error and cffi_wrapper

This commit is contained in:
2026-07-30 15:08:46 +08:00
parent 708e16a222
commit f84e1a5d9c
5 changed files with 555 additions and 149 deletions
+76
View File
@@ -0,0 +1,76 @@
//! 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()
}
#[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()), "");
}
#[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");
}
#[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()), "");
}
#[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"));
}
#[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"));
}