#![allow(clippy::unwrap_used, clippy::expect_used)]
use std::io::Cursor;
use apfs_core::ApfsContainer;
const CHAIN: &[u8] = include_bytes!("../../tests/data/apfs_container_chain.bin");
const BLOCK_SIZE: usize = 4096;
const APFS_MAGIC: u32 = 0x4253_5041;
#[test]
fn resolve_single_volume_superblock_address() {
let mut container = ApfsContainer::open(Cursor::new(CHAIN)).expect("open container");
let addrs = container
.volume_superblock_addrs()
.expect("resolve volume addrs");
assert_eq!(addrs, vec![342]);
}
#[test]
fn resolved_block_carries_apsb_magic_and_valid_checksum() {
let mut container = ApfsContainer::open(Cursor::new(CHAIN)).expect("open");
let addrs = container.volume_superblock_addrs().expect("resolve");
assert_eq!(addrs.len(), 1);
let paddr = addrs[0] as usize;
let block = &CHAIN[paddr * BLOCK_SIZE..(paddr + 1) * BLOCK_SIZE];
let magic = u32::from_le_bytes(block[32..36].try_into().unwrap());
assert_eq!(magic, APFS_MAGIC, "resolved block is not an APSB");
let stored = u64::from_le_bytes(block[0..8].try_into().unwrap());
let computed = apfs_core::object::fletcher64_checksum(block);
assert_eq!(stored, computed, "APSB checksum mismatch");
}
#[test]
fn resolve_is_consistent_across_calls() {
let mut container = ApfsContainer::open(Cursor::new(CHAIN)).expect("open");
let a = container.volume_superblock_addrs().expect("first");
let b = container.volume_superblock_addrs().expect("second");
assert_eq!(a, b);
}