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