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