#[path = "../../../os-vfs-paths/src/lib.rs"] mod os_vfs_paths; #[path = "../../../os-vfs-symlink/src/lib.rs"] mod symlink; fn namespace() -> os_vfs_paths::MountNamespace { let resolver = os_vfs_paths::PathState::new(); let root = resolver.resolve(b"/sandbox").unwrap(); let first = os_vfs_paths::Mount::new( resolver.resolve(b"/sandbox/veri").unwrap(), 1).unwrap(); let second = os_vfs_paths::Mount::new( resolver.resolve(b"/sandbox/ara").unwrap(), 2).unwrap(); os_vfs_paths::MountNamespace::new(root, first, second).unwrap() } #[test] fn os_vfs_paths_symlink_positive() { let namespace = namespace(); let before = namespace; let first = symlink::Link::new(&namespace, b"/veri/kisa", b"/ara/ikinci").unwrap(); let second = symlink::Link::new(&namespace, b"/ara/ikinci", b"/ara/dosya").unwrap(); let table = symlink::SymlinkTable::new(first, second).unwrap(); let resolution = table.resolve(&namespace, b"/veri/kisa").unwrap(); assert_eq!(resolution.hops, 2); assert_eq!(resolution.route.volume, 2); assert_eq!(resolution.route.relative_depth, 1); assert_eq!(resolution.route.path.component(2), Some("dosya")); assert_eq!(namespace, before); } #[test] fn os_vfs_paths_symlink_negative() { let namespace = namespace(); let before = namespace; let first = symlink::Link::new(&namespace, b"/veri/dongu", b"/veri/dongu").unwrap(); let second = symlink::Link::new(&namespace, b"/ara/ikinci", b"/ara/dosya").unwrap(); let table = symlink::SymlinkTable::new(first, second).unwrap(); assert_eq!(table.resolve(&namespace, b"/veri/dongu"), Err(symlink::Error::Eloop(symlink::MAX_SYMLINK_HOPS))); assert_eq!(namespace, before); assert_eq!(symlink::Link::new(&namespace, b"/veri/kisa", b"/../../../disari"), Err(symlink::Error::Path(os_vfs_paths::Error::AboveRoot))); assert_eq!(namespace, before); assert_eq!(table.resolve(&namespace, b"/ara/dosya").unwrap().hops, 0); }