vcl-protocol 1.1.0

Cryptographically chained packet transport protocol with SHA-256 integrity, Ed25519 signatures, and XChaCha20-Poly1305 encryption
Documentation
use vcl_protocol::connection::VCLConnection;
use tokio::time::{sleep, Duration};

#[tokio::test]
async fn test_client_server_basic() {
    let shared_key = hex::decode("0000000000000000000000000000000000000000000000000000000000000001").unwrap();
    
    let mut server = VCLConnection::bind("127.0.0.1:9001").await.unwrap();
    server.set_shared_key(&shared_key);
    
    let server_handle = tokio::spawn(async move {
        server.accept_handshake().await.unwrap();
        for i in 1..=3 {
            let packet = server.recv().await.unwrap();
            assert_eq!(packet.payload, format!("msg{}", i).as_bytes());
        }
    });
    
    let mut client = VCLConnection::bind("127.0.0.1:0").await.unwrap();
    client.set_shared_key(&shared_key);
    client.connect("127.0.0.1:9001").await.unwrap();
    
    for i in 1..=3 {
        client.send(format!("msg{}", i).as_bytes()).await.unwrap();
        sleep(Duration::from_millis(50)).await;
    }
    server_handle.await.unwrap();
}

#[tokio::test]
async fn test_encryption_integrity() {
    let shared_key = hex::decode("0000000000000000000000000000000000000000000000000000000000000002").unwrap();
    
    let mut server = VCLConnection::bind("127.0.0.1:9002").await.unwrap();
    server.set_shared_key(&shared_key);
    
    let server_handle = tokio::spawn(async move {
        server.accept_handshake().await.unwrap();
        let packet = server.recv().await.unwrap();
        assert_eq!(packet.payload, b"secret");
    });
    
    let mut client = VCLConnection::bind("127.0.0.1:0").await.unwrap();
    client.set_shared_key(&shared_key);
    client.connect("127.0.0.1:9002").await.unwrap();
    client.send(b"secret").await.unwrap();
    server_handle.await.unwrap();
}

#[tokio::test]
async fn test_chain_validation() {
    let shared_key = hex::decode("0000000000000000000000000000000000000000000000000000000000000003").unwrap();
    
    let mut server = VCLConnection::bind("127.0.0.1:9003").await.unwrap();
    server.set_shared_key(&shared_key);
    
    let server_handle = tokio::spawn(async move {
        server.accept_handshake().await.unwrap();
        let p1 = server.recv().await.unwrap();
        assert_eq!(p1.sequence, 0);
        let p2 = server.recv().await.unwrap();
        assert_eq!(p2.sequence, 1);
    });
    
    let mut client = VCLConnection::bind("127.0.0.1:0").await.unwrap();
    client.set_shared_key(&shared_key);
    client.connect("127.0.0.1:9003").await.unwrap();
    client.send(b"first").await.unwrap();
    client.send(b"second").await.unwrap();
    server_handle.await.unwrap();
}

#[tokio::test]
async fn test_replay_protection() {
    let shared_key = hex::decode("0000000000000000000000000000000000000000000000000000000000000004").unwrap();
    
    let mut server = VCLConnection::bind("127.0.0.1:9004").await.unwrap();
    server.set_shared_key(&shared_key);
    
    let server_handle = tokio::spawn(async move {
        server.accept_handshake().await.unwrap();
        
        let p1 = server.recv().await.unwrap();
        assert_eq!(p1.sequence, 0);
        
        let p2 = server.recv().await.unwrap();
        assert_eq!(p2.sequence, 1);
    });
    
    let mut client = VCLConnection::bind("127.0.0.1:0").await.unwrap();
    client.set_shared_key(&shared_key);
    client.connect("127.0.0.1:9004").await.unwrap();
    
    client.send(b"first").await.unwrap();
    client.send(b"second").await.unwrap();
    
    server_handle.await.unwrap();
}

#[tokio::test]
async fn test_close() {
    let shared_key = hex::decode("0000000000000000000000000000000000000000000000000000000000000005").unwrap();
    
    let mut conn = VCLConnection::bind("127.0.0.1:9005").await.unwrap();
    conn.set_shared_key(&shared_key);
    
    assert!(!conn.is_closed());
    
    conn.close().unwrap();
    
    assert!(conn.is_closed());
    
    let result = conn.close();
    assert!(result.is_err());
}

#[tokio::test]
async fn test_send_after_close() {
    let shared_key = hex::decode("0000000000000000000000000000000000000000000000000000000000000006").unwrap();
    
    let mut server = VCLConnection::bind("127.0.0.1:9006").await.unwrap();
    server.set_shared_key(&shared_key);
    
    let server_handle = tokio::spawn(async move {
        server.accept_handshake().await.unwrap();
        server.close().unwrap();
        
        let result = server.recv().await;
        assert!(result.is_err());
    });
    
    let mut client = VCLConnection::bind("127.0.0.1:0").await.unwrap();
    client.set_shared_key(&shared_key);
    client.connect("127.0.0.1:9006").await.unwrap();
    
    client.close().unwrap();
    
    let result = client.send(b"test").await;
    assert!(result.is_err());
    
    server_handle.await.unwrap();
}

#[tokio::test]
async fn test_timeout_getters() {
    let mut conn = VCLConnection::bind("127.0.0.1:9007").await.unwrap();
    
    assert_eq!(conn.get_timeout(), 60);
    
    conn.set_timeout(120);
    assert_eq!(conn.get_timeout(), 120);
    
    let _ = conn.last_activity();
}