1 use nix::sys::time::{TimeSpec, TimeValLike}; 2 use nix::sys::timerfd::{ClockId, Expiration, TimerFd, TimerFlags, TimerSetTimeFlags}; 3 use std::time::Instant; 4 5 #[test] 6 pub fn test_timerfd_oneshot() { 7 let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap(); 8 9 let before = Instant::now(); 10 11 timer 12 .set( 13 Expiration::OneShot(TimeSpec::seconds(1)), 14 TimerSetTimeFlags::empty(), 15 ) 16 .unwrap(); 17 18 timer.wait().unwrap(); 19 20 let millis = before.elapsed().as_millis(); 21 assert!(millis > 900); 22 } 23 24 #[test] 25 pub fn test_timerfd_interval() { 26 let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap(); 27 28 let before = Instant::now(); 29 timer 30 .set( 31 Expiration::IntervalDelayed(TimeSpec::seconds(1), TimeSpec::seconds(2)), 32 TimerSetTimeFlags::empty(), 33 ) 34 .unwrap(); 35 36 timer.wait().unwrap(); 37 38 let start_delay = before.elapsed().as_millis(); 39 assert!(start_delay > 900); 40 41 timer.wait().unwrap(); 42 43 let interval_delay = before.elapsed().as_millis(); 44 assert!(interval_delay > 2900); 45 } 46 47 #[test] 48 pub fn test_timerfd_unset() { 49 let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap(); 50 51 timer 52 .set( 53 Expiration::OneShot(TimeSpec::seconds(1)), 54 TimerSetTimeFlags::empty(), 55 ) 56 .unwrap(); 57 58 timer.unset().unwrap(); 59 60 assert!(timer.get().unwrap() == None); 61 } 62