#[path = "../../../os-waitset/deadlines/wait.rs"] mod wait; use wait::{Completion, DeadlineWait, Error, Phase, Token}; #[test] fn os_waitsets_deadlines_positive() { let mut timer_first = DeadlineWait::new(7u64); let token = timer_first.arm(7, 100).unwrap(); assert_eq!(timer_first.snapshot().timers, 1); timer_first.timer(token, 100).unwrap(); assert_eq!(timer_first.snapshot().entry.unwrap().phase, Phase::DeadlinePending); let before = timer_first.snapshot(); assert_eq!(timer_first.event(token, 99), Err(Error::Late)); assert_eq!(timer_first.snapshot(), before); timer_first.event(token, 100).unwrap(); assert_eq!(timer_first.snapshot().timers, 0); assert_eq!(timer_first.timer(token, 100), Err(Error::Stale)); assert_eq!(timer_first.take(7, token), Ok(Completion::Event)); assert_eq!(timer_first.snapshot().entry, None); assert_eq!(timer_first.take(7, token), Err(Error::Stale)); let mut event_first = DeadlineWait::new(7u64); let token = event_first.arm(7, 100).unwrap(); event_first.event(token, 100).unwrap(); assert_eq!(event_first.timer(token, 100), Err(Error::Stale)); assert_eq!(event_first.take(7, token), Ok(Completion::Event)); } #[test] fn os_waitsets_deadlines_negative() { let mut wait = DeadlineWait::new(11u64); let old = wait.arm(11, 40).unwrap(); assert_eq!(wait.timer(old, 39), Err(Error::NotDue)); wait.timer(old, 40).unwrap(); assert_eq!(wait.take(11, old), Err(Error::Pending)); wait.close_tick(old, 40).unwrap(); assert_eq!(wait.event(old, 40), Err(Error::Stale)); assert_eq!(wait.take(11, old), Ok(Completion::Timeout)); let new = wait.arm(11, 90).unwrap(); assert_ne!(old, new); let before = wait.snapshot(); assert_eq!(wait.timer(old, 90), Err(Error::Stale)); assert_eq!(wait.event(old, 90), Err(Error::Stale)); assert_eq!(wait.snapshot(), before); wait.event(new, 80).unwrap(); assert_eq!(wait.take(11, new), Ok(Completion::Event)); assert_eq!(wait.snapshot().timers, 0); } #[test] fn owner_late_and_overflow_denials_preserve_state() { let mut wait = DeadlineWait::new(3u64); let before = wait.snapshot(); assert_eq!(wait.arm(4, 10), Err(Error::Access)); assert_eq!(wait.snapshot(), before); let token = wait.arm(3, 10).unwrap(); let before = wait.snapshot(); assert_eq!(wait.arm(3, 20), Err(Error::Busy)); assert_eq!(wait.event(token, 11), Err(Error::Late)); assert_eq!(wait.take(4, token), Err(Error::Access)); assert_eq!(wait.take(3, Token::from_raw(0)), Err(Error::Stale)); assert_eq!(wait.snapshot(), before); wait.timer(token, 11).unwrap(); assert_eq!(wait.take(3, token), Ok(Completion::Timeout)); let mut overflow = DeadlineWait::with_generation_seed(3u64, u64::MAX); let before = overflow.snapshot(); assert_eq!(overflow.arm(3, 10), Err(Error::Overflow)); assert_eq!(overflow.snapshot(), before); }