ch-rds 0.2.1

Runtime resource loading and local service orchestration
Documentation
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);
}