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