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