use nix::sys::time::{TimeSpec, TimeValLike}; use nix::sys::timerfd::{ ClockId, Expiration, TimerFd, TimerFlags, TimerSetTimeFlags, }; use std::time::Instant; #[test] pub fn test_timerfd_oneshot() { let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap(); let before = Instant::now(); timer .set( Expiration::OneShot(TimeSpec::seconds(1)), TimerSetTimeFlags::empty(), ) .unwrap(); timer.wait().unwrap(); let millis = before.elapsed().as_millis(); assert!(millis > 900); } #[test] pub fn test_timerfd_interval() { let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap(); let before = Instant::now(); timer .set( Expiration::IntervalDelayed( TimeSpec::seconds(1), TimeSpec::seconds(2), ), TimerSetTimeFlags::empty(), ) .unwrap(); timer.wait().unwrap(); let start_delay = before.elapsed().as_millis(); assert!(start_delay > 900); timer.wait().unwrap(); let interval_delay = before.elapsed().as_millis(); assert!(interval_delay > 2900); } #[test] pub fn test_timerfd_unset() { let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap(); timer .set( Expiration::OneShot(TimeSpec::seconds(1)), TimerSetTimeFlags::empty(), ) .unwrap(); timer.unset().unwrap(); assert!(timer.get().unwrap().is_none()); }