use std::path::Path;
pub fn available_bytes(path: &Path) -> Option<u64> {
fs4::available_space(path).ok()
}
pub fn total_bytes(path: &Path) -> Option<u64> {
fs4::total_space(path).ok()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn available_bytes_answers_for_a_real_directory() {
let dir = tempfile::tempdir().expect("tempdir");
let free = available_bytes(dir.path()).expect("a temp dir reports its free space");
assert!(free > 1024 * 1024, "implausible free space: {free}");
}
#[test]
fn available_space_never_exceeds_the_filesystem_it_is_on() {
let dir = tempfile::tempdir().expect("tempdir");
let free = available_bytes(dir.path()).expect("free space");
let total = total_bytes(dir.path()).expect("total space");
assert!(total > 0, "a filesystem with no size");
assert!(free <= total, "{free} free on a {total} filesystem");
}
#[test]
fn a_file_and_its_directory_report_the_same_filesystem() {
let dir = tempfile::tempdir().expect("tempdir");
let file = dir.path().join("probe.txt");
std::fs::write(&file, b"probe").expect("write");
let from_dir = available_bytes(dir.path()).expect("free space via the directory");
let from_file = available_bytes(&file).expect("free space via the file");
let drift = from_dir.abs_diff(from_file);
assert!(
drift < 64 * 1024 * 1024,
"{from_dir} vs {from_file} differ by {drift}"
);
}
#[test]
fn an_unmeasurable_path_answers_none() {
assert_eq!(available_bytes(Path::new("")), None);
assert_eq!(total_bytes(Path::new("")), None);
}
}