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