use super::CronjobManager;
use std::sync::{
Arc,
atomic::{AtomicUsize, Ordering},
};
use std::time::Duration;
#[tokio::test(start_paused = true)]
async fn cronjob_runs_on_interval() {
let counter = Arc::new(AtomicUsize::new(0));
let mut manager = CronjobManager::new();
let counter_handle = Arc::clone(&counter);
manager.spawn_interval(Duration::from_secs(5), true, move || {
let counter_handle = Arc::clone(&counter_handle);
async move {
counter_handle.fetch_add(1, Ordering::SeqCst);
}
});
tokio::task::yield_now().await;
assert_eq!(counter.load(Ordering::SeqCst), 1);
tokio::time::advance(Duration::from_secs(5)).await;
tokio::task::yield_now().await;
assert_eq!(counter.load(Ordering::SeqCst), 2);
}
#[tokio::test(start_paused = true)]
async fn cronjob_aborts_on_drop() {
let counter = Arc::new(AtomicUsize::new(0));
let mut manager = CronjobManager::new();
let counter_handle = Arc::clone(&counter);
manager.spawn_interval(Duration::from_secs(1), false, move || {
let counter_handle = Arc::clone(&counter_handle);
async move {
counter_handle.fetch_add(1, Ordering::SeqCst);
}
});
tokio::time::advance(Duration::from_secs(1)).await;
tokio::task::yield_now().await;
let before_drop = counter.load(Ordering::SeqCst);
drop(manager);
tokio::time::advance(Duration::from_secs(5)).await;
tokio::task::yield_now().await;
assert_eq!(counter.load(Ordering::SeqCst), before_drop);
}