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()14async 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()28async 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()41async 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()54async 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() -> NamedTempFile78fn tempfile() -> NamedTempFile { 79 NamedTempFile::new().unwrap() 80 } 81 82 #[tokio::test] 83 #[cfg(unix)] unix_fd()84async 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()94async 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