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()); }