blob: 96a78883b202444bb16804044492c842da725d59 [file] [log] [blame]
#![allow(clippy::needless_range_loop)]
use std::io::{Cursor, SeekFrom};
use std::sync::mpsc;
use std::thread;
use std::time::{Duration, Instant};
use blocking::{unblock, Unblock};
use futures_lite::{future, pin, prelude::*};
#[test]
fn sleep() {
let dur = Duration::from_secs(1);
let start = Instant::now();
future::block_on(async {
let f = unblock(move || thread::sleep(dur));
pin!(f);
assert!(future::poll_once(&mut f).await.is_none());
f.await;
});
assert!(start.elapsed() >= dur);
}
#[test]
fn chan() {
const N: i32 = if cfg!(miri) { 50 } else { 100_000 };
future::block_on(async {
let (s, r) = mpsc::sync_channel::<i32>(100);
let handle = thread::spawn(move || {
for i in 0..N {
s.send(i).unwrap();
}
});
let mut r = Unblock::new(r.into_iter());
for i in 0..N {
assert_eq!(r.next().await, Some(i));
}
handle.join().unwrap();
assert!(r.next().await.is_none());
})
}
#[test]
fn read() {
const N: usize = if cfg!(miri) { 20_000 } else { 20_000_000 };
future::block_on(async {
let mut v1 = vec![0u8; N];
for i in 0..v1.len() {
v1[i] = i as u8;
}
let mut v1 = Unblock::new(Cursor::new(v1));
let mut v2 = vec![];
v1.read_to_end(&mut v2).await.unwrap();
let v1 = v1.into_inner().await.into_inner();
assert!(v1 == v2);
})
}
#[test]
fn write() {
const N: usize = if cfg!(miri) { 20_000 } else { 20_000_000 };
future::block_on(async {
let mut v1 = vec![0u8; N];
for i in 0..v1.len() {
v1[i] = i as u8;
}
let v2 = vec![];
let mut v2 = Unblock::new(Cursor::new(v2));
v2.write_all(&v1).await.unwrap();
let v2 = v2.into_inner().await.into_inner();
assert!(v1 == v2);
})
}
#[test]
fn seek() {
future::block_on(async {
let len = 1_000;
let mut v = vec![0u8; len];
for i in 0..len {
v[i] = i as u8;
}
let mut v = Unblock::new(Cursor::new(v));
assert_eq!(v.seek(SeekFrom::Current(7i64)).await.unwrap(), 7);
assert_eq!(v.seek(SeekFrom::Current(8i64)).await.unwrap(), 15);
let mut byte = [0u8];
v.read(&mut byte).await.unwrap();
assert_eq!(byte[0], 15);
})
}