diff options
Diffstat (limited to 'vendor/xattr/tests/main.rs')
-rw-r--r-- | vendor/xattr/tests/main.rs | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/vendor/xattr/tests/main.rs b/vendor/xattr/tests/main.rs new file mode 100644 index 000000000..0c4367862 --- /dev/null +++ b/vendor/xattr/tests/main.rs @@ -0,0 +1,115 @@ +extern crate tempfile; +extern crate xattr; + +use std::collections::BTreeSet; +use std::ffi::OsStr; +use xattr::FileExt; + +use tempfile::{tempfile_in, NamedTempFile}; + +#[test] +#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "macos"))] +fn test_fd() { + use std::os::unix::ffi::OsStrExt; + // Only works on "real" filesystems. + let tmp = tempfile_in("/var/tmp").unwrap(); + assert!(tmp.get_xattr("user.test").unwrap().is_none()); + assert_eq!( + tmp.list_xattr() + .unwrap() + .filter(|x| x.as_bytes().starts_with(b"user.")) + .count(), + 0 + ); + + tmp.set_xattr("user.test", b"my test").unwrap(); + assert_eq!(tmp.get_xattr("user.test").unwrap().unwrap(), b"my test"); + assert_eq!( + tmp.list_xattr() + .unwrap() + .filter(|x| x.as_bytes().starts_with(b"user.")) + .collect::<Vec<_>>(), + vec![OsStr::new("user.test")] + ); + + tmp.remove_xattr("user.test").unwrap(); + assert!(tmp.get_xattr("user.test").unwrap().is_none()); + assert_eq!( + tmp.list_xattr() + .unwrap() + .filter(|x| x.as_bytes().starts_with(b"user.")) + .count(), + 0 + ); +} + +#[test] +#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "macos"))] +fn test_path() { + use std::os::unix::ffi::OsStrExt; + // Only works on "real" filesystems. + let tmp = NamedTempFile::new_in("/var/tmp").unwrap(); + assert!(xattr::get(tmp.path(), "user.test").unwrap().is_none()); + assert_eq!( + xattr::list(tmp.path()) + .unwrap() + .filter(|x| x.as_bytes().starts_with(b"user.")) + .count(), + 0 + ); + + xattr::set(tmp.path(), "user.test", b"my test").unwrap(); + assert_eq!( + xattr::get(tmp.path(), "user.test").unwrap().unwrap(), + b"my test" + ); + assert_eq!( + xattr::list(tmp.path()) + .unwrap() + .filter(|x| x.as_bytes().starts_with(b"user.")) + .collect::<Vec<_>>(), + vec![OsStr::new("user.test")] + ); + + xattr::remove(tmp.path(), "user.test").unwrap(); + assert!(xattr::get(tmp.path(), "user.test").unwrap().is_none()); + assert_eq!( + xattr::list(tmp.path()) + .unwrap() + .filter(|x| x.as_bytes().starts_with(b"user.")) + .count(), + 0 + ); +} + +#[test] +#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "macos"))] +fn test_missing() { + assert!(xattr::get("/var/empty/does-not-exist", "user.test").is_err()); +} + +#[test] +#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "macos"))] +fn test_multi() { + use std::os::unix::ffi::OsStrExt; + // Only works on "real" filesystems. + let tmp = tempfile_in("/var/tmp").unwrap(); + let mut items: BTreeSet<_> = [ + OsStr::new("user.test1"), + OsStr::new("user.test2"), + OsStr::new("user.test3"), + ].iter() + .cloned() + .collect(); + + for it in &items { + tmp.set_xattr(it, b"value").unwrap(); + } + for it in tmp.list_xattr() + .unwrap() + .filter(|x| x.as_bytes().starts_with(&*b"user.")) + { + assert!(items.remove(&*it)); + } + assert!(items.is_empty()); +} |