1 #![warn(rust_2018_idioms)] 2 #![cfg(all(feature = "full", not(target_os = "wasi")))] // WASI does not support all fs operations 3 4 use tokio::fs; 5 6 use std::io::Write; 7 use tempfile::tempdir; 8 9 #[tokio::test] 10 #[cfg_attr(miri, ignore)] // No `linkat` in miri. test_hard_link()11async fn test_hard_link() { 12 let dir = tempdir().unwrap(); 13 let src = dir.path().join("src.txt"); 14 let dst = dir.path().join("dst.txt"); 15 16 std::fs::File::create(&src) 17 .unwrap() 18 .write_all(b"hello") 19 .unwrap(); 20 21 fs::hard_link(&src, &dst).await.unwrap(); 22 23 std::fs::File::create(&src) 24 .unwrap() 25 .write_all(b"new-data") 26 .unwrap(); 27 28 let content = fs::read(&dst).await.unwrap(); 29 assert_eq!(content, b"new-data"); 30 31 // test that this is not a symlink: 32 assert!(fs::read_link(&dst).await.is_err()); 33 } 34 35 #[cfg(unix)] 36 #[tokio::test] test_symlink()37async fn test_symlink() { 38 let dir = tempdir().unwrap(); 39 let src = dir.path().join("src.txt"); 40 let dst = dir.path().join("dst.txt"); 41 42 std::fs::File::create(&src) 43 .unwrap() 44 .write_all(b"hello") 45 .unwrap(); 46 47 fs::symlink(&src, &dst).await.unwrap(); 48 49 std::fs::File::create(&src) 50 .unwrap() 51 .write_all(b"new-data") 52 .unwrap(); 53 54 let content = fs::read(&dst).await.unwrap(); 55 assert_eq!(content, b"new-data"); 56 57 let read = fs::read_link(dst.clone()).await.unwrap(); 58 assert!(read == src); 59 60 let symlink_meta = fs::symlink_metadata(dst.clone()).await.unwrap(); 61 assert!(symlink_meta.file_type().is_symlink()); 62 } 63