1 use nix::sys::statfs::*;
2 use nix::sys::statvfs::*;
3 use std::fs::File;
4 use std::path::Path;
5
check_fstatfs(path: &str)6 fn check_fstatfs(path: &str) {
7 if !Path::new(path).exists() {
8 return;
9 }
10 let vfs = statvfs(path.as_bytes()).unwrap();
11 let file = File::open(path).unwrap();
12 let fs = fstatfs(&file).unwrap();
13 assert_fs_equals(fs, vfs);
14 }
15
check_statfs(path: &str)16 fn check_statfs(path: &str) {
17 if !Path::new(path).exists() {
18 return;
19 }
20 let vfs = statvfs(path.as_bytes()).unwrap();
21 let fs = statfs(path.as_bytes()).unwrap();
22 assert_fs_equals(fs, vfs);
23 }
24
check_fstatfs_strict(path: &str)25 fn check_fstatfs_strict(path: &str) {
26 if !Path::new(path).exists() {
27 return;
28 }
29 let vfs = statvfs(path.as_bytes());
30 let file = File::open(path).unwrap();
31 let fs = fstatfs(&file);
32 assert_fs_equals_strict(fs.unwrap(), vfs.unwrap())
33 }
34
check_statfs_strict(path: &str)35 fn check_statfs_strict(path: &str) {
36 if !Path::new(path).exists() {
37 return;
38 }
39 let vfs = statvfs(path.as_bytes());
40 let fs = statfs(path.as_bytes());
41 assert_fs_equals_strict(fs.unwrap(), vfs.unwrap())
42 }
43
44 // The cast is not unnecessary on all platforms.
45 #[allow(clippy::unnecessary_cast)]
assert_fs_equals(fs: Statfs, vfs: Statvfs)46 fn assert_fs_equals(fs: Statfs, vfs: Statvfs) {
47 assert_eq!(fs.files() as u64, vfs.files() as u64);
48 assert_eq!(fs.blocks() as u64, vfs.blocks() as u64);
49 assert_eq!(fs.block_size() as u64, vfs.fragment_size() as u64);
50 }
51
52 #[test]
statfs_call()53 fn statfs_call() {
54 check_statfs("/tmp");
55 check_statfs("/dev");
56 check_statfs("/run");
57 check_statfs("/");
58 }
59
60 #[test]
fstatfs_call()61 fn fstatfs_call() {
62 check_fstatfs("/tmp");
63 check_fstatfs("/dev");
64 check_fstatfs("/run");
65 check_fstatfs("/");
66 }
67
68 // This test is ignored because files_free/blocks_free can change after statvfs call and before
69 // statfs call.
70 #[test]
71 #[ignore]
statfs_call_strict()72 fn statfs_call_strict() {
73 check_statfs_strict("/tmp");
74 check_statfs_strict("/dev");
75 check_statfs_strict("/run");
76 check_statfs_strict("/");
77 }
78
79 // This test is ignored because files_free/blocks_free can change after statvfs call and before
80 // fstatfs call.
81 #[test]
82 #[ignore]
fstatfs_call_strict()83 fn fstatfs_call_strict() {
84 check_fstatfs_strict("/tmp");
85 check_fstatfs_strict("/dev");
86 check_fstatfs_strict("/run");
87 check_fstatfs_strict("/");
88 }
89
90 // The cast is not unnecessary on all platforms.
91 #[allow(clippy::unnecessary_cast)]
assert_fs_equals_strict(fs: Statfs, vfs: Statvfs)92 fn assert_fs_equals_strict(fs: Statfs, vfs: Statvfs) {
93 assert_eq!(fs.files_free() as u64, vfs.files_free() as u64);
94 assert_eq!(fs.blocks_free() as u64, vfs.blocks_free() as u64);
95 assert_eq!(fs.blocks_available() as u64, vfs.blocks_available() as u64);
96 assert_eq!(fs.files() as u64, vfs.files() as u64);
97 assert_eq!(fs.blocks() as u64, vfs.blocks() as u64);
98 assert_eq!(fs.block_size() as u64, vfs.fragment_size() as u64);
99 }
100