Files
tokio/tokio-timer/tests/delay.rs
T

540 lines
14 KiB
Rust
Raw Normal View History

2019-05-14 10:27:36 -07:00
#![deny(warnings, rust_2018_idioms)]
2019-06-30 08:48:53 -07:00
#![feature(async_await)]
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
use tokio_test::task::MockTask;
use tokio_test::{assert_pending, assert_ready, clock};
use tokio_timer::timer::Handle;
use tokio_timer::Delay;
2018-03-28 22:26:47 -07:00
use std::time::{Duration, Instant};
#[test]
2018-03-30 14:21:48 -07:00
fn immediate_delay() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create `Delay` that elapsed immediately.
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now());
2018-03-28 22:26:47 -07:00
// Ready!
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
// Turn the timer, it runs for the elapsed time
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
2018-03-28 22:26:47 -07:00
// The time has not advanced. The `turn` completed immediately.
2019-06-30 08:48:53 -07:00
assert_eq!(clock.advanced(), ms(1000));
2018-03-28 22:26:47 -07:00
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn delayed_delay_level_0() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
2018-03-28 22:26:47 -07:00
for &i in &[1, 10, 60] {
2019-06-30 08:48:53 -07:00
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create a `Delay` that elapses in the future
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(i));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed.
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(i));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
}
#[test]
2018-03-30 14:21:48 -07:00
fn sub_ms_delayed_delay() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-28 22:26:47 -07:00
for _ in 0..5 {
2019-06-30 08:48:53 -07:00
let deadline = clock.now() + Duration::from_millis(1) + Duration::new(0, 1);
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
let mut delay = Delay::new(deadline);
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert!(clock.now() >= deadline);
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.advance(Duration::new(0, 1));
2018-03-28 22:26:47 -07:00
}
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn delayed_delay_wrapping_level_0() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
clock.turn_for(ms(5));
assert_eq!(clock.advanced(), ms(5));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(60));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(64));
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(65));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
#[test]
fn timer_wrapping_with_higher_levels() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Set delay to hit level 1
2019-06-30 08:48:53 -07:00
let mut s1 = Delay::new(clock.now() + ms(64));
assert_pending!(task.poll(&mut s1));
2018-03-28 22:26:47 -07:00
// Turn a bit
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(5));
2018-03-28 22:26:47 -07:00
// Set timeout such that it will hit level 0, but wrap
2019-06-30 08:48:53 -07:00
let mut s2 = Delay::new(clock.now() + ms(60));
assert_pending!(task.poll(&mut s2));
2018-03-28 22:26:47 -07:00
// This should result in s1 firing
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(64));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut s1));
assert_pending!(task.poll(&mut s2));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(65));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut s2));
2018-03-28 22:26:47 -07:00
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn delay_with_deadline_in_past() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create `Delay` that elapsed immediately.
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() - ms(100));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// Even though the delay expires in the past, it is not ready yet
2018-03-28 22:26:47 -07:00
// because the timer must observe it.
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
// Turn the timer, it runs for the elapsed time
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
2018-03-28 22:26:47 -07:00
// The time has not advanced. The `turn` completed immediately.
2019-06-30 08:48:53 -07:00
assert_eq!(clock.advanced(), ms(1000));
2018-03-28 22:26:47 -07:00
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn delayed_delay_level_1() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create a `Delay` that elapses in the future
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(234));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed.
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
// Turn the timer, this will wake up to cascade the timer down.
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(192));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed.
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
// Turn the timer again
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(234));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has elapsed.
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
2019-06-30 08:48:53 -07:00
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create a `Delay` that elapses in the future
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(234));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed.
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
// Turn the timer with a smaller timeout than the cascade.
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(100));
assert_eq!(clock.advanced(), ms(100));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
// Turn the timer, this will wake up to cascade the timer down.
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(192));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed.
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
// Turn the timer again
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(234));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has elapsed.
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn creating_delay_outside_of_context() {
2018-03-28 22:26:47 -07:00
let now = Instant::now();
2018-03-30 14:21:48 -07:00
// This creates a delay outside of the context of a mock timer. This tests
2018-03-28 22:26:47 -07:00
// that it will still expire.
2018-03-30 14:21:48 -07:00
let mut delay = Delay::new(now + ms(500));
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock::mock_at(now, |clock| {
2018-03-30 14:21:48 -07:00
// This registers the delay with the timer
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
// Wait some time... the timer is cascading
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(448));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(500));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has elapsed
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
#[test]
fn concurrently_set_two_timers_second_one_shorter() {
2019-06-30 08:48:53 -07:00
let mut t1 = MockTask::new();
let mut t2 = MockTask::new();
clock::mock(|clock| {
let mut delay1 = Delay::new(clock.now() + ms(500));
let mut delay2 = Delay::new(clock.now() + ms(200));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed
2019-06-30 08:48:53 -07:00
assert_pending!(t1.poll(&mut delay1));
assert_pending!(t2.poll(&mut delay2));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// Delay until a cascade
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(192));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// Delay until the second timer.
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(200));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The shorter delay fires
2019-06-30 08:48:53 -07:00
assert_ready!(t2.poll(&mut delay2));
assert_pending!(t1.poll(&mut delay1));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(448));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(t1.poll(&mut delay1));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// Turn again, this time the time will advance to the second delay
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(500));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(t1.poll(&mut delay1));
2018-03-28 22:26:47 -07:00
})
}
#[test]
2018-03-30 14:21:48 -07:00
fn short_delay() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create a `Delay` that elapses in the future
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(1));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed.
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2018-05-08 14:44:17 -04:00
// Turn the timer, but not enough time will go by.
2019-06-30 08:48:53 -07:00
clock.turn();
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has elapsed.
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The time has advanced to the point of the delay elapsing.
2019-06-30 08:48:53 -07:00
assert_eq!(clock.advanced(), ms(1));
2018-03-28 22:26:47 -07:00
})
}
#[test]
2018-03-30 14:21:48 -07:00
fn sorta_long_delay() {
2018-03-28 22:26:47 -07:00
const MIN_5: u64 = 5 * 60 * 1000;
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create a `Delay` that elapses in the future
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(MIN_5));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed.
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-02-21 11:56:15 -08:00
let cascades = &[262_144, 262_144 + 9 * 4096, 262_144 + 9 * 4096 + 15 * 64];
2018-03-28 22:26:47 -07:00
for &elapsed in cascades {
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(elapsed));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
}
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(MIN_5));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has elapsed.
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
})
}
#[test]
2018-03-30 14:21:48 -07:00
fn very_long_delay() {
2018-03-28 22:26:47 -07:00
const MO_5: u64 = 5 * 30 * 24 * 60 * 60 * 1000;
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create a `Delay` that elapses in the future
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(MO_5));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has not elapsed.
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
let cascades = &[
12_884_901_888,
12_952_010_752,
12_959_875_072,
12_959_997_952,
];
for &elapsed in cascades {
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(elapsed));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
}
// Turn the timer, but not enough time will go by.
2019-06-30 08:48:53 -07:00
clock.turn();
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The time has advanced to the point of the delay elapsing.
2019-06-30 08:48:53 -07:00
assert_eq!(clock.advanced(), ms(MO_5));
2018-03-28 22:26:47 -07:00
2018-03-30 14:21:48 -07:00
// The delay has elapsed.
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
})
}
#[test]
2019-06-30 08:48:53 -07:00
#[should_panic]
2018-03-28 22:26:47 -07:00
fn greater_than_max() {
const YR_5: u64 = 5 * 365 * 24 * 60 * 60 * 1000;
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-30 14:21:48 -07:00
// Create a `Delay` that elapses in the future
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(YR_5));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(0));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
// boom
let _ = task.poll(&mut delay);
2018-03-28 22:26:47 -07:00
})
}
#[test]
fn unpark_is_delayed() {
2019-06-30 08:48:53 -07:00
let mut t1 = MockTask::new();
let mut t2 = MockTask::new();
let mut t3 = MockTask::new();
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock::mock(|clock| {
let mut delay1 = Delay::new(clock.now() + ms(100));
let mut delay2 = Delay::new(clock.now() + ms(101));
let mut delay3 = Delay::new(clock.now() + ms(200));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(t1.poll(&mut delay1));
assert_pending!(t2.poll(&mut delay2));
assert_pending!(t3.poll(&mut delay3));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.park_for(ms(500));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_eq!(clock.advanced(), ms(500));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(t1.poll(&mut delay1));
assert_ready!(t2.poll(&mut delay2));
assert_ready!(t3.poll(&mut delay3));
2018-03-28 22:26:47 -07:00
})
}
#[test]
fn set_timeout_at_deadline_greater_than_max_timer() {
const YR_1: u64 = 365 * 24 * 60 * 60 * 1000;
const YR_5: u64 = 5 * YR_1;
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
2018-03-28 22:26:47 -07:00
for _ in 0..5 {
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(YR_1));
2018-03-28 22:26:47 -07:00
}
2019-06-30 08:48:53 -07:00
let mut delay = Delay::new(clock.now() + ms(1));
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(YR_5) + ms(1));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn reset_future_delay_before_fire() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
let mut delay = Delay::new(clock.now() + ms(100));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
delay.reset(clock.now() + ms(200));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(192));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(200));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn reset_past_delay_before_turn() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock::mock(|clock| {
let mut delay = Delay::new(clock.now() + ms(100));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
delay.reset(clock.now() + ms(80));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(64));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(80));
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn reset_past_delay_before_fire() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
let mut delay = Delay::new(clock.now() + ms(100));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
clock.turn_for(ms(10));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
delay.reset(clock.now() + ms(80));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(64));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(90));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
#[test]
2018-03-30 14:21:48 -07:00
fn reset_future_delay_after_fire() {
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
clock::mock(|clock| {
let mut delay = Delay::new(clock.now() + ms(100));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(64));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn();
assert_eq!(clock.advanced(), ms(100));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
delay.reset(clock.now() + ms(10));
assert_pending!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1000));
assert_eq!(clock.advanced(), ms(110));
2018-03-28 22:26:47 -07:00
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
2018-03-28 22:26:47 -07:00
});
}
#[test]
fn delay_with_default_handle() {
let handle = Handle::default();
let now = Instant::now();
2019-06-30 08:48:53 -07:00
let mut task = MockTask::new();
let mut delay = handle.delay(now + ms(1));
2019-06-30 08:48:53 -07:00
clock::mock_at(now, |clock| {
assert_pending!(task.poll(&mut delay));
2019-06-30 08:48:53 -07:00
clock.turn_for(ms(1));
2019-06-30 08:48:53 -07:00
assert_ready!(task.poll(&mut delay));
});
}
2019-06-30 08:48:53 -07:00
fn ms(n: u64) -> Duration {
Duration::from_millis(n)
}