statime-netptp 0.1.0

Full-featured implementation of NTP with NTS support
Documentation
use std::{
    net::{Ipv4Addr, Ipv6Addr},
    time::Duration,
};

use tokio::net::UdpSocket;

use crate::NetworkManager;

#[tokio::test]
async fn test_ipv4() {
    let manager = NetworkManager::<Ipv4Addr>::new().unwrap();
    let general = manager.open_general();
    let mut socket = general.listen_socket();

    socket
        .send_general(&[1, 2, 3, 4], None, Ipv4Addr::LOCALHOST)
        .await
        .unwrap();
    let result = socket.recv().await.unwrap();
    assert_eq!(&*result.bytes_read, [1, 2, 3, 4].as_slice());

    let ts = socket
        .send_event(&[5, 6, 7, 8], None, Ipv4Addr::LOCALHOST)
        .await
        .unwrap();
    assert!(ts.is_some());
    let result = socket.recv().await.unwrap();
    assert_eq!(&*result.bytes_read, [5, 6, 7, 8].as_slice());
    assert!(result.timestamp.is_some());

    let external = UdpSocket::bind("0.0.0.0:0").await.unwrap();
    external
        .send_to(&[9, 10, 11, 12], "127.0.0.1:4319")
        .await
        .unwrap();
    assert!(
        tokio::time::timeout(Duration::from_millis(100), socket.recv())
            .await
            .is_err()
    );
}

#[tokio::test]
async fn test_ipv6() {
    let manager = NetworkManager::<Ipv6Addr>::new().unwrap();
    let general = manager.open_general();
    let mut socket = general.listen_socket();

    socket
        .send_general(&[1, 2, 3, 4], None, Ipv6Addr::LOCALHOST)
        .await
        .unwrap();
    let result = socket.recv().await.unwrap();
    assert_eq!(&*result.bytes_read, [1, 2, 3, 4].as_slice());

    let ts = socket
        .send_event(&[5, 6, 7, 8], None, Ipv6Addr::LOCALHOST)
        .await
        .unwrap();
    assert!(ts.is_some());
    let result = socket.recv().await.unwrap();
    assert_eq!(&*result.bytes_read, [5, 6, 7, 8].as_slice());
    assert!(result.timestamp.is_some());

    let external = UdpSocket::bind("[::]:0").await.unwrap();
    external
        .send_to(&[9, 10, 11, 12], "[::1]:4319")
        .await
        .unwrap();
    assert!(
        tokio::time::timeout(Duration::from_millis(100), socket.recv())
            .await
            .is_err()
    );
}