#[cfg(unix)]
fn main() {
for test in self::test::TESTS {
test();
self::test::reset_mask();
}
}
#[cfg(not(unix))]
fn main() {}
#[cfg(unix)]
mod test {
extern crate calloop;
extern crate nix;
use std::time::Duration;
use self::calloop::signals::{Signal, Signals};
use self::calloop::EventLoop;
use self::nix::sys::signal::{kill, SigSet};
use self::nix::unistd::Pid;
pub const TESTS: &'static [fn()] = &[single_usr1, usr2_added_afterwards, usr2_signal_removed];
pub fn reset_mask() {
SigSet::empty().thread_set_mask().unwrap();
}
fn single_usr1() {
let mut event_loop = EventLoop::new().unwrap();
let mut signal_received = false;
let _signal_source = event_loop
.handle()
.insert_source(
Signals::new(&[Signal::SIGUSR1]).unwrap(),
move |evt, rcv| {
assert!(evt.signal() == Signal::SIGUSR1);
*rcv = true;
},
).unwrap();
kill(Pid::this(), Signal::SIGUSR1).unwrap();
event_loop
.dispatch(Some(Duration::from_millis(10)), &mut signal_received)
.unwrap();
assert!(signal_received);
}
fn usr2_added_afterwards() {
let mut event_loop = EventLoop::new().unwrap();
let mut signal_received = None;
let mut signal_source = event_loop
.handle()
.insert_source(
Signals::new(&[Signal::SIGUSR1]).unwrap(),
move |evt, rcv| {
*rcv = Some(evt.signal());
},
).unwrap();
signal_source.add_signals(&[Signal::SIGUSR2]).unwrap();
kill(Pid::this(), Signal::SIGUSR2).unwrap();
event_loop
.dispatch(Some(Duration::from_millis(10)), &mut signal_received)
.unwrap();
assert_eq!(signal_received, Some(Signal::SIGUSR2));
}
fn usr2_signal_removed() {
let mut event_loop = EventLoop::new().unwrap();
let mut signal_received = None;
let mut signal_source = event_loop
.handle()
.insert_source(
Signals::new(&[Signal::SIGUSR1, Signal::SIGUSR2]).unwrap(),
move |evt, rcv| {
*rcv = Some(evt.signal());
},
).unwrap();
signal_source.remove_signals(&[Signal::SIGUSR2]).unwrap();
let mut set = SigSet::empty();
set.add(Signal::SIGUSR2);
set.thread_block().unwrap();
kill(Pid::this(), Signal::SIGUSR2).unwrap();
event_loop
.dispatch(Some(Duration::from_millis(10)), &mut signal_received)
.unwrap();
assert!(signal_received.is_none());
signal_source.set_signals(&[Signal::SIGUSR2]).unwrap();
event_loop
.dispatch(Some(Duration::from_millis(10)), &mut signal_received)
.unwrap();
assert_eq!(signal_received, Some(Signal::SIGUSR2));
}
}