From 3cf2cf08b58bef8db767490eb5ba37a69b69ef37 Mon Sep 17 00:00:00 2001 From: Christian Hagemeier Date: Thu, 7 Nov 2024 16:24:39 +0000 Subject: [PATCH 1/7] Add statfs implementation Signed-off-by: Christian Hagemeier --- mountpoint-s3/src/fs.rs | 54 +++++++++++++++++++++++++++++++++++++++ mountpoint-s3/src/fuse.rs | 19 +++++++++++++- 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/mountpoint-s3/src/fs.rs b/mountpoint-s3/src/fs.rs index c2c44055c..e4530015e 100644 --- a/mountpoint-s3/src/fs.rs +++ b/mountpoint-s3/src/fs.rs @@ -107,6 +107,42 @@ pub struct DirectoryEntry { lookup: LookedUp, } +#[derive(Debug)] +/// Reply to a 'statfs' call +pub struct StatFs { + /// Total number of blocks + pub total_blocks: u64, + /// Number of free blocks + pub free_blocks: u64, + /// Number of free blocks available to unprivileged user + pub available_blocks: u64, + /// Number of inodes in file system + pub total_inodes: u64, + /// Available inodes + pub free_inodes: u64, + /// Optimal transfer block size + pub block_size: u32, + /// Maximum name length + pub maximum_name_length: u32, + /// Fragement size + pub fragment_size: u32, +} + +impl Default for StatFs { + fn default() -> Self { + Self { + total_blocks: 0, + free_blocks: 0, + available_blocks: 0, + total_inodes: 0, + free_inodes: 0, + block_size: 512, + maximum_name_length: 255, + fragment_size: 0, + } + } +} + impl S3Filesystem where Client: ObjectClient + Clone + Send + Sync + 'static, @@ -840,6 +876,24 @@ where } Ok(self.superblock.unlink(&self.client, parent_ino, name).await?) } + + pub async fn statfs(&self, _ino: InodeNo) -> Result { + const FREE_BLOCKS: u64 = u64::MAX / 2; + const FREE_INODES: u64 = u64::MAX / 2; + // According to https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html any S3 object name can be at most + // 1024 bytes. + const MAX_NAME_LENGTH: u32 = 1024; + + let reply = StatFs { + free_blocks: FREE_BLOCKS, + available_blocks: FREE_BLOCKS, + free_inodes: FREE_INODES, + maximum_name_length: MAX_NAME_LENGTH, + total_blocks: FREE_BLOCKS, + ..Default::default() + }; + Ok(reply) + } } #[cfg(test)] diff --git a/mountpoint-s3/src/fuse.rs b/mountpoint-s3/src/fuse.rs index f89d04d89..3cf539e12 100644 --- a/mountpoint-s3/src/fuse.rs +++ b/mountpoint-s3/src/fuse.rs @@ -14,7 +14,7 @@ use crate::prefetch::Prefetch; use fuser::ReplyXTimes; use fuser::{ Filesystem, KernelConfig, ReplyAttr, ReplyBmap, ReplyCreate, ReplyData, ReplyEmpty, ReplyEntry, ReplyIoctl, - ReplyLock, ReplyLseek, ReplyOpen, ReplyWrite, ReplyXattr, Request, TimeOrNow, + ReplyLock, ReplyLseek, ReplyOpen, ReplyStatfs, ReplyWrite, ReplyXattr, Request, TimeOrNow, }; pub mod session; @@ -580,4 +580,21 @@ where fn getxtimes(&self, _req: &Request<'_>, ino: u64, reply: ReplyXTimes) { fuse_unsupported!("getxtimes", reply); } + + #[instrument(level="warn", skip_all, fields(req=_req.unique(), ino=ino))] + fn statfs(&self, _req: &Request<'_>, ino: u64, reply: ReplyStatfs) { + match block_on(self.fs.statfs(ino).in_current_span()) { + Ok(statfs) => reply.statfs( + statfs.total_blocks, + statfs.free_blocks, + statfs.available_blocks, + statfs.total_inodes, + statfs.free_inodes, + statfs.block_size, + statfs.maximum_name_length, + statfs.fragment_size, + ), + Err(e) => fuse_error!("statfs", reply, e), + } + } } From 3af47724a431359f8f5b80abaac469735c209f22 Mon Sep 17 00:00:00 2001 From: Christian Hagemeier Date: Thu, 21 Nov 2024 13:40:10 +0000 Subject: [PATCH 2/7] Fix Changelog Signed-off-by: Christian Hagemeier --- mountpoint-s3/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mountpoint-s3/CHANGELOG.md b/mountpoint-s3/CHANGELOG.md index 88ff3554a..634204cff 100644 --- a/mountpoint-s3/CHANGELOG.md +++ b/mountpoint-s3/CHANGELOG.md @@ -1,5 +1,9 @@ ## Unreleased +### Other changes + +* Implement statfs to report non-zero value for total blocks, free blocks, free inodes and maximum file name length (before 0 was reported ([#1118](https://github.com/awslabs/mountpoint-s3/pull/1118))). + ## v1.11.0 (November 21, 2024) ### New features From 0f9ab4becba5b5f101818af38d8a1303b51b4f20 Mon Sep 17 00:00:00 2001 From: Christian Hagemeier Date: Mon, 18 Nov 2024 10:12:14 +0000 Subject: [PATCH 3/7] Add tests + address reviewer feedback Signed-off-by: Christian Hagemeier --- mountpoint-s3/CHANGELOG.md | 2 +- mountpoint-s3/src/fs.rs | 10 +-- mountpoint-s3/tests/fuse_tests/mod.rs | 1 + mountpoint-s3/tests/fuse_tests/statfs_test.rs | 82 +++++++++++++++++++ 4 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 mountpoint-s3/tests/fuse_tests/statfs_test.rs diff --git a/mountpoint-s3/CHANGELOG.md b/mountpoint-s3/CHANGELOG.md index 634204cff..da78365ab 100644 --- a/mountpoint-s3/CHANGELOG.md +++ b/mountpoint-s3/CHANGELOG.md @@ -2,7 +2,7 @@ ### Other changes -* Implement statfs to report non-zero value for total blocks, free blocks, free inodes and maximum file name length (before 0 was reported ([#1118](https://github.com/awslabs/mountpoint-s3/pull/1118))). +* Implement statfs to report non-zero synthetic values. This may unblock applications which rely on verifying there is available space before creating new files.([#1118](https://github.com/awslabs/mountpoint-s3/pull/1118)). ## v1.11.0 (November 21, 2024) diff --git a/mountpoint-s3/src/fs.rs b/mountpoint-s3/src/fs.rs index e4530015e..5d6bbf3a3 100644 --- a/mountpoint-s3/src/fs.rs +++ b/mountpoint-s3/src/fs.rs @@ -130,6 +130,7 @@ pub struct StatFs { impl Default for StatFs { fn default() -> Self { + // Default values copied from Fuser (https://github.com/cberner/fuser/blob/e18bd9bf9071ecd8be62993726e06ff11d6ec709/src/lib.rs#L695-L698) Self { total_blocks: 0, free_blocks: 0, @@ -878,18 +879,15 @@ where } pub async fn statfs(&self, _ino: InodeNo) -> Result { - const FREE_BLOCKS: u64 = u64::MAX / 2; - const FREE_INODES: u64 = u64::MAX / 2; - // According to https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html any S3 object name can be at most - // 1024 bytes. - const MAX_NAME_LENGTH: u32 = 1024; + const FREE_BLOCKS: u64 = u64::MAX / 1024; + const FREE_INODES: u64 = u64::MAX / 1024; let reply = StatFs { free_blocks: FREE_BLOCKS, available_blocks: FREE_BLOCKS, free_inodes: FREE_INODES, - maximum_name_length: MAX_NAME_LENGTH, total_blocks: FREE_BLOCKS, + total_inodes: FREE_INODES, ..Default::default() }; Ok(reply) diff --git a/mountpoint-s3/tests/fuse_tests/mod.rs b/mountpoint-s3/tests/fuse_tests/mod.rs index ae22c55c6..5c976d234 100644 --- a/mountpoint-s3/tests/fuse_tests/mod.rs +++ b/mountpoint-s3/tests/fuse_tests/mod.rs @@ -13,3 +13,4 @@ mod semantics_doc_test; mod setattr_test; mod unlink_test; mod write_test; +mod statfs_test; diff --git a/mountpoint-s3/tests/fuse_tests/statfs_test.rs b/mountpoint-s3/tests/fuse_tests/statfs_test.rs new file mode 100644 index 000000000..c7f41692c --- /dev/null +++ b/mountpoint-s3/tests/fuse_tests/statfs_test.rs @@ -0,0 +1,82 @@ +use crate::common::fuse::{self, TestSessionCreator}; +use test_case::test_case; + +/// Tests that non-zero empty space is reported +fn statfs_test_available_nonzero(creator_fn: impl TestSessionCreator, prefix: &str) { + let test_session = creator_fn(prefix, Default::default()); + let mount_dir = test_session.mount_dir; + let stats = nix::sys::statvfs::statvfs(&mount_dir.into_path()).unwrap(); + assert_ne!(stats.blocks_free(), 0); + assert_ne!(stats.blocks_available(), 0); + assert_ne!(stats.blocks(), 0); +} + +/// Tests that default values from FUSER are reported for mpst fields +fn statfs_test_fuser_defaults(creator_fn: impl TestSessionCreator, prefix: &str) { + let test_session = creator_fn(prefix, Default::default()); + let mount_dir = test_session.mount_dir; + let stats = nix::sys::statvfs::statvfs(&mount_dir.into_path()).unwrap(); + //assert_eq!(stats.name_max(), 255); + // These five aren't default values but set by us, so maybe drop + assert_eq!(stats.blocks(), u64::MAX / 1024); + assert_eq!(stats.blocks_free(), u64::MAX / 1024); + assert_eq!(stats.blocks_available(), u64::MAX / 1024); + assert_eq!(stats.files(), u64::MAX / 1024); + assert_eq!(stats.files_available(), u64::MAX / 1024); + // These are default values from the Default implementation + assert_eq!(stats.block_size(), 512); + assert_eq!(stats.name_max(), 255); + println!("{}", stats.fragment_size().to_string()); + // This may be a bit surprising, however as we set fsize to 0, + // it will be automatically set to the block_size, if it is not available + // c.f. https://stackoverflow.com/questions/54823541/what-do-f-bsize-and-f-frsize-in-struct-statvfs-stand-for + assert_eq!(stats.fragment_size(), 255); +} + +/// Test that total blocks >= blocks_free, +/// as some tools rely on calculations with these values to determine percentage of blocks available +fn statfs_test_block_arithmetic(creator_fn: impl TestSessionCreator, prefix: &str) { + let test_session = creator_fn(prefix, Default::default()); + let mount_dir = test_session.mount_dir; + let stats = nix::sys::statvfs::statvfs(&mount_dir.into_path()).unwrap(); + assert!(stats.blocks() >= stats.blocks_available()); +} + +#[test_case(""; "no prefix")] +#[test_case("statfs_report_nonzero_test"; "prefix")] +fn statfs_report_nonzero_test_mock(prefix: &str) { + statfs_test_available_nonzero(fuse::mock_session::new, prefix); +} + +#[cfg(feature = "s3_tests")] +#[test_case(""; "no prefix")] +#[test_case("statfs_report_nonzero_test"; "prefix")] +fn statfs_report_nonzero_s3(prefix: &str) { + statfs_test_available_nonzero(fuse::s3_session::new, prefix); +} + +#[test_case(""; "no prefix")] +#[test_case("statfs_report_fuser_defaults_test"; "prefix")] +fn statfs_report_fuser_defaults_mock(prefix: &str) { + statfs_test_fuser_defaults(fuse::mock_session::new, prefix); +} + +#[cfg(feature = "s3_tests")] +#[test_case(""; "no prefix")] +#[test_case("statfs_report_nonzero_test"; "prefix")] +fn statfs_report_fuser_defaults_s3(prefix: &str) { + statfs_test_available_nonzero(fuse::s3_session::new, prefix); +} + +#[test_case(""; "no prefix")] +#[test_case("statfs_block_arithmetic_test"; "prefix")] +fn statfs_block_arithmetic_mock(prefix: &str) { + statfs_test_block_arithmetic(fuse::mock_session::new, prefix); +} + +#[cfg(feature = "s3_tests")] +#[test_case(""; "no prefix")] +#[test_case("statfs_block_arithmetic_test"; "prefix")] +fn statfs_block_arithmetic_s3(prefix: &str) { + statfs_test_block_arithmetic(fuse::s3_session::new, prefix); +} From ba4aa90e89671ca70dd66c10e6ca66c93f6304a0 Mon Sep 17 00:00:00 2001 From: Christian Hagemeier Date: Mon, 18 Nov 2024 10:29:39 +0000 Subject: [PATCH 4/7] Fix tests Signed-off-by: Christian Hagemeier --- mountpoint-s3/tests/fuse_tests/mod.rs | 2 +- mountpoint-s3/tests/fuse_tests/statfs_test.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mountpoint-s3/tests/fuse_tests/mod.rs b/mountpoint-s3/tests/fuse_tests/mod.rs index 5c976d234..2c310090a 100644 --- a/mountpoint-s3/tests/fuse_tests/mod.rs +++ b/mountpoint-s3/tests/fuse_tests/mod.rs @@ -11,6 +11,6 @@ mod readdir_test; mod rmdir_test; mod semantics_doc_test; mod setattr_test; +mod statfs_test; mod unlink_test; mod write_test; -mod statfs_test; diff --git a/mountpoint-s3/tests/fuse_tests/statfs_test.rs b/mountpoint-s3/tests/fuse_tests/statfs_test.rs index c7f41692c..34f05b4f0 100644 --- a/mountpoint-s3/tests/fuse_tests/statfs_test.rs +++ b/mountpoint-s3/tests/fuse_tests/statfs_test.rs @@ -30,7 +30,7 @@ fn statfs_test_fuser_defaults(creator_fn: impl TestSessionCreator, prefix: &str) // This may be a bit surprising, however as we set fsize to 0, // it will be automatically set to the block_size, if it is not available // c.f. https://stackoverflow.com/questions/54823541/what-do-f-bsize-and-f-frsize-in-struct-statvfs-stand-for - assert_eq!(stats.fragment_size(), 255); + assert_eq!(stats.fragment_size(), 512); } /// Test that total blocks >= blocks_free, From f41af73eeb189a0d43c3a3bab0116945f6975e1f Mon Sep 17 00:00:00 2001 From: Christian Hagemeier Date: Mon, 18 Nov 2024 10:58:46 +0000 Subject: [PATCH 5/7] Fix tests after merge Signed-off-by: Christian Hagemeier --- mountpoint-s3/tests/fuse_tests/statfs_test.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mountpoint-s3/tests/fuse_tests/statfs_test.rs b/mountpoint-s3/tests/fuse_tests/statfs_test.rs index 34f05b4f0..838db3251 100644 --- a/mountpoint-s3/tests/fuse_tests/statfs_test.rs +++ b/mountpoint-s3/tests/fuse_tests/statfs_test.rs @@ -4,8 +4,8 @@ use test_case::test_case; /// Tests that non-zero empty space is reported fn statfs_test_available_nonzero(creator_fn: impl TestSessionCreator, prefix: &str) { let test_session = creator_fn(prefix, Default::default()); - let mount_dir = test_session.mount_dir; - let stats = nix::sys::statvfs::statvfs(&mount_dir.into_path()).unwrap(); + let mount_dir = test_session.mount_path(); + let stats = nix::sys::statvfs::statvfs(mount_dir.into()).unwrap(); assert_ne!(stats.blocks_free(), 0); assert_ne!(stats.blocks_available(), 0); assert_ne!(stats.blocks(), 0); @@ -14,8 +14,8 @@ fn statfs_test_available_nonzero(creator_fn: impl TestSessionCreator, prefix: &s /// Tests that default values from FUSER are reported for mpst fields fn statfs_test_fuser_defaults(creator_fn: impl TestSessionCreator, prefix: &str) { let test_session = creator_fn(prefix, Default::default()); - let mount_dir = test_session.mount_dir; - let stats = nix::sys::statvfs::statvfs(&mount_dir.into_path()).unwrap(); + let mount_dir = test_session.mount_path(); + let stats = nix::sys::statvfs::statvfs(mount_dir.into()).unwrap(); //assert_eq!(stats.name_max(), 255); // These five aren't default values but set by us, so maybe drop assert_eq!(stats.blocks(), u64::MAX / 1024); @@ -37,8 +37,8 @@ fn statfs_test_fuser_defaults(creator_fn: impl TestSessionCreator, prefix: &str) /// as some tools rely on calculations with these values to determine percentage of blocks available fn statfs_test_block_arithmetic(creator_fn: impl TestSessionCreator, prefix: &str) { let test_session = creator_fn(prefix, Default::default()); - let mount_dir = test_session.mount_dir; - let stats = nix::sys::statvfs::statvfs(&mount_dir.into_path()).unwrap(); + let mount_dir = test_session.mount_path(); + let stats = nix::sys::statvfs::statvfs(mount_dir.into()).unwrap(); assert!(stats.blocks() >= stats.blocks_available()); } From 2186876a4a7812d1a0922667ae37ccc5605235c7 Mon Sep 17 00:00:00 2001 From: Christian Hagemeier Date: Wed, 20 Nov 2024 08:56:14 +0000 Subject: [PATCH 6/7] Fix typos, incorporate reviewer feedback Signed-off-by: Christian Hagemeier --- mountpoint-s3/src/fs.rs | 2 +- mountpoint-s3/tests/fuse_tests/statfs_test.rs | 50 +++++-------------- 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/mountpoint-s3/src/fs.rs b/mountpoint-s3/src/fs.rs index 5d6bbf3a3..a3019a6b8 100644 --- a/mountpoint-s3/src/fs.rs +++ b/mountpoint-s3/src/fs.rs @@ -107,8 +107,8 @@ pub struct DirectoryEntry { lookup: LookedUp, } -#[derive(Debug)] /// Reply to a 'statfs' call +#[derive(Debug)] pub struct StatFs { /// Total number of blocks pub total_blocks: u64, diff --git a/mountpoint-s3/tests/fuse_tests/statfs_test.rs b/mountpoint-s3/tests/fuse_tests/statfs_test.rs index 838db3251..969ac3a71 100644 --- a/mountpoint-s3/tests/fuse_tests/statfs_test.rs +++ b/mountpoint-s3/tests/fuse_tests/statfs_test.rs @@ -1,32 +1,21 @@ use crate::common::fuse::{self, TestSessionCreator}; use test_case::test_case; -/// Tests that non-zero empty space is reported -fn statfs_test_available_nonzero(creator_fn: impl TestSessionCreator, prefix: &str) { +/// Tests that values we set are reported correctly. +fn statfs_test_fuser_values(creator_fn: impl TestSessionCreator, prefix: &str) { let test_session = creator_fn(prefix, Default::default()); let mount_dir = test_session.mount_path(); - let stats = nix::sys::statvfs::statvfs(mount_dir.into()).unwrap(); + let stats = nix::sys::statvfs::statvfs(mount_dir).unwrap(); + // Asserts that we report free space, we don't care about actual values here + assert_ne!(stats.blocks(), 0); assert_ne!(stats.blocks_free(), 0); assert_ne!(stats.blocks_available(), 0); - assert_ne!(stats.blocks(), 0); -} - -/// Tests that default values from FUSER are reported for mpst fields -fn statfs_test_fuser_defaults(creator_fn: impl TestSessionCreator, prefix: &str) { - let test_session = creator_fn(prefix, Default::default()); - let mount_dir = test_session.mount_path(); - let stats = nix::sys::statvfs::statvfs(mount_dir.into()).unwrap(); - //assert_eq!(stats.name_max(), 255); - // These five aren't default values but set by us, so maybe drop - assert_eq!(stats.blocks(), u64::MAX / 1024); - assert_eq!(stats.blocks_free(), u64::MAX / 1024); - assert_eq!(stats.blocks_available(), u64::MAX / 1024); + // These two are values set by us assert_eq!(stats.files(), u64::MAX / 1024); assert_eq!(stats.files_available(), u64::MAX / 1024); // These are default values from the Default implementation assert_eq!(stats.block_size(), 512); assert_eq!(stats.name_max(), 255); - println!("{}", stats.fragment_size().to_string()); // This may be a bit surprising, however as we set fsize to 0, // it will be automatically set to the block_size, if it is not available // c.f. https://stackoverflow.com/questions/54823541/what-do-f-bsize-and-f-frsize-in-struct-statvfs-stand-for @@ -38,34 +27,21 @@ fn statfs_test_fuser_defaults(creator_fn: impl TestSessionCreator, prefix: &str) fn statfs_test_block_arithmetic(creator_fn: impl TestSessionCreator, prefix: &str) { let test_session = creator_fn(prefix, Default::default()); let mount_dir = test_session.mount_path(); - let stats = nix::sys::statvfs::statvfs(mount_dir.into()).unwrap(); + let stats = nix::sys::statvfs::statvfs(mount_dir).unwrap(); assert!(stats.blocks() >= stats.blocks_available()); } #[test_case(""; "no prefix")] -#[test_case("statfs_report_nonzero_test"; "prefix")] -fn statfs_report_nonzero_test_mock(prefix: &str) { - statfs_test_available_nonzero(fuse::mock_session::new, prefix); -} - -#[cfg(feature = "s3_tests")] -#[test_case(""; "no prefix")] -#[test_case("statfs_report_nonzero_test"; "prefix")] -fn statfs_report_nonzero_s3(prefix: &str) { - statfs_test_available_nonzero(fuse::s3_session::new, prefix); -} - -#[test_case(""; "no prefix")] -#[test_case("statfs_report_fuser_defaults_test"; "prefix")] -fn statfs_report_fuser_defaults_mock(prefix: &str) { - statfs_test_fuser_defaults(fuse::mock_session::new, prefix); +#[test_case("statfs_report_fuser_values_test"; "prefix")] +fn statfs_report_fuser_values_mock(prefix: &str) { + statfs_test_fuser_values(fuse::mock_session::new, prefix); } #[cfg(feature = "s3_tests")] #[test_case(""; "no prefix")] -#[test_case("statfs_report_nonzero_test"; "prefix")] -fn statfs_report_fuser_defaults_s3(prefix: &str) { - statfs_test_available_nonzero(fuse::s3_session::new, prefix); +#[test_case("statfs_report_fuser_values_test"; "prefix")] +fn statfs_report_fuser_values_s3(prefix: &str) { + statfs_test_fuser_values(fuse::s3_session::new, prefix); } #[test_case(""; "no prefix")] From dc019d57b6805dbe75df1686d4af7e852a92fbc2 Mon Sep 17 00:00:00 2001 From: Christian Hagemeier Date: Thu, 21 Nov 2024 13:35:13 +0000 Subject: [PATCH 7/7] Improve test naming Signed-off-by: Christian Hagemeier --- mountpoint-s3/tests/fuse_tests/statfs_test.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mountpoint-s3/tests/fuse_tests/statfs_test.rs b/mountpoint-s3/tests/fuse_tests/statfs_test.rs index 969ac3a71..8ffdd0303 100644 --- a/mountpoint-s3/tests/fuse_tests/statfs_test.rs +++ b/mountpoint-s3/tests/fuse_tests/statfs_test.rs @@ -1,8 +1,8 @@ use crate::common::fuse::{self, TestSessionCreator}; use test_case::test_case; -/// Tests that values we set are reported correctly. -fn statfs_test_fuser_values(creator_fn: impl TestSessionCreator, prefix: &str) { +/// Tests that static values we set are reported correctly. +fn statfs_test_static_values(creator_fn: impl TestSessionCreator, prefix: &str) { let test_session = creator_fn(prefix, Default::default()); let mount_dir = test_session.mount_path(); let stats = nix::sys::statvfs::statvfs(mount_dir).unwrap(); @@ -32,16 +32,16 @@ fn statfs_test_block_arithmetic(creator_fn: impl TestSessionCreator, prefix: &st } #[test_case(""; "no prefix")] -#[test_case("statfs_report_fuser_values_test"; "prefix")] -fn statfs_report_fuser_values_mock(prefix: &str) { - statfs_test_fuser_values(fuse::mock_session::new, prefix); +#[test_case("statfs_static_values_test"; "prefix")] +fn statfs_report_static_values_mock(prefix: &str) { + statfs_test_static_values(fuse::mock_session::new, prefix); } #[cfg(feature = "s3_tests")] #[test_case(""; "no prefix")] -#[test_case("statfs_report_fuser_values_test"; "prefix")] -fn statfs_report_fuser_values_s3(prefix: &str) { - statfs_test_fuser_values(fuse::s3_session::new, prefix); +#[test_case("statfs_static_values_test"; "prefix")] +fn statfs_report_static_values_s3(prefix: &str) { + statfs_test_static_values(fuse::s3_session::new, prefix); } #[test_case(""; "no prefix")]