//! 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 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")); }