use crate::assert::assert_zeroize_on_drop;
use crate::traits::{AssertZeroizeOnDrop, FastZeroizable};
use crate::zeroize_on_drop_sentinel::ZeroizeOnDropSentinel;
#[test]
fn sentinel_functional_test() {
struct Test {
pub __sentinel: ZeroizeOnDropSentinel,
}
impl FastZeroizable for Test {
fn fast_zeroize(&mut self) {
self.__sentinel.fast_zeroize();
}
}
impl Drop for Test {
fn drop(&mut self) {
self.fast_zeroize();
}
}
impl AssertZeroizeOnDrop for Test {
fn clone_sentinel(&self) -> ZeroizeOnDropSentinel {
self.__sentinel.clone()
}
fn assert_zeroize_on_drop(self) {
assert_zeroize_on_drop(self);
}
}
let t = Test {
__sentinel: ZeroizeOnDropSentinel::default(),
};
let sentinel_clone = t.clone_sentinel();
assert_zeroize_on_drop(t);
assert!(sentinel_clone.is_zeroized());
}
#[test]
fn test_sentinel_zeroizes_clone() {
let mut sentinel = ZeroizeOnDropSentinel::default();
let sentinel_clone = sentinel.clone();
assert!(!sentinel.is_zeroized());
assert!(!sentinel_clone.is_zeroized());
sentinel.fast_zeroize();
assert!(sentinel_clone.is_zeroized());
assert!(sentinel_clone.is_zeroized());
}
#[test]
fn test_sentinel_is_not_zeroized_on_drop() {
let sentinel = ZeroizeOnDropSentinel::default();
let sentinel_clone = sentinel.clone();
assert!(!sentinel_clone.is_zeroized());
drop(sentinel);
assert!(!sentinel_clone.is_zeroized());
}
#[test]
fn test_sentinel_partial_eq() {
let mut sentinel1 = ZeroizeOnDropSentinel::default();
let mut sentinel2 = ZeroizeOnDropSentinel::default();
assert_eq!(sentinel1, sentinel2);
sentinel1.fast_zeroize();
assert_ne!(sentinel1, sentinel2);
sentinel2.fast_zeroize();
assert_eq!(sentinel1, sentinel2);
sentinel1.reset();
assert_ne!(sentinel1, sentinel2);
sentinel2.reset();
assert_eq!(sentinel1, sentinel2);
}
#[test]
fn test_sentinel_fast_zeroize() {
let mut sentinel = ZeroizeOnDropSentinel::default();
let sentinel_clone = sentinel.clone();
assert!(!sentinel.is_zeroized());
assert!(!sentinel_clone.is_zeroized());
sentinel.fast_zeroize();
assert!(sentinel.is_zeroized());
assert!(sentinel_clone.is_zeroized());
}
#[test]
fn test_sentinel_reset() {
let mut sentinel = ZeroizeOnDropSentinel::default();
let sentinel_clone = sentinel.clone();
sentinel.fast_zeroize();
assert!(sentinel.is_zeroized());
assert!(sentinel_clone.is_zeroized());
sentinel.reset();
assert!(!sentinel.is_zeroized());
assert!(!sentinel_clone.is_zeroized());
sentinel.fast_zeroize();
assert!(sentinel.is_zeroized());
assert!(sentinel_clone.is_zeroized());
}