From 5810b9424dc2b1845dd318b0d3b082883f64069b Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Wed, 11 Oct 2017 19:11:12 -0600 Subject: [PATCH] Add a test for ppoll --- test/test_poll.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/test_poll.rs b/test/test_poll.rs index 6d30f26525..a48604f9f7 100644 --- a/test/test_poll.rs +++ b/test/test_poll.rs @@ -1,4 +1,6 @@ use nix::poll::*; +use nix::sys::signal::SigSet; +use nix::sys::time::{TimeSpec, TimeValLike}; use nix::unistd::{write, pipe}; #[test] @@ -6,13 +8,41 @@ fn test_poll() { let (r, w) = pipe().unwrap(); let mut fds = [PollFd::new(r, POLLIN)]; + // Poll an idle pipe. Should timeout let nfds = poll(&mut fds, 100).unwrap(); assert_eq!(nfds, 0); assert!(!fds[0].revents().unwrap().contains(POLLIN)); write(w, b".").unwrap(); + // Poll a readable pipe. Should return an event. let nfds = poll(&mut fds, 100).unwrap(); assert_eq!(nfds, 1); assert!(fds[0].revents().unwrap().contains(POLLIN)); } + +// ppoll(2) is the same as poll except for how it handles timeouts and signals. +// Repeating the test for poll(2) should be sufficient to check that our +// bindings are correct. +#[cfg(any(target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "linux"))] +#[test] +fn test_ppoll() { + let timeout = TimeSpec::milliseconds(1); + let (r, w) = pipe().unwrap(); + let mut fds = [PollFd::new(r, POLLIN)]; + + // Poll an idle pipe. Should timeout + let nfds = ppoll(&mut fds, timeout, SigSet::empty()).unwrap(); + assert_eq!(nfds, 0); + assert!(!fds[0].revents().unwrap().contains(POLLIN)); + + write(w, b".").unwrap(); + + // Poll a readable pipe. Should return an event. + let nfds = ppoll(&mut fds, timeout, SigSet::empty()).unwrap(); + assert_eq!(nfds, 1); + assert!(fds[0].revents().unwrap().contains(POLLIN)); +}