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
|
#![cfg(unix)]
use async_signal::{Signal, Signals};
use futures_lite::{future, prelude::*};
#[test]
fn endurance() {
let user_signals = [Signal::Usr1, Signal::Usr2];
future::block_on(async {
let mut signals = Signals::new(user_signals).unwrap();
for &signal in user_signals.iter().cycle().take(100_000) {
let mut next = signals.next();
assert!(future::poll_once(&mut next).await.is_none());
unsafe {
libc::raise(signal as libc::c_int);
}
assert_eq!(
future::poll_once(&mut next)
.await
.unwrap()
.unwrap()
.unwrap(),
signal
);
}
});
}
#[test]
fn distanced() {
let mut signals = Signals::new(Some(Signal::Alarm)).unwrap();
std::thread::spawn(|| {
future::block_on(async {
let mut rng = fastrand::Rng::new();
for _ in 0..1_000 {
unsafe {
libc::raise(Signal::Alarm as libc::c_int);
}
if rng.bool() {
async_io::Timer::after(std::time::Duration::from_millis(rng.u64(1..5))).await;
}
}
});
});
future::block_on(async {
for _ in 0..1_000 {
assert_eq!(signals.next().await.unwrap().unwrap(), Signal::Alarm);
}
assert!(future::poll_once(signals.next()).await.is_none());
});
}
|