diff options
author | Florian Klink <flokli@flokli.de> | 2023-09-03T14·10+0300 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2023-09-05T21·13+0000 |
commit | f9b5fc49b123cb4db3941ee2ae9b891f5262deef (patch) | |
tree | 47aa3496ad69b7b4c6010956b90f454da12947c4 /tvix/store/src/fuse/tests.rs | |
parent | da9d706e0a5e4e37087e4841a8fc8edf0da35e77 (diff) |
feat(tvix/store/fuse): allow listing r/6556
This provides an additional configuration flag to the tvix-store mount subcommand, and logic in the fuse module to request listing for the root of the mountpoint. Change-Id: I05a8bc11f7991b574696f27a30afe0f4e718a58c Reviewed-on: https://cl.tvl.fyi/c/depot/+/9217 Autosubmit: flokli <flokli@flokli.de> Reviewed-by: adisbladis <adisbladis@gmail.com> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/store/src/fuse/tests.rs')
-rw-r--r-- | tvix/store/src/fuse/tests.rs | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/tvix/store/src/fuse/tests.rs b/tvix/store/src/fuse/tests.rs index e5e36579b6c2..2c99f75471a5 100644 --- a/tvix/store/src/fuse/tests.rs +++ b/tvix/store/src/fuse/tests.rs @@ -28,6 +28,17 @@ fn setup_and_mount<P: AsRef<Path>, F>( where F: Fn(Arc<dyn BlobService>, Arc<dyn DirectoryService>, Arc<dyn PathInfoService>), { + setup_and_mount_with_listing(mountpoint, setup_fn, false) +} + +fn setup_and_mount_with_listing<P: AsRef<Path>, F>( + mountpoint: P, + setup_fn: F, + list_root: bool, +) -> Result<fuser::BackgroundSession, std::io::Error> +where + F: Fn(Arc<dyn BlobService>, Arc<dyn DirectoryService>, Arc<dyn PathInfoService>), +{ let blob_service = gen_blob_service(); let directory_service = gen_directory_service(); let path_info_service = gen_pathinfo_service(blob_service.clone(), directory_service.clone()); @@ -38,7 +49,12 @@ where path_info_service.clone(), ); - let fs = FUSE::new(blob_service, directory_service, path_info_service); + let fs = FUSE::new( + blob_service, + directory_service, + path_info_service, + list_root, + ); fuser::spawn_mount2(fs, mountpoint, &[]) } @@ -280,6 +296,34 @@ fn root() { fuser_session.join() } +/// Ensure listing the root is allowed if configured explicitly +#[test] +fn root_with_listing() { + // https://plume.benboeckel.net/~/JustAnotherBlog/skipping-tests-in-rust + if !std::path::Path::new("/dev/fuse").exists() { + eprintln!("skipping test"); + return; + } + let tmpdir = TempDir::new().unwrap(); + + let fuser_session = + setup_and_mount_with_listing(tmpdir.path(), populate_blob_a, true).expect("must succeed"); + + { + // read_dir succeeds, but getting the first element will fail. + let mut it = fs::read_dir(tmpdir).expect("must succeed"); + + let e = it.next().expect("must be some").expect("must succeed"); + + let metadata = e.metadata().expect("must succeed"); + assert!(metadata.is_file()); + assert!(metadata.permissions().readonly()); + assert_eq!(fixtures::BLOB_A.len() as u64, metadata.len()); + } + + fuser_session.join() +} + /// Ensure we can stat a file at the root #[test] fn stat_file_at_root() { |