1use nix::sys::select::*;
2use nix::sys::signal::SigSet;
3use nix::sys::time::{TimeSpec, TimeValLike};
4use nix::unistd::{pipe, write};
5
6#[test]
7pub 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]
29pub 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        )
49        .unwrap()
50    );
51    assert!(fd_set.contains(r1));
52    assert!(!fd_set.contains(r2));
53}
54
55macro_rules! generate_fdset_bad_fd_tests {
56    ($fd:expr, $($method:ident),* $(,)?) => {
57        $(
58            #[test]
59            #[should_panic]
60            fn $method() {
61                FdSet::new().$method($fd);
62            }
63        )*
64    }
65}
66
67mod test_fdset_negative_fd {
68    use super::*;
69    generate_fdset_bad_fd_tests!(-1, insert, remove, contains);
70}
71
72mod test_fdset_too_large_fd {
73    use super::*;
74    use std::convert::TryInto;
75    generate_fdset_bad_fd_tests!(
76        FD_SETSIZE.try_into().unwrap(),
77        insert,
78        remove,
79        contains,
80    );
81}
82