1 #![warn(rust_2018_idioms)]
2 #![cfg(feature = "full")]
3 
4 use tokio::fs::File;
5 use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt};
6 use tokio_test::task;
7 
8 use std::io::prelude::*;
9 use tempfile::NamedTempFile;
10 
11 const HELLO: &[u8] = b"hello world...";
12 
13 #[tokio::test]
basic_read()14 async fn basic_read() {
15     let mut tempfile = tempfile();
16     tempfile.write_all(HELLO).unwrap();
17 
18     let mut file = File::open(tempfile.path()).await.unwrap();
19 
20     let mut buf = [0; 1024];
21     let n = file.read(&mut buf).await.unwrap();
22 
23     assert_eq!(n, HELLO.len());
24     assert_eq!(&buf[..n], HELLO);
25 }
26 
27 #[tokio::test]
basic_write()28 async fn basic_write() {
29     let tempfile = tempfile();
30 
31     let mut file = File::create(tempfile.path()).await.unwrap();
32 
33     file.write_all(HELLO).await.unwrap();
34     file.flush().await.unwrap();
35 
36     let file = std::fs::read(tempfile.path()).unwrap();
37     assert_eq!(file, HELLO);
38 }
39 
40 #[tokio::test]
basic_write_and_shutdown()41 async fn basic_write_and_shutdown() {
42     let tempfile = tempfile();
43 
44     let mut file = File::create(tempfile.path()).await.unwrap();
45 
46     file.write_all(HELLO).await.unwrap();
47     file.shutdown().await.unwrap();
48 
49     let file = std::fs::read(tempfile.path()).unwrap();
50     assert_eq!(file, HELLO);
51 }
52 
53 #[tokio::test]
coop()54 async fn coop() {
55     let mut tempfile = tempfile();
56     tempfile.write_all(HELLO).unwrap();
57 
58     let mut task = task::spawn(async {
59         let mut file = File::open(tempfile.path()).await.unwrap();
60 
61         let mut buf = [0; 1024];
62 
63         loop {
64             file.read(&mut buf).await.unwrap();
65             file.seek(std::io::SeekFrom::Start(0)).await.unwrap();
66         }
67     });
68 
69     for _ in 0..1_000 {
70         if task.poll().is_pending() {
71             return;
72         }
73     }
74 
75     panic!("did not yield");
76 }
77 
tempfile() -> NamedTempFile78 fn tempfile() -> NamedTempFile {
79     NamedTempFile::new().unwrap()
80 }
81 
82 #[tokio::test]
83 #[cfg(unix)]
unix_fd()84 async fn unix_fd() {
85     use std::os::unix::io::AsRawFd;
86     let tempfile = tempfile();
87 
88     let file = File::create(tempfile.path()).await.unwrap();
89     assert!(file.as_raw_fd() as u64 > 0);
90 }
91 
92 #[tokio::test]
93 #[cfg(windows)]
windows_handle()94 async fn windows_handle() {
95     use std::os::windows::io::AsRawHandle;
96     let tempfile = tempfile();
97 
98     let file = File::create(tempfile.path()).await.unwrap();
99     assert!(file.as_raw_handle() as u64 > 0);
100 }
101