1 use nix::sys::select::*;
2 use nix::unistd::{pipe, write};
3 use nix::sys::signal::SigSet;
4 use nix::sys::time::{TimeSpec, TimeValLike};
5 
6 #[test]
test_pselect()7 pub fn test_pselect() {
8     let _mtx = crate::SIGNAL_MTX.lock();
9 
10     let (r1, w1) = pipe().unwrap();
11     write(w1, b"hi!").unwrap();
12     let (r2, _w2) = pipe().unwrap();
13 
14     let mut fd_set = FdSet::new();
15     fd_set.insert(r1);
16     fd_set.insert(r2);
17 
18     let timeout = TimeSpec::seconds(10);
19     let sigmask = SigSet::empty();
20     assert_eq!(
21         1,
22         pselect(None, &mut fd_set, None, None, &timeout, &sigmask).unwrap()
23     );
24     assert!(fd_set.contains(r1));
25     assert!(!fd_set.contains(r2));
26 }
27 
28 #[test]
test_pselect_nfds2()29 pub fn test_pselect_nfds2() {
30     let (r1, w1) = pipe().unwrap();
31     write(w1, b"hi!").unwrap();
32     let (r2, _w2) = pipe().unwrap();
33 
34     let mut fd_set = FdSet::new();
35     fd_set.insert(r1);
36     fd_set.insert(r2);
37 
38     let timeout = TimeSpec::seconds(10);
39     assert_eq!(
40         1,
41         pselect(
42             ::std::cmp::max(r1, r2) + 1,
43             &mut fd_set,
44             None,
45             None,
46             &timeout,
47             None
48         ).unwrap()
49     );
50     assert!(fd_set.contains(r1));
51     assert!(!fd_set.contains(r2));
52 }
53 
54 macro_rules! generate_fdset_bad_fd_tests {
55     ($fd:expr, $($method:ident),* $(,)?) => {
56         $(
57             #[test]
58             #[should_panic]
59             fn $method() {
60                 FdSet::new().$method($fd);
61             }
62         )*
63     }
64 }
65 
66 mod test_fdset_negative_fd {
67     use super::*;
68     generate_fdset_bad_fd_tests!(-1, insert, remove, contains);
69 }
70 
71 mod test_fdset_too_large_fd {
72     use super::*;
73     use std::convert::TryInto;
74     generate_fdset_bad_fd_tests!(
75         FD_SETSIZE.try_into().unwrap(),
76         insert,
77         remove,
78         contains,
79     );
80 }
81