use disk_forensic::container::{open, ContainerFormat, OpenError};
use forensicnomicon::{dmg, ewf, qcow2, vhd, vhdx, vmdk};
fn write_temp(name: &str, bytes: &[u8]) -> (tempfile::TempDir, std::path::PathBuf) {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join(name);
std::fs::write(&path, bytes).unwrap();
(dir, path)
}
fn assert_decode_error(name: &str, bytes: &[u8], format: ContainerFormat) {
let (_dir, path) = write_temp(name, bytes);
let err = open(&path).unwrap_err();
assert!(
matches!(err, OpenError::Decode(f, _) if f == format),
"expected Decode({format:?}, _), got {err:?}"
);
}
#[test]
fn ewf_signature_with_junk_body_is_a_decode_error() {
let mut bytes = ewf::EVF1_SIGNATURE.to_vec();
bytes.resize(bytes.len() + 1024, 0);
assert_decode_error("junk.E01", &bytes, ContainerFormat::Ewf);
}
#[test]
fn vmdk_magic_with_junk_body_is_a_decode_error() {
let mut bytes = vmdk::VMDK4_MAGIC.to_le_bytes().to_vec();
bytes.resize(bytes.len() + 1024, 0);
assert_decode_error("junk.vmdk", &bytes, ContainerFormat::Vmdk);
}
#[test]
fn qcow2_magic_with_junk_body_is_a_decode_error() {
let mut bytes = qcow2::MAGIC.to_be_bytes().to_vec();
bytes.resize(bytes.len() + 1024, 0);
assert_decode_error("junk.qcow2", &bytes, ContainerFormat::Qcow2);
}
#[test]
fn vhd_cookie_with_junk_body_is_a_decode_error() {
let mut bytes = vhd::FOOTER_COOKIE.to_vec();
bytes.resize(bytes.len() + 1024, 0);
assert_decode_error("junk.vhd", &bytes, ContainerFormat::Vhd);
}
#[test]
fn vhdx_identifier_with_junk_body_is_a_decode_error() {
let mut bytes = vhdx::FILE_IDENTIFIER.to_vec();
bytes.resize(bytes.len() + 2048, 0);
assert_decode_error("junk.vhdx", &bytes, ContainerFormat::Vhdx);
}
#[test]
fn dmg_koly_footer_with_junk_body_is_a_decode_error() {
let mut bytes = vec![0u8; 1024];
bytes[512..516].copy_from_slice(&dmg::KOLY_MAGIC.to_be_bytes());
bytes[512 + 224..512 + 232].copy_from_slice(&u64::MAX.to_be_bytes());
assert_decode_error("junk.dmg", &bytes, ContainerFormat::Dmg);
}
#[test]
fn opened_image_debug_is_non_exhaustive() {
let apm = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/data/apm.bin");
let opened = open(std::path::Path::new(apm)).unwrap();
let rendered = format!("{opened:?}");
assert!(rendered.contains("OpenedImage"), "got {rendered}");
assert!(rendered.contains("Raw"), "got {rendered}");
assert!(rendered.contains(".."), "non-exhaustive marker: {rendered}");
}