| // Symlink tests are separate since they don't in general work on a Windows host. |
| //@ignore-host: windows # creating symlinks requires admin permissions on Windows |
| //@ignore-target: windows # File handling is not implemented yet |
| //@compile-flags: -Zmiri-disable-isolation |
| |
| use std::fs::{File, read_link, remove_file}; |
| use std::io::{Read, Result}; |
| use std::path::Path; |
| |
| #[path = "../../utils/mod.rs"] |
| mod utils; |
| |
| fn check_metadata(bytes: &[u8], path: &Path) -> Result<()> { |
| // Test that the file metadata is correct. |
| let metadata = path.metadata()?; |
| // `path` should point to a file. |
| assert!(metadata.is_file()); |
| // The size of the file must be equal to the number of written bytes. |
| assert_eq!(bytes.len() as u64, metadata.len()); |
| Ok(()) |
| } |
| |
| fn main() { |
| let bytes = b"Hello, World!\n"; |
| let path = utils::prepare_with_content("miri_test_fs_link_target.txt", bytes); |
| let symlink_path = utils::prepare("miri_test_fs_symlink.txt"); |
| |
| // Creating a symbolic link should succeed. |
| #[cfg(unix)] |
| std::os::unix::fs::symlink(&path, &symlink_path).unwrap(); |
| #[cfg(windows)] |
| std::os::windows::fs::symlink_file(&path, &symlink_path).unwrap(); |
| // Test that the symbolic link has the same contents as the file. |
| let mut symlink_file = File::open(&symlink_path).unwrap(); |
| let mut contents = Vec::new(); |
| symlink_file.read_to_end(&mut contents).unwrap(); |
| assert_eq!(bytes, contents.as_slice()); |
| |
| // Test that metadata of a symbolic link (i.e., the file it points to) is correct. |
| check_metadata(bytes, &symlink_path).unwrap(); |
| // Test that the metadata of a symbolic link is correct when not following it. |
| assert!(symlink_path.symlink_metadata().unwrap().file_type().is_symlink()); |
| // Check that we can follow the link. |
| assert_eq!(read_link(&symlink_path).unwrap(), path); |
| // Removing symbolic link should succeed. |
| remove_file(&symlink_path).unwrap(); |
| |
| // Removing file should succeed. |
| remove_file(&path).unwrap(); |
| } |