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 | |