timer: Fix DelayQueue delay reset logic (#851)

This commit is contained in:
Eliza Weisman
2019-01-20 08:38:39 -05:00
committed by Toby Lawrence
parent 4c8f274db9
commit 983e9d1b67
2 changed files with 66 additions and 3 deletions
+58
View File
@@ -206,6 +206,64 @@ fn reset_entry() {
});
}
#[test]
fn reset_much_later() {
// Reproduces tokio-rs/tokio#849.
mocked(|timer, time| {
let mut queue = DelayQueue::new();
let mut task = MockTask::new();
let epoch = time.now();
turn(timer, ms(1));
let key = queue.insert_at("foo", epoch + ms(200));
task.enter(|| {
assert_not_ready!(queue);
});
turn(timer, ms(3));
queue.reset_at(&key, epoch + ms(5));
turn(timer, ms(20));
assert!(task.is_notified());
});
}
#[test]
fn reset_twice() {
// Reproduces tokio-rs/tokio#849.
mocked(|timer, time| {
let mut queue = DelayQueue::new();
let mut task = MockTask::new();
let epoch = time.now();
turn(timer, ms(1));
let key = queue.insert_at("foo", epoch + ms(200));
task.enter(|| {
assert_not_ready!(queue);
});
turn(timer, ms(3));
queue.reset_at(&key, epoch + ms(50));
turn(timer, ms(20));
queue.reset_at(&key, epoch + ms(40));
turn(timer, ms(20));
assert!(task.is_notified());
});
}
#[test]
fn remove_expired_item() {
mocked(|timer, time| {