src/source/file/rotation_test.rs

#[cfg(test)]
mod tests {
    use crate::source::file::rotation::{compare, Delta, Snapshot};

    fn snap(inode: u64, size: u64) -> Snapshot {
        Snapshot { inode, size, dev: 1 }
    }

    #[test]
    fn unchanged_snapshot() {
        let a = snap(1, 100);
        let b = snap(1, 100);
        assert_eq!(compare(&a, &b), Delta::Unchanged);
    }

    #[test]
    fn growth_is_append() {
        let a = snap(1, 100);
        let b = snap(1, 200);
        assert_eq!(compare(&a, &b), Delta::Appended);
    }

    #[test]
    fn shrink_is_truncation() {
        let a = snap(1, 200);
        let b = snap(1, 64);
        assert_eq!(compare(&a, &b), Delta::Truncated);
    }

    #[test]
    fn different_inode_is_rotation() {
        let a = snap(1, 100);
        let b = snap(2, 0);
        assert_eq!(compare(&a, &b), Delta::Rotated);
    }

    #[test]
    fn different_device_is_replaced() {
        let a = Snapshot { inode: 1, size: 100, dev: 1 };
        let b = Snapshot { inode: 1, size: 100, dev: 2 };
        assert_eq!(compare(&a, &b), Delta::Replaced);
    }

    #[test]
    fn truncated_and_rotated_both_require_reopen() {
        assert!(Delta::Truncated.requires_reopen());
        assert!(Delta::Rotated.requires_reopen());
        assert!(Delta::Replaced.requires_reopen());
        assert!(!Delta::Appended.requires_reopen());
        assert!(!Delta::Unchanged.requires_reopen());
    }

    #[test]
    fn zero_size_reopen_after_rotation() {
        let old = snap(17, 9_000_000);
        let new = snap(42, 0);
        assert_eq!(compare(&old, &new), Delta::Rotated);
    }
}