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]
test_timerfd_oneshot()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]
test_timerfd_interval()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]
test_timerfd_unset()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