feat: improve last_error and cffi_wrapper
This commit is contained in:
@@ -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"));
|
||||
}
|
||||
Reference in New Issue
Block a user