cranpose-services 0.1.161

Multiplatform system services for Cranpose (HTTP, URI, and OS integrations)
Documentation
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};

use super::*;

#[test]
fn default_is_online_unmetered_and_overridable() {
    let _guard = crate::registry::test_service_guard();
    clear_platform_network_monitor();
    assert_eq!(
        network_status(),
        NetworkStatus {
            online: true,
            metered: false
        }
    );
    struct Metered;
    impl NetworkMonitor for Metered {
        fn status(&self) -> NetworkStatus {
            NetworkStatus {
                online: true,
                metered: true,
            }
        }

        fn is_alive(&self) -> bool {
            true
        }

        fn reconnect(&self) {}
    }
    set_platform_network_monitor(Arc::new(Metered));
    assert!(network_status().metered);
    clear_platform_network_monitor();
}

#[test]
fn dead_monitor_reconnects_before_status_is_read() {
    let _guard = crate::registry::test_service_guard();
    struct Reconnecting {
        alive: AtomicBool,
        reconnects: AtomicUsize,
    }
    impl NetworkMonitor for Reconnecting {
        fn status(&self) -> NetworkStatus {
            NetworkStatus {
                online: self.alive.load(Ordering::Acquire),
                metered: false,
            }
        }
        fn is_alive(&self) -> bool {
            self.alive.load(Ordering::Acquire)
        }
        fn reconnect(&self) {
            self.reconnects.fetch_add(1, Ordering::AcqRel);
            self.alive.store(true, Ordering::Release);
        }
    }
    clear_platform_network_monitor();
    let monitor = Arc::new(Reconnecting {
        alive: AtomicBool::new(false),
        reconnects: AtomicUsize::new(0),
    });
    set_platform_network_monitor(monitor.clone());
    assert!(network_status().online);
    assert_eq!(monitor.reconnects.load(Ordering::Acquire), 1);
    clear_platform_network_monitor();
}