1 use nix::poll::{PollFlags, poll, PollFd};
2 use nix::unistd::{write, pipe};
3
4 #[test]
test_poll()5 fn test_poll() {
6 let (r, w) = pipe().unwrap();
7 let mut fds = [PollFd::new(r, PollFlags::POLLIN)];
8
9 // Poll an idle pipe. Should timeout
10 let nfds = poll(&mut fds, 100).unwrap();
11 assert_eq!(nfds, 0);
12 assert!(!fds[0].revents().unwrap().contains(PollFlags::POLLIN));
13
14 write(w, b".").unwrap();
15
16 // Poll a readable pipe. Should return an event.
17 let nfds = poll(&mut fds, 100).unwrap();
18 assert_eq!(nfds, 1);
19 assert!(fds[0].revents().unwrap().contains(PollFlags::POLLIN));
20 }
21
22 // ppoll(2) is the same as poll except for how it handles timeouts and signals.
23 // Repeating the test for poll(2) should be sufficient to check that our
24 // bindings are correct.
25 #[cfg(any(target_os = "android",
26 target_os = "dragonfly",
27 target_os = "freebsd",
28 target_os = "linux"))]
29 #[test]
test_ppoll()30 fn test_ppoll() {
31 use nix::poll::ppoll;
32 use nix::sys::signal::SigSet;
33 use nix::sys::time::{TimeSpec, TimeValLike};
34
35 let timeout = TimeSpec::milliseconds(1);
36 let (r, w) = pipe().unwrap();
37 let mut fds = [PollFd::new(r, PollFlags::POLLIN)];
38
39 // Poll an idle pipe. Should timeout
40 let nfds = ppoll(&mut fds, Some(timeout), SigSet::empty()).unwrap();
41 assert_eq!(nfds, 0);
42 assert!(!fds[0].revents().unwrap().contains(PollFlags::POLLIN));
43
44 write(w, b".").unwrap();
45
46 // Poll a readable pipe. Should return an event.
47 let nfds = ppoll(&mut fds, Some(timeout), SigSet::empty()).unwrap();
48 assert_eq!(nfds, 1);
49 assert!(fds[0].revents().unwrap().contains(PollFlags::POLLIN));
50 }
51