rnp 0.1.146

A simple layer 4 ping tool for cloud.
Documentation
use crate::ping_clients::ping_client_tcp::PingClientTcp;
use crate::*;

#[cfg(any(not(target_os = "windows"), not(target_arch = "aarch64")))]
use crate::ping_clients::ping_client_quic::PingClientQuic;

pub type PingClientFactory = fn(protocol: &RnpSupportedProtocol, config: &PingClientConfig) -> Option<Box<dyn PingClient + Send + Sync>>;

pub fn new_ping_client(
    protocol: &RnpSupportedProtocol,
    config: &PingClientConfig,
    external_ping_client_factory: Option<PingClientFactory>,
) -> Box<dyn PingClient + Send + Sync> {
    if let Some(factory) = external_ping_client_factory {
        if let Some(ping_client) = factory(protocol, config) {
            return ping_client;
        }
    }

    return new_inbox_ping_client(protocol, config);
}

#[cfg(any(not(target_os = "windows"), not(target_arch = "aarch64")))]
fn new_inbox_ping_client(protocol: &RnpSupportedProtocol, config: &PingClientConfig) -> Box<dyn PingClient + Send + Sync> {
    match protocol {
        RnpSupportedProtocol::TCP => return Box::new(PingClientTcp::new(config)),
        RnpSupportedProtocol::QUIC => return Box::new(PingClientQuic::new(config)),
        RnpSupportedProtocol::External(p) => panic!("Protocol {} is not supported!", p),
    }
}

#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
fn new_inbox_ping_client(protocol: &RnpSupportedProtocol, config: &PingClientConfig) -> Box<dyn PingClient + Send + Sync> {
    match protocol {
        RnpSupportedProtocol::TCP => return Box::new(PingClientTcp::new(config)),
        RnpSupportedProtocol::QUIC => {
            panic!("Sorry, QUIC ping is not supported yet for Windows ARM64.")
        }
        RnpSupportedProtocol::External(p) => panic!(format!("Protocol {} is not supported!", p)),
    }
}

#[cfg(test)]
mod tests {
    use crate::ping_clients::ping_client_factory::new_ping_client;
    use crate::{PingClientConfig, RnpSupportedProtocol};
    use std::time::Duration;

    #[test]
    fn create_tcp_ping_client_should_work() {
        let config = PingClientConfig {
            wait_timeout: Duration::from_millis(100),
            time_to_live: Some(128),
            check_disconnect: false,
            wait_before_disconnect: Duration::ZERO,
            disconnect_timeout: Duration::from_millis(2000),
            server_name: None,
            log_tls_key: false,
            alpn_protocol: None,
            use_timer_rtt: false,
        };

        let ping_client = new_ping_client(&RnpSupportedProtocol::TCP, &config, None);
        assert_eq!("TCP", ping_client.protocol());
    }
}