use std::io::prelude::*;
use completeio::fs::File;
use tempfile::NamedTempFile;
const HELLO: &[u8] = b"hello world...";
async fn read_hello(file: &File) {
let buf = Vec::with_capacity(1024);
let (res, buf) = file.read_to_end_at(buf, 0).await;
let n = res.unwrap();
assert_eq!(n, HELLO.len());
assert_eq!(&buf, HELLO);
}
#[test]
fn basic_read() {
completeio::task::block_on(async {
let mut tempfile = tempfile();
tempfile.write_all(HELLO).unwrap();
let file = File::open(tempfile.path()).unwrap();
read_hello(&file).await;
});
}
#[test]
fn basic_write() {
completeio::task::block_on(async {
let tempfile = tempfile();
let file = File::create(tempfile.path()).unwrap();
file.write_all_at(HELLO, 0).await.0.unwrap();
file.sync_all().await.unwrap();
let file = std::fs::read(tempfile.path()).unwrap();
assert_eq!(file, HELLO);
});
}
#[test]
fn cancel_read() {
completeio::task::block_on(async {
let mut tempfile = tempfile();
tempfile.write_all(HELLO).unwrap();
let file = File::open(tempfile.path()).unwrap();
poll_once(async { read_hello(&file).await }).await;
read_hello(&file).await;
});
}
#[test]
fn drop_open() {
completeio::task::block_on(async {
let tempfile = tempfile();
let _ = File::create(tempfile.path());
let file = File::create(tempfile.path()).unwrap();
file.write_all_at(HELLO, 0).await.0.unwrap();
let file = std::fs::read(tempfile.path()).unwrap();
assert_eq!(file, HELLO);
});
}
fn tempfile() -> NamedTempFile {
NamedTempFile::new().unwrap()
}
async fn poll_once(future: impl std::future::Future) {
use std::{future::poll_fn, pin::pin, task::Poll};
let mut future = pin!(future);
poll_fn(|cx| {
assert!(future.as_mut().poll(cx).is_pending());
Poll::Ready(())
})
.await;
}