use trueno_cuda_edge::null_fuzzer::{
InjectionStrategy, NonNullDevicePtr, NullFuzzerConfig, NullSentinelFuzzer,
};
#[test]
fn device_ptr_construction_safety() {
let null_result = NonNullDevicePtr::<f32>::new(0);
assert!(null_result.is_err());
let valid_result = NonNullDevicePtr::<f32>::new(0x7f00_0000_0000);
assert!(valid_result.is_ok());
let ptr = valid_result.unwrap();
assert_eq!(ptr.addr(), 0x7f00_0000_0000);
}
#[test]
fn device_ptr_type_safety() {
let f32_ptr = NonNullDevicePtr::<f32>::new(0x1000).unwrap();
assert_eq!(f32_ptr.addr(), 0x1000);
let f16_ptr = NonNullDevicePtr::<u16>::new(0x2000).unwrap();
assert_eq!(f16_ptr.addr(), 0x2000);
let u8_ptr = NonNullDevicePtr::<u8>::new(0x3000).unwrap();
assert_eq!(u8_ptr.addr(), 0x3000);
}
#[test]
fn injection_strategies_for_kernel_calls() {
let periodic = InjectionStrategy::Periodic { interval: 100 };
assert!(periodic.should_inject(0));
assert!(periodic.should_inject(100));
assert!(!periodic.should_inject(50));
let size_based = InjectionStrategy::SizeThreshold {
threshold_bytes: 1024 * 1024 * 1024, };
assert!(!size_based.should_inject(0));
let prob = InjectionStrategy::Probabilistic { probability: 0.25 };
assert!(prob.should_inject(0));
assert!(prob.should_inject(24));
assert!(!prob.should_inject(25));
}
#[test]
fn fuzzer_call_sequence() {
let config = NullFuzzerConfig {
strategy: InjectionStrategy::Periodic { interval: 5 },
total_calls: 100,
fail_fast: false,
};
let mut fuzzer = NullSentinelFuzzer::new(config);
let mut injections = Vec::new();
for _ in 0..20 {
injections.push(fuzzer.next_call());
}
assert!(injections[0]);
assert!(!injections[1]);
assert!(injections[5]);
assert!(injections[10]);
assert!(injections[15]);
}