use os_timer::{Callback, Timer};
use core::time;
use core::sync::atomic::{AtomicU8, Ordering};
#[test]
fn timer_schedule_once() {
static COUNT: AtomicU8 = AtomicU8::new(0);
let cb = || {
COUNT.fetch_add(1, Ordering::AcqRel);
};
let timer = Timer::new(Callback::closure(cb)).expect("To create timer");
assert!(!timer.is_scheduled());
timer.schedule_once(time::Duration::from_millis(250));
assert!(timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(1000));
assert_eq!(COUNT.load(Ordering::Acquire), 1);
#[cfg(all(unix, not(any(target_os = "macos", target_os = "ios"))))]
assert!(!timer.is_scheduled());
timer.schedule_once(time::Duration::from_millis(250));
timer.cancel();
assert!(!timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(1000));
assert_eq!(COUNT.load(Ordering::Acquire), 1);
timer.cancel();
assert!(!timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(1000));
assert_eq!(COUNT.load(Ordering::Acquire), 1);
}
#[test]
fn timer_schedule_interval() {
static COUNT: AtomicU8 = AtomicU8::new(0);
fn cb() {
COUNT.fetch_add(1, Ordering::AcqRel);
}
let timer = Timer::new(Callback::plain(cb)).expect("To create timer");
assert!(!timer.is_scheduled());
timer.schedule_interval(time::Duration::from_secs(1), time::Duration::from_millis(300));
assert!(timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(1100));
assert_eq!(COUNT.load(Ordering::Acquire), 1);
assert!(timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(1150));
assert_eq!(COUNT.load(Ordering::Acquire), 5);
assert!(timer.is_scheduled());
timer.cancel();
assert!(!timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(1100));
assert_eq!(COUNT.load(Ordering::Acquire), 5);
}
#[test]
fn timer_schedule_interval_without_initial() {
static COUNT: AtomicU8 = AtomicU8::new(0);
fn cb() {
COUNT.fetch_add(1, Ordering::AcqRel);
}
let timer = Timer::new(Callback::plain(cb)).expect("To create timer");
assert!(!timer.is_scheduled());
assert!(timer.schedule().interval(time::Duration::from_millis(200)).schedule());
assert!(timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(150));
assert_eq!(COUNT.load(Ordering::Acquire), 0);
assert!(timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(150));
assert_eq!(COUNT.load(Ordering::Acquire), 1);
assert!(timer.is_scheduled());
std::thread::sleep(time::Duration::from_millis(1000));
assert_eq!(COUNT.load(Ordering::Acquire), 6);
assert!(timer.is_scheduled());
timer.cancel();
assert!(!timer.is_scheduled());
std::thread::sleep(time::Duration::from_secs(1));
assert_eq!(COUNT.load(Ordering::Acquire), 6);
}