#![cfg(feature = "network")]
use issun::event::{Event, EventBus};
use issun::network::{NetworkBackend, NetworkScope, QuicClientBackend};
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
struct PlayerMove {
x: i32,
y: i32,
}
impl Event for PlayerMove {
fn is_networked() -> bool {
true
}
fn network_scope() -> NetworkScope {
NetworkScope::Broadcast
}
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
#[ignore] async fn test_client_server_connection() {
let result = QuicClientBackend::connect_to_server("127.0.0.1:5000").await;
match result {
Ok(backend) => {
println!("✅ Successfully connected to relay server");
println!("Node ID: {:?}", backend.node_id());
assert!(backend.is_connected());
}
Err(e) => {
eprintln!("❌ Failed to connect to relay server: {:?}", e);
eprintln!("Make sure the server is running: make server-dev");
panic!("Connection failed: {:?}", e);
}
}
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
#[ignore] async fn test_two_clients_ping_pong() {
let client1_result = QuicClientBackend::connect_to_server("127.0.0.1:5000").await;
let client2_result = QuicClientBackend::connect_to_server("127.0.0.1:5000").await;
if client1_result.is_err() || client2_result.is_err() {
eprintln!("⚠️ Skipping test: Relay server not running");
eprintln!(" Run: make server-dev");
return;
}
let client1 = client1_result.unwrap();
let client2 = client2_result.unwrap();
println!("✅ Both clients connected");
println!("Client 1 Node ID: {:?}", client1.node_id());
println!("Client 2 Node ID: {:?}", client2.node_id());
let mut bus1 = EventBus::new().with_network(client1);
let mut bus2 = EventBus::new().with_network(client2);
bus1.register_networked_event::<PlayerMove>();
bus2.register_networked_event::<PlayerMove>();
bus1.publish(PlayerMove { x: 10, y: 20 });
bus1.dispatch();
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
bus2.poll_network();
bus2.dispatch();
let reader = bus2.reader::<PlayerMove>();
let events: Vec<_> = reader.iter().cloned().collect();
if !events.is_empty() {
println!("✅ Client 2 received events: {:?}", events);
assert_eq!(events.len(), 1);
assert_eq!(events[0], PlayerMove { x: 10, y: 20 });
} else {
println!("⚠️ No events received (this might be a timing issue)");
}
}