#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum TokenPrivilegeError {
#[error("failed to open process token: {0}")]
OpenTokenFailed(std::io::Error),
#[error("failed to query token information: {0}")]
QueryFailed(std::io::Error),
#[error("invalid privilege name: {name}")]
InvalidPrivilegeName {
name: String,
},
#[error("privilege lookup failed for '{name}'")]
LookupFailed {
name: String,
source: std::io::Error,
},
#[error("privilege check failed: {0}")]
CheckFailed(std::io::Error),
#[error("token privilege operations are only supported on Windows")]
UnsupportedPlatform,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn unsupported_platform_display() {
let err = TokenPrivilegeError::UnsupportedPlatform;
let msg = err.to_string();
assert!(
msg.contains("only supported on Windows"),
"unexpected message: {msg}"
);
}
#[test]
fn open_token_failed_display() {
let io_err = std::io::Error::new(std::io::ErrorKind::PermissionDenied, "access denied");
let err = TokenPrivilegeError::OpenTokenFailed(io_err);
let msg = err.to_string();
assert!(
msg.contains("open process token"),
"unexpected message: {msg}"
);
}
#[test]
fn invalid_privilege_name_display() {
let err = TokenPrivilegeError::InvalidPrivilegeName {
name: "FakePrivilege".to_owned(),
};
let msg = err.to_string();
assert!(msg.contains("FakePrivilege"), "unexpected message: {msg}");
}
#[test]
fn query_failed_display() {
let io_err = std::io::Error::other("query error");
let err = TokenPrivilegeError::QueryFailed(io_err);
let msg = err.to_string();
assert!(
msg.contains("query token information"),
"unexpected message: {msg}"
);
}
#[test]
fn lookup_failed_display() {
let io_err = std::io::Error::other("not found");
let err = TokenPrivilegeError::LookupFailed {
name: "SeDebugPrivilege".to_owned(),
source: io_err,
};
let msg = err.to_string();
assert!(
msg.contains("SeDebugPrivilege"),
"unexpected message: {msg}"
);
assert!(
!msg.contains("not found"),
"display should not contain source text to avoid duplication: {msg}"
);
}
#[test]
fn check_failed_display() {
let io_err = std::io::Error::other("check error");
let err = TokenPrivilegeError::CheckFailed(io_err);
let msg = err.to_string();
assert!(
msg.contains("privilege check failed"),
"unexpected message: {msg}"
);
}
#[test]
fn error_is_send_and_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<TokenPrivilegeError>();
}
}