shutdown-async 0.1.1

Asynchronous Shutdown
Documentation
#[cfg(test)]
mod tests {
    use shutdown_async::ShutdownController;

    #[tokio::test]
    async fn shutdown_completes() {
        let shutdown = ShutdownController::new();

        let t = tokio::spawn({
            let mut monitor = shutdown.subscribe();
            async move {
                monitor.recv().await;
            }
        });

        shutdown.shutdown().await;
        assert!(t.await.is_ok());
    }

    #[tokio::test]
    async fn monitor_is_not_ready_for_shutdown() {
        let shutdown = ShutdownController::new();
        let monitor = shutdown.subscribe();
        assert!(!monitor.is_shutdown());
    }

    #[tokio::test]
    async fn monitor_is_not_ready_for_shutdown2() {
        let shutdown = ShutdownController::new();

        let t = tokio::spawn({
            let mut monitor = shutdown.subscribe();
            async move {
                assert!(!monitor.is_shutdown());
                monitor.recv().await;
            }
        });

        shutdown.shutdown().await;
        assert!(t.await.is_ok());
    }

    #[tokio::test]
    async fn monitor_is_ready_for_shutdown() {
        let shutdown = ShutdownController::new();

        let t = tokio::spawn({
            let mut monitor = shutdown.subscribe();
            async move {
                monitor.recv().await;
                assert!(monitor.is_shutdown());
            }
        });

        shutdown.shutdown().await;
        assert!(t.await.is_ok());
    }

    #[tokio::test]
    async fn default() {
        let shutdown = ShutdownController::default();
        let monitor = shutdown.subscribe();
        assert!(!monitor.is_shutdown());
    }

    #[tokio::test]
    async fn recv_is_idempotent() {
        let shutdown = ShutdownController::new();

        let t = tokio::spawn({
            let mut monitor = shutdown.subscribe();
            async move {
                monitor.recv().await;
                monitor.recv().await;
            }
        });

        shutdown.shutdown().await;
        assert!(t.await.is_ok());
    }
}