task-supervisor 0.4.1

Supervisor for long-lived tokio tasks
Documentation
mod common;

use common::HealthyTask;
use std::{sync::Arc, time::Duration};
use task_supervisor::SupervisorBuilder;
use tokio::time::pause;

#[tokio::test]
async fn test_consecutive_waits() {
    pause();

    let handle = SupervisorBuilder::new().build().run();

    let run_flag = Arc::new(std::sync::atomic::AtomicBool::new(true));
    let task = HealthyTask {
        run_flag: run_flag.clone(),
    };
    handle.add_task("task", task).unwrap();

    let handle_clone = handle.clone();
    tokio::spawn(async move {
        tokio::time::sleep(Duration::from_millis(5)).await;
        handle_clone.shutdown().unwrap();
    });

    let result1 = handle.wait().await;
    let result2 = handle.wait().await;
    let result3 = handle.wait().await;

    assert!(result1.is_ok());
    assert!(result2.is_ok());
    assert!(result3.is_ok());
}

#[tokio::test]
async fn test_parallel_waits() {
    pause();

    let handle = SupervisorBuilder::new().build().run();

    let run_flag = Arc::new(std::sync::atomic::AtomicBool::new(true));
    let task = HealthyTask {
        run_flag: run_flag.clone(),
    };
    handle.add_task("task", task).unwrap();

    let handle_clone = handle.clone();
    tokio::spawn(async move {
        tokio::time::sleep(Duration::from_millis(5)).await;
        handle_clone.shutdown().unwrap();
    });

    let handle1 = handle.clone();
    let handle2 = handle.clone();
    let handle3 = handle.clone();

    let (result1, result2, result3) = tokio::join!(handle1.wait(), handle2.wait(), handle3.wait());

    assert!(result1.is_ok());
    assert!(result2.is_ok());
    assert!(result3.is_ok());
}