use crate::AnomalyKind;
#[must_use]
pub fn audit<R: std::io::Read + std::io::Seek>(
_reader: &mut R,
_volume: &apfs_core::volume::ApfsVolume,
) -> Vec<AnomalyKind> {
clone_anomalies(&[], &[])
}
fn clone_anomalies(shared: &[(u64, u64)], flagged_unshared: &[u64]) -> Vec<AnomalyKind> {
let mut out = Vec::new();
for &(inode_a, inode_b) in shared {
out.push(AnomalyKind::CloneSharedExtent { inode_a, inode_b });
}
for &inode in flagged_unshared {
out.push(AnomalyKind::CloneFlagWithoutSharing { inode });
}
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn no_sharing_no_flags_is_clean() {
assert!(clone_anomalies(&[], &[]).is_empty());
}
#[test]
fn shared_extent_is_a_provenance_link() {
let v = clone_anomalies(&[(10, 20)], &[]);
assert_eq!(v.len(), 1);
assert_eq!(v[0].code(), "APFS-CLONE-SHARED-EXTENT");
}
#[test]
fn clone_flag_without_sharing_is_inconsistency() {
let v = clone_anomalies(&[], &[7]);
assert_eq!(v.len(), 1);
assert_eq!(v[0].code(), "APFS-CLONE-FLAG-WITHOUT-SHARING");
}
}