pharos-server 0.1.0

Listeners, Plugin Chain contract and metrics for the Pharos DNS server
Documentation
#![forbid(unsafe_code)]

use pharos_server::{Lifecycle, Phase};
use std::sync::{Arc, Mutex};

#[tokio::test]
async fn hooks_run_in_registration_order_for_each_phase() {
    let events = Arc::new(Mutex::new(Vec::new()));
    let mut hooks = Lifecycle::default();
    for (phase, value) in [
        (Phase::Startup, 1),
        (Phase::Restart, 3),
        (Phase::RestartFailed, 6),
        (Phase::Startup, 2),
        (Phase::Shutdown, 4),
    ] {
        let events = Arc::clone(&events);
        hooks.register(phase, move || {
            let events = Arc::clone(&events);
            async move {
                events.lock().unwrap().push(value);
                Ok(())
            }
        });
    }
    let sync_events = Arc::clone(&events);
    hooks.register_sync(Phase::Shutdown, move || {
        sync_events.lock().unwrap().push(5);
        Ok(())
    });
    hooks.run(Phase::Startup).await.unwrap();
    hooks.run(Phase::Restart).await.unwrap();
    hooks.run(Phase::Shutdown).await.unwrap();
    hooks.run(Phase::RestartFailed).await.unwrap();
    assert_eq!(*events.lock().unwrap(), [1, 2, 3, 4, 5, 6]);
}