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()11 async 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()37 async 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