From 5de3a92bfc5f6225b0da53641c92f44bed23c9e4 Mon Sep 17 00:00:00 2001 From: UkoeHB <37489173+UkoeHB@users.noreply.github.com> Date: Fri, 12 Jan 2024 04:31:50 -0600 Subject: [PATCH] Test change tick for clients connecting at different times (#172) Co-authored-by: Hennadii Chernyshchyk --- tests/connect/mod.rs | 6 ++--- tests/server_event.rs | 53 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/tests/connect/mod.rs b/tests/connect/mod.rs index 4712172f..04389264 100644 --- a/tests/connect/mod.rs +++ b/tests/connect/mod.rs @@ -30,7 +30,7 @@ pub(super) fn multiple_clients(server_app: &mut App, client_apps: &mut [App]) { } } -fn setup_client(app: &mut App, client_id: u64, port: u16) { +pub(super) fn setup_client(app: &mut App, client_id: u64, port: u16) { let network_channels = app.world.resource::(); let server_channels_config = network_channels.get_server_configs(); @@ -46,7 +46,7 @@ fn setup_client(app: &mut App, client_id: u64, port: u16) { app.insert_resource(client).insert_resource(transport); } -fn setup_server(app: &mut App, max_clients: usize) -> u16 { +pub(super) fn setup_server(app: &mut App, max_clients: usize) -> u16 { let network_channels = app.world.resource::(); let server_channels_config = network_channels.get_server_configs(); @@ -65,7 +65,7 @@ fn setup_server(app: &mut App, max_clients: usize) -> u16 { port } -fn wait_for_connection(server_app: &mut App, client_app: &mut App) { +pub(super) fn wait_for_connection(server_app: &mut App, client_app: &mut App) { loop { client_app.update(); server_app.update(); diff --git a/tests/server_event.rs b/tests/server_event.rs index a11367df..e2a91a38 100644 --- a/tests/server_event.rs +++ b/tests/server_event.rs @@ -201,8 +201,57 @@ fn event_queue() { client_app.update(); - let dummy_events = client_app.world.resource::>(); - assert_eq!(dummy_events.len(), 1); + assert_eq!(client_app.world.resource::>().len(), 1); +} + +#[test] +fn different_ticks() { + let mut server_app = App::new(); + let mut client_app1 = App::new(); + let mut client_app2 = App::new(); + for app in [&mut server_app, &mut client_app1, &mut client_app2] { + app.add_plugins(( + MinimalPlugins, + ReplicationPlugins.set(ServerPlugin { + tick_policy: TickPolicy::EveryFrame, + ..Default::default() + }), + )) + .replicate::() + .add_server_event::(EventType::Ordered); + } + + let port = connect::setup_server(&mut server_app, 2); + + // Connect client 1 first. + connect::setup_client(&mut client_app1, 1u64, port); + connect::wait_for_connection(&mut server_app, &mut client_app1); + + // Spawn entity to trigger world change. + server_app.world.spawn((Replication, DummyComponent)); + + // Update client 1 to initialize their replicon tick. + server_app.update(); + client_app1.update(); + + // Connect client 2 later to make it have a higher replicon tick than client 1, + // since only client 1 will recieve an init message here. + connect::setup_client(&mut client_app2, 2u64, port); + connect::wait_for_connection(&mut server_app, &mut client_app2); + + server_app.world.send_event(ToClients { + mode: SendMode::Broadcast, + event: DummyEvent, + }); + + // If any client does not have a replicon tick >= the change tick associated with this event, + // then they will not receive the event until their replicon tick is updated. + server_app.update(); + client_app1.update(); + client_app2.update(); + + assert_eq!(client_app1.world.resource::>().len(), 1); + assert_eq!(client_app2.world.resource::>().len(), 1); } #[derive(Component, Serialize, Deserialize)]