fn stack() -> gix_status::SymlinkCheck { stack_in("base")} fn stack_in(dir: &str) -> gix_status::SymlinkCheck { gix_status::SymlinkCheck::new( crate::scripted_fixture_read_only("symlink_stack.sh") .expect("valid script") .join(dir), )} #[test]fn paths_not_going_through_symlink_directories_are_ok_and_point_to_correct_item() -> crate::Result { for root in ["base", "symlink-base"] { let mut stack = stack_in(root); for (rela_path, expectation) in [ ("root-filelink", is_symlink as fn(&std::fs::Metadata) -> bool), ("root-dirlink", is_symlinked_dir), ("file", is_file), ("dir/file-in-dir", is_file), ("dir", is_dir), ("dir/subdir", is_dir), ("dir/filelink", is_symlink), ("dir/dirlink", is_symlinked_dir), ] { assert!( expectation(&stack.verified_path(rela_path)?.symlink_metadata()?), "{rela_path:?} expectation failed" ); } } Ok(())} #[test]fn leaf_file_does_not_have_to_exist() -> crate::Result { assert!(!stack().verified_path("dir/does-not-exist")?.exists()); Ok(())} #[test]#[cfg(not(windows))]fn intermediate_directories_have_to_exist_or_not_found_error() -> crate::Result { assert_eq!( stack().verified_path("nonexisting-dir/file").unwrap_err().kind(), std::io::ErrorKind::NotFound ); Ok(())} #[test]#[cfg(windows)]fn intermediate_directories_do_not_have_exist_for_success() -> crate::Result { assert!(stack().verified_path("nonexisting-dir/file").is_ok()); Ok(())} #[test]#[cfg_attr( windows, ignore = "on windows, symlinks appear to be files or dirs, is_symlink() doesn't work")]fn paths_leading_through_symlinks_are_rejected() { let mut stack = stack(); assert_eq!( stack.verified_path("root-dirlink/file-in-dir").unwrap_err().kind(), std::io::ErrorKind::Other, "root-dirlink is a symlink to a directory" ); assert_eq!( stack.verified_path("dir/dirlink/nothing").unwrap_err().kind(), std::io::ErrorKind::Other, "root-dirlink is a symlink to a directory" );} fn is_symlink(m: &std::fs::Metadata) -> bool { m.is_symlink()} fn is_symlinked_dir(m: &std::fs::Metadata) -> bool { m.is_symlink()}fn is_file(m: &std::fs::Metadata) -> bool { m.is_file()}fn is_dir(m: &std::fs::Metadata) -> bool { m.is_dir()}
fn stack() -> gix_status::SymlinkCheck {
stack_in("base")
}
fn stack_in(dir: &str) -> gix_status::SymlinkCheck {
gix_status::SymlinkCheck::new(
crate::scripted_fixture_read_only("symlink_stack.sh")
.expect("valid script")
.join(dir),
)
}
#[test]
fn paths_not_going_through_symlink_directories_are_ok_and_point_to_correct_item() -> crate::Result {
for root in ["base", "symlink-base"] {
let mut stack = stack_in(root);
for (rela_path, expectation) in [
("root-filelink", is_symlink as fn(&std::fs::Metadata) -> bool),
("root-dirlink", is_symlinked_dir),
("file", is_file),
("dir/file-in-dir", is_file),
("dir", is_dir),
("dir/subdir", is_dir),
("dir/filelink", is_symlink),
("dir/dirlink", is_symlinked_dir),
] {
assert!(
expectation(&stack.verified_path(rela_path)?.symlink_metadata()?),
"{rela_path:?} expectation failed"
);
}
}
Ok(())
}
#[test]
fn leaf_file_does_not_have_to_exist() -> crate::Result {
assert!(!stack().verified_path("dir/does-not-exist")?.exists());
Ok(())
}
#[test]
#[cfg(not(windows))]
fn intermediate_directories_have_to_exist_or_not_found_error() -> crate::Result {
assert_eq!(
stack().verified_path("nonexisting-dir/file").unwrap_err().kind(),
std::io::ErrorKind::NotFound
);
Ok(())
}
#[test]
#[cfg(windows)]
fn intermediate_directories_do_not_have_exist_for_success() -> crate::Result {
assert!(stack().verified_path("nonexisting-dir/file").is_ok());
Ok(())
}
#[test]
#[cfg_attr(
windows,
ignore = "on windows, symlinks appear to be files or dirs, is_symlink() doesn't work"
)]
fn paths_leading_through_symlinks_are_rejected() {
let mut stack = stack();
assert_eq!(
stack.verified_path("root-dirlink/file-in-dir").unwrap_err().kind(),
std::io::ErrorKind::Other,
"root-dirlink is a symlink to a directory"
);
assert_eq!(
stack.verified_path("dir/dirlink/nothing").unwrap_err().kind(),
std::io::ErrorKind::Other,
"root-dirlink is a symlink to a directory"
);
}
fn is_symlink(m: &std::fs::Metadata) -> bool {
m.is_symlink()
}
fn is_symlinked_dir(m: &std::fs::Metadata) -> bool {
m.is_symlink()
}
fn is_file(m: &std::fs::Metadata) -> bool {
m.is_file()
}
fn is_dir(m: &std::fs::Metadata) -> bool {
m.is_dir()
}