use crate::{Confidence, Detail, Evidence, Outcome};
const ASF_HEADER_GUID: [u8; 16] = [
0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C,
];
pub(crate) fn probe(data: &[u8], limit: usize) -> Outcome {
debug_assert!(limit <= data.len(), "harness caps limit at data.len()");
let region = &data[..limit];
if region.len() < ASF_HEADER_GUID.len() {
return Outcome::Insufficient(ASF_HEADER_GUID.len());
}
if region[..ASF_HEADER_GUID.len()] != ASF_HEADER_GUID {
return Outcome::None;
}
Outcome::Match(Evidence {
confidence: Confidence::STRONG,
detail: Detail::None,
})
}
#[cfg(test)]
mod tests {
use super::*;
fn fixture_bytes(rel: &str) -> std::vec::Vec<u8> {
std::fs::read(std::format!("{}/../{}", env!("CARGO_MANIFEST_DIR"), rel))
.unwrap_or_else(|e| panic!("failed to read {rel}: {e}"))
}
#[test]
fn short_prefix_is_insufficient() {
let data = fixture_bytes("fixtures/container-probe/video.asf");
let region = &data[..ASF_HEADER_GUID.len() - 1];
match probe(region, region.len()) {
Outcome::Insufficient(n) => assert_eq!(n, ASF_HEADER_GUID.len()),
other => panic!("15-byte ASF prefix must be Insufficient(16), got {other:?}"),
}
}
}