13da5c369Sopenharmony_ciuse nix::sys::select::*;
23da5c369Sopenharmony_ciuse nix::sys::signal::SigSet;
33da5c369Sopenharmony_ciuse nix::sys::time::{TimeSpec, TimeValLike};
43da5c369Sopenharmony_ciuse nix::unistd::{pipe, write};
53da5c369Sopenharmony_ci
63da5c369Sopenharmony_ci#[test]
73da5c369Sopenharmony_cipub fn test_pselect() {
83da5c369Sopenharmony_ci    let _mtx = crate::SIGNAL_MTX.lock();
93da5c369Sopenharmony_ci
103da5c369Sopenharmony_ci    let (r1, w1) = pipe().unwrap();
113da5c369Sopenharmony_ci    write(w1, b"hi!").unwrap();
123da5c369Sopenharmony_ci    let (r2, _w2) = pipe().unwrap();
133da5c369Sopenharmony_ci
143da5c369Sopenharmony_ci    let mut fd_set = FdSet::new();
153da5c369Sopenharmony_ci    fd_set.insert(r1);
163da5c369Sopenharmony_ci    fd_set.insert(r2);
173da5c369Sopenharmony_ci
183da5c369Sopenharmony_ci    let timeout = TimeSpec::seconds(10);
193da5c369Sopenharmony_ci    let sigmask = SigSet::empty();
203da5c369Sopenharmony_ci    assert_eq!(
213da5c369Sopenharmony_ci        1,
223da5c369Sopenharmony_ci        pselect(None, &mut fd_set, None, None, &timeout, &sigmask).unwrap()
233da5c369Sopenharmony_ci    );
243da5c369Sopenharmony_ci    assert!(fd_set.contains(r1));
253da5c369Sopenharmony_ci    assert!(!fd_set.contains(r2));
263da5c369Sopenharmony_ci}
273da5c369Sopenharmony_ci
283da5c369Sopenharmony_ci#[test]
293da5c369Sopenharmony_cipub fn test_pselect_nfds2() {
303da5c369Sopenharmony_ci    let (r1, w1) = pipe().unwrap();
313da5c369Sopenharmony_ci    write(w1, b"hi!").unwrap();
323da5c369Sopenharmony_ci    let (r2, _w2) = pipe().unwrap();
333da5c369Sopenharmony_ci
343da5c369Sopenharmony_ci    let mut fd_set = FdSet::new();
353da5c369Sopenharmony_ci    fd_set.insert(r1);
363da5c369Sopenharmony_ci    fd_set.insert(r2);
373da5c369Sopenharmony_ci
383da5c369Sopenharmony_ci    let timeout = TimeSpec::seconds(10);
393da5c369Sopenharmony_ci    assert_eq!(
403da5c369Sopenharmony_ci        1,
413da5c369Sopenharmony_ci        pselect(
423da5c369Sopenharmony_ci            ::std::cmp::max(r1, r2) + 1,
433da5c369Sopenharmony_ci            &mut fd_set,
443da5c369Sopenharmony_ci            None,
453da5c369Sopenharmony_ci            None,
463da5c369Sopenharmony_ci            &timeout,
473da5c369Sopenharmony_ci            None
483da5c369Sopenharmony_ci        )
493da5c369Sopenharmony_ci        .unwrap()
503da5c369Sopenharmony_ci    );
513da5c369Sopenharmony_ci    assert!(fd_set.contains(r1));
523da5c369Sopenharmony_ci    assert!(!fd_set.contains(r2));
533da5c369Sopenharmony_ci}
543da5c369Sopenharmony_ci
553da5c369Sopenharmony_cimacro_rules! generate_fdset_bad_fd_tests {
563da5c369Sopenharmony_ci    ($fd:expr, $($method:ident),* $(,)?) => {
573da5c369Sopenharmony_ci        $(
583da5c369Sopenharmony_ci            #[test]
593da5c369Sopenharmony_ci            #[should_panic]
603da5c369Sopenharmony_ci            fn $method() {
613da5c369Sopenharmony_ci                FdSet::new().$method($fd);
623da5c369Sopenharmony_ci            }
633da5c369Sopenharmony_ci        )*
643da5c369Sopenharmony_ci    }
653da5c369Sopenharmony_ci}
663da5c369Sopenharmony_ci
673da5c369Sopenharmony_cimod test_fdset_negative_fd {
683da5c369Sopenharmony_ci    use super::*;
693da5c369Sopenharmony_ci    generate_fdset_bad_fd_tests!(-1, insert, remove, contains);
703da5c369Sopenharmony_ci}
713da5c369Sopenharmony_ci
723da5c369Sopenharmony_cimod test_fdset_too_large_fd {
733da5c369Sopenharmony_ci    use super::*;
743da5c369Sopenharmony_ci    use std::convert::TryInto;
753da5c369Sopenharmony_ci    generate_fdset_bad_fd_tests!(
763da5c369Sopenharmony_ci        FD_SETSIZE.try_into().unwrap(),
773da5c369Sopenharmony_ci        insert,
783da5c369Sopenharmony_ci        remove,
793da5c369Sopenharmony_ci        contains,
803da5c369Sopenharmony_ci    );
813da5c369Sopenharmony_ci}
82