77 lines
2.1 KiB
Rust
77 lines
2.1 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()
|
|
}
|
|
|
|
#[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"));
|
|
}
|