1 use mio
::{Events, Poll, PollOpt, Ready, Token}
;
2 use mio_extras
::timer
::{self, Timer}
;
5 use std
::time
::Duration
;
8 fn test_basic_timer_without_poll() {
9 let mut timer
= Timer
::default();
12 timer
.set_timeout(Duration
::from_millis(200), "hello");
14 // Nothing when polled immediately
15 assert
!(timer
.poll().is_none());
17 // Wait for the timeout
18 thread
::sleep(Duration
::from_millis(250));
20 assert_eq
!(Some("hello"), timer
.poll());
21 assert
!(timer
.poll().is_none());
25 fn test_basic_timer_with_poll_edge_set_timeout_after_register() {
26 let poll
= Poll
::new().unwrap();
27 let mut events
= Events
::with_capacity(1024);
28 let mut timer
= Timer
::default();
30 poll
.register(&timer
, Token(0), Ready
::readable(), PollOpt
::edge())
32 timer
.set_timeout(Duration
::from_millis(200), "hello");
34 let elapsed
= elapsed(|| {
35 let num
= poll
.poll(&mut events
, None
).unwrap();
38 let event
= events
.iter().next().unwrap();
39 assert_eq
!(Token(0), event
.token());
40 assert_eq
!(Ready
::readable(), event
.readiness());
43 assert
!(is_about(200, elapsed
), "actual={:?}", elapsed
);
44 assert_eq
!("hello", timer
.poll().unwrap());
45 assert_eq
!(None
, timer
.poll());
49 fn test_basic_timer_with_poll_edge_set_timeout_before_register() {
50 let poll
= Poll
::new().unwrap();
51 let mut events
= Events
::with_capacity(1024);
52 let mut timer
= Timer
::default();
54 timer
.set_timeout(Duration
::from_millis(200), "hello");
55 poll
.register(&timer
, Token(0), Ready
::readable(), PollOpt
::edge())
58 let elapsed
= elapsed(|| {
59 let num
= poll
.poll(&mut events
, None
).unwrap();
62 let event
= events
.iter().next().unwrap();
63 assert_eq
!(Token(0), event
.token());
64 assert_eq
!(Ready
::readable(), event
.readiness());
67 assert
!(is_about(200, elapsed
), "actual={:?}", elapsed
);
68 assert_eq
!("hello", timer
.poll().unwrap());
69 assert_eq
!(None
, timer
.poll());
73 fn test_setting_later_timeout_then_earlier_one() {
74 let poll
= Poll
::new().unwrap();
75 let mut events
= Events
::with_capacity(1024);
76 let mut timer
= Timer
::default();
78 poll
.register(&timer
, Token(0), Ready
::readable(), PollOpt
::edge())
81 timer
.set_timeout(Duration
::from_millis(600), "hello");
82 timer
.set_timeout(Duration
::from_millis(200), "world");
84 let elapsed
= elapsed(|| {
85 let num
= poll
.poll(&mut events
, None
).unwrap();
88 let event
= events
.iter().next().unwrap();
89 assert_eq
!(Token(0), event
.token());
90 assert_eq
!(Ready
::readable(), event
.readiness());
93 assert
!(is_about(200, elapsed
), "actual={:?}", elapsed
);
94 assert_eq
!("world", timer
.poll().unwrap());
95 assert_eq
!(None
, timer
.poll());
97 let elapsed
= self::elapsed(|| {
98 let num
= poll
.poll(&mut events
, None
).unwrap();
101 let event
= events
.iter().next().unwrap();
102 assert_eq
!(Token(0), event
.token());
103 assert_eq
!(Ready
::readable(), event
.readiness());
106 assert
!(is_about(400, elapsed
), "actual={:?}", elapsed
);
107 assert_eq
!("hello", timer
.poll().unwrap());
108 assert_eq
!(None
, timer
.poll());
112 fn test_timer_with_looping_wheel() {
113 let poll
= Poll
::new().unwrap();
114 let mut events
= Events
::with_capacity(1024);
115 let mut timer
= timer
::Builder
::default().num_slots(2).build();
117 poll
.register(&timer
, Token(0), Ready
::readable(), PollOpt
::edge())
120 const TOKENS
: &[&str] = &["hello", "world", "some", "thing"];
122 for (i
, msg
) in TOKENS
.iter().enumerate() {
123 timer
.set_timeout(Duration
::from_millis(500 * (i
as u64 + 1)), msg
);
127 let elapsed
= elapsed(|| {
128 let num
= poll
.poll(&mut events
, None
).unwrap();
131 let event
= events
.iter().next().unwrap();
132 assert_eq
!(Token(0), event
.token());
133 assert_eq
!(Ready
::readable(), event
.readiness());
137 is_about(500, elapsed
),
138 "actual={:?}; msg={:?}",
142 assert_eq
!(Some(msg
), timer
.poll());
143 assert_eq
!(None
, timer
.poll());
148 fn test_edge_without_polling() {
149 let poll
= Poll
::new().unwrap();
150 let mut events
= Events
::with_capacity(1024);
151 let mut timer
= Timer
::default();
153 poll
.register(&timer
, Token(0), Ready
::readable(), PollOpt
::edge())
156 timer
.set_timeout(Duration
::from_millis(400), "hello");
158 let ms
= elapsed(|| {
159 let num
= poll
.poll(&mut events
, None
).unwrap();
161 let event
= events
.iter().next().unwrap();
162 assert_eq
!(Token(0), event
.token());
163 assert_eq
!(Ready
::readable(), event
.readiness());
166 assert
!(is_about(400, ms
), "actual={:?}", ms
);
168 let ms
= elapsed(|| {
170 .poll(&mut events
, Some(Duration
::from_millis(300)))
175 assert
!(is_about(300, ms
), "actual={:?}", ms
);
179 fn test_level_triggered() {
180 let poll
= Poll
::new().unwrap();
181 let mut events
= Events
::with_capacity(1024);
182 let mut timer
= Timer
::default();
184 poll
.register(&timer
, Token(0), Ready
::readable(), PollOpt
::level())
187 timer
.set_timeout(Duration
::from_millis(400), "hello");
189 let ms
= elapsed(|| {
190 let num
= poll
.poll(&mut events
, None
).unwrap();
192 let event
= events
.iter().next().unwrap();
193 assert_eq
!(Token(0), event
.token());
194 assert_eq
!(Ready
::readable(), event
.readiness());
197 assert
!(is_about(400, ms
), "actual={:?}", ms
);
199 let ms
= elapsed(|| {
200 let num
= poll
.poll(&mut events
, None
).unwrap();
202 let event
= events
.iter().next().unwrap();
203 assert_eq
!(Token(0), event
.token());
204 assert_eq
!(Ready
::readable(), event
.readiness());
207 assert
!(is_about(0, ms
), "actual={:?}", ms
);
211 fn test_edge_oneshot_triggered() {
212 let poll
= Poll
::new().unwrap();
213 let mut events
= Events
::with_capacity(1024);
214 let mut timer
= Timer
::default();
220 PollOpt
::edge() | PollOpt
::oneshot(),
224 timer
.set_timeout(Duration
::from_millis(200), "hello");
226 let ms
= elapsed(|| {
227 let num
= poll
.poll(&mut events
, None
).unwrap();
231 assert
!(is_about(200, ms
), "actual={:?}", ms
);
233 let ms
= elapsed(|| {
235 .poll(&mut events
, Some(Duration
::from_millis(300)))
240 assert
!(is_about(300, ms
), "actual={:?}", ms
);
246 PollOpt
::edge() | PollOpt
::oneshot(),
250 let ms
= elapsed(|| {
251 let num
= poll
.poll(&mut events
, None
).unwrap();
255 assert
!(is_about(0, ms
));
259 fn test_cancel_timeout() {
260 use std
::time
::Instant
;
262 let mut timer
: Timer
<u32> = Default
::default();
263 let timeout
= timer
.set_timeout(Duration
::from_millis(200), 1);
264 timer
.cancel_timeout(&timeout
);
266 let poll
= Poll
::new().unwrap();
267 poll
.register(&timer
, Token(0), Ready
::readable(), PollOpt
::edge())
270 let mut events
= Events
::with_capacity(16);
272 let now
= Instant
::now();
273 let dur
= Duration
::from_millis(500);
276 while Instant
::now() - now
< dur
{
278 panic
!("iterated too many times");
283 let elapsed
= Instant
::now() - now
;
285 poll
.poll(&mut events
, Some(dur
- elapsed
)).unwrap();
287 while let Some(_
) = timer
.poll() {
288 panic
!("did not expect to receive timeout");
293 fn elapsed
<F
: FnMut()>(mut f
: F
) -> u64 {
294 use std
::time
::Instant
;
296 let now
= Instant
::now();
300 let elapsed
= now
.elapsed();
301 elapsed
.as_secs() * 1000 + u64::from(elapsed
.subsec_millis())
304 fn is_about(expect
: u64, val
: u64) -> bool
{
305 const WINDOW
: i64 = 200;
307 ((expect
as i64) - (val
as i64)).abs() <= WINDOW