1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
#![allow(clippy::needless_range_loop)]
use std::io::{Cursor, SeekFrom};
use std::panic::AssertUnwindSafe;
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);
})
}
#[test]
fn panic() {
future::block_on(async {
let x = unblock(|| panic!("expected failure"));
let panic = x.catch_unwind().await.unwrap_err();
// Make sure it's our panic and not an unrelated one.
let msg = if let Some(msg) = panic.downcast_ref::<&'static str>() {
msg.to_string()
} else {
*panic.downcast::<String>().unwrap()
};
assert_eq!(msg, "expected failure");
});
}
#[test]
fn panic_with_mut() {
future::block_on(async {
let mut io = Unblock::new(());
let x = io.with_mut(|()| panic!("expected failure"));
let panic = AssertUnwindSafe(x).catch_unwind().await.unwrap_err();
// Make sure it's our panic and not an unrelated one.
let msg = if let Some(msg) = panic.downcast_ref::<&'static str>() {
msg.to_string()
} else {
*panic.downcast::<String>().unwrap()
};
assert_eq!(
msg,
"`Unblock::with_mut()` operation has panicked: RecvError"
);
});
}
|