use nix::sys::statfs::*; use nix::sys::statvfs::*; use std::fs::File; use std::path::Path; fn check_fstatfs(path: &str) { if !Path::new(path).exists() { return; } let vfs = statvfs(path.as_bytes()).unwrap(); let file = File::open(path).unwrap(); let fs = fstatfs(&file).unwrap(); assert_fs_equals(fs, vfs); } fn check_statfs(path: &str) { if !Path::new(path).exists() { return; } let vfs = statvfs(path.as_bytes()).unwrap(); let fs = statfs(path.as_bytes()).unwrap(); assert_fs_equals(fs, vfs); } fn check_fstatfs_strict(path: &str) { if !Path::new(path).exists() { return; } let vfs = statvfs(path.as_bytes()); let file = File::open(path).unwrap(); let fs = fstatfs(&file); assert_fs_equals_strict(fs.unwrap(), vfs.unwrap()) } fn check_statfs_strict(path: &str) { if !Path::new(path).exists() { return; } let vfs = statvfs(path.as_bytes()); let fs = statfs(path.as_bytes()); assert_fs_equals_strict(fs.unwrap(), vfs.unwrap()) } // The cast is not unnecessary on all platforms. #[allow(clippy::unnecessary_cast)] fn assert_fs_equals(fs: Statfs, vfs: Statvfs) { assert_eq!(fs.files() as u64, vfs.files() as u64); assert_eq!(fs.blocks() as u64, vfs.blocks() as u64); assert_eq!(fs.block_size() as u64, vfs.fragment_size() as u64); } #[test] fn statfs_call() { check_statfs("/tmp"); check_statfs("/dev"); check_statfs("/run"); check_statfs("/"); } #[test] fn fstatfs_call() { check_fstatfs("/tmp"); check_fstatfs("/dev"); check_fstatfs("/run"); check_fstatfs("/"); } // This test is ignored because files_free/blocks_free can change after statvfs call and before // statfs call. #[test] #[ignore] fn statfs_call_strict() { check_statfs_strict("/tmp"); check_statfs_strict("/dev"); check_statfs_strict("/run"); check_statfs_strict("/"); } // This test is ignored because files_free/blocks_free can change after statvfs call and before // fstatfs call. #[test] #[ignore] fn fstatfs_call_strict() { check_fstatfs_strict("/tmp"); check_fstatfs_strict("/dev"); check_fstatfs_strict("/run"); check_fstatfs_strict("/"); } // The cast is not unnecessary on all platforms. #[allow(clippy::unnecessary_cast)] fn assert_fs_equals_strict(fs: Statfs, vfs: Statvfs) { assert_eq!(fs.files_free() as u64, vfs.files_free() as u64); assert_eq!(fs.blocks_free() as u64, vfs.blocks_free() as u64); assert_eq!(fs.blocks_available() as u64, vfs.blocks_available() as u64); assert_eq!(fs.files() as u64, vfs.files() as u64); assert_eq!(fs.blocks() as u64, vfs.blocks() as u64); assert_eq!(fs.block_size() as u64, vfs.fragment_size() as u64); }