mod builder;
use builder::E01Builder;
use ewf_forensic::EwfIntegrity;
use proptest::prelude::*;
proptest! {
#[test]
fn analyse_never_panics(data in proptest::collection::vec(any::<u8>(), 0..4096)) {
let _ = EwfIntegrity::new(&data).analyse();
}
#[test]
fn analyse_with_progress_never_panics(
data in proptest::collection::vec(any::<u8>(), 0..4096)
) {
let _ = EwfIntegrity::new(&data).analyse_with_progress(|_| {});
}
#[test]
fn compute_hashes_never_panics(data in proptest::collection::vec(any::<u8>(), 0..4096)) {
let _ = EwfIntegrity::new(&data).compute_hashes();
}
#[test]
fn from_segments_never_panics(
s1 in proptest::collection::vec(any::<u8>(), 0..2048),
s2 in proptest::collection::vec(any::<u8>(), 0..2048),
) {
let _ = EwfIntegrity::from_segments(&[s1.as_slice(), s2.as_slice()]).analyse();
}
}
proptest! {
#[test]
fn clean_builder_image_no_anomalies(
log2_spc in 0u32..7u32,
chunk_count in 1u32..9u32,
) {
let sectors_per_chunk = 1u32 << log2_spc;
let total_bytes = u64::from(sectors_per_chunk) * 512 * u64::from(chunk_count);
let image = E01Builder::new(total_bytes).build();
let anomalies = EwfIntegrity::new(&image).analyse();
prop_assert!(
anomalies.is_empty(),
"clean builder image must have no anomalies; got: {anomalies:#?}"
);
}
#[test]
fn severity_never_panics_on_arbitrary_input(
data in proptest::collection::vec(any::<u8>(), 0..4096)
) {
let anomalies = EwfIntegrity::new(&data).analyse();
for a in &anomalies {
let _ = a.severity();
let _ = format!("{a}");
}
}
#[test]
fn analyse_and_with_progress_agree(
data in proptest::collection::vec(any::<u8>(), 0..4096)
) {
let baseline = EwfIntegrity::new(&data).analyse();
let with_cb = EwfIntegrity::new(&data).analyse_with_progress(|_| {});
prop_assert_eq!(
baseline.len(), with_cb.len(),
"analyse() and analyse_with_progress() must return same anomaly count"
);
}
}