blvm-node 0.1.73

Bitcoin Commons BLVM: Minimal Bitcoin node implementation using blvm-protocol and blvm-consensus
//! Tests for message bridge

use blvm_node::network::message_bridge::MessageBridge;
use blvm_node::network::transport::TransportType;
use blvm_protocol::network::{
    NetworkAddress, NetworkMessage, NetworkResponse, PingMessage, VersionMessage,
};

fn create_test_version_message() -> NetworkMessage {
    NetworkMessage::Version(VersionMessage {
        version: 70015,
        services: 1,
        timestamp: 1234567890,
        addr_recv: NetworkAddress {
            time: 0,
            services: 1,
            ip: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 1],
            port: 8333,
        },
        addr_from: NetworkAddress {
            time: 0,
            services: 1,
            ip: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 1],
            port: 8334,
        },
        nonce: 12345,
        user_agent: "test".to_string(),
        start_height: 0,
        relay: true,
    })
}

#[test]
fn test_message_bridge_to_transport_tcp() {
    let msg = create_test_version_message();

    let result = MessageBridge::to_transport_message(&msg, TransportType::Tcp);
    assert!(result.is_ok());

    let wire = result.unwrap();
    assert!(!wire.is_empty());
}

#[test]
fn test_message_bridge_from_transport_tcp() {
    let msg = create_test_version_message();

    // Serialize first
    let wire = MessageBridge::to_transport_message(&msg, TransportType::Tcp).unwrap();
    assert!(!wire.is_empty());

    let decoded = MessageBridge::from_transport_message(&wire, TransportType::Tcp)
        .expect("version round trip");
    assert_eq!(decoded, msg);
}

#[test]
fn test_message_bridge_roundtrip() {
    let original = create_test_version_message();

    // Convert to transport
    let wire = MessageBridge::to_transport_message(&original, TransportType::Tcp).unwrap();
    assert!(!wire.is_empty());

    let converted = MessageBridge::from_transport_message(&wire, TransportType::Tcp)
        .expect("version round trip");
    assert_eq!(converted, original);
}

#[test]
fn test_message_bridge_extract_send_messages_ok() {
    let response = NetworkResponse::Ok;

    let result = MessageBridge::extract_send_messages(&response, TransportType::Tcp);
    assert!(result.is_ok());

    let messages = result.unwrap();
    assert_eq!(messages.len(), 0);
}

#[test]
fn test_message_bridge_extract_send_messages_send_message() {
    let msg = create_test_version_message();
    let response = NetworkResponse::SendMessage(Box::new(msg));

    let result = MessageBridge::extract_send_messages(&response, TransportType::Tcp);
    assert!(result.is_ok());

    let messages = result.unwrap();
    assert_eq!(messages.len(), 1);
    assert!(!messages[0].is_empty());
}

#[test]
fn test_message_bridge_extract_send_messages_send_messages() {
    let msg1 = create_test_version_message();
    let msg2 = NetworkMessage::Ping(PingMessage { nonce: 12345 });
    let response = NetworkResponse::SendMessages(vec![msg1, msg2]);

    let result = MessageBridge::extract_send_messages(&response, TransportType::Tcp);
    assert!(result.is_ok());

    let messages = result.unwrap();
    assert_eq!(messages.len(), 2);
    assert!(!messages[0].is_empty());
    assert!(!messages[1].is_empty());
}

#[test]
fn test_message_bridge_extract_send_messages_reject() {
    let response = NetworkResponse::Reject("test rejection".to_string());

    let result = MessageBridge::extract_send_messages(&response, TransportType::Tcp);
    assert!(result.is_ok());

    let messages = result.unwrap();
    assert_eq!(messages.len(), 0);
}