device/poller: add unit tests for Waker
diff --git a/lib/src/device/poller.rs b/lib/src/device/poller.rs
index f0cf1f2..42648d7 100644
--- a/lib/src/device/poller.rs
+++ b/lib/src/device/poller.rs
@@ -355,9 +355,57 @@
#[cfg(test)]
mod tests {
+ use std::os::fd::AsFd;
+
use super::{DeviceEvent::*, PollEvent, PollEvents, Waker};
use super::{DEVICE_ID, FIRST_WAKER_ID};
- use nix::sys::epoll::{EpollEvent, EpollFlags};
+ use nix::sys::epoll::{Epoll, EpollCreateFlags, EpollEvent, EpollFlags};
+
+ #[test]
+ fn test_waker() {
+ let waker = Waker::new().unwrap();
+ let epoll = Epoll::new(EpollCreateFlags::empty()).unwrap();
+ let mut event = [EpollEvent::empty()];
+
+ epoll
+ .add(
+ waker.fd.as_fd(),
+ EpollEvent::new(EpollFlags::EPOLLIN, FIRST_WAKER_ID),
+ )
+ .unwrap();
+
+ // Waker should initially not be signaled.
+ let nb_events = epoll.wait(&mut event, 0).unwrap();
+ assert_eq!(nb_events, 0);
+
+ // Waking up should signal.
+ waker.wake_direct().unwrap();
+ let nb_events = epoll.wait(&mut event, 0).unwrap();
+ assert_eq!(nb_events, 1);
+ assert_eq!(
+ event[0],
+ EpollEvent::new(EpollFlags::EPOLLIN, FIRST_WAKER_ID)
+ );
+
+ // Waking up twice should still signal.
+ waker.wake_direct().unwrap();
+ let nb_events = epoll.wait(&mut event, 0).unwrap();
+ assert_eq!(nb_events, 1);
+ assert_eq!(
+ event[0],
+ EpollEvent::new(EpollFlags::EPOLLIN, FIRST_WAKER_ID)
+ );
+
+ // Calling reset should stop signaling.
+ waker.reset().unwrap();
+ let nb_events = epoll.wait(&mut event, 0).unwrap();
+ assert_eq!(nb_events, 0);
+
+ // Calling reset while at rest should be a no-op.
+ waker.reset().unwrap();
+ let nb_events = epoll.wait(&mut event, 0).unwrap();
+ assert_eq!(nb_events, 0);
+ }
#[test]
fn test_pollevents_iterator() {