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