Skip to content

Commit

Permalink
Test change tick for clients connecting at different times (#172)
Browse files Browse the repository at this point in the history
Co-authored-by: Hennadii Chernyshchyk <genaloner@gmail.com>
  • Loading branch information
UkoeHB and Shatur authored Jan 12, 2024
1 parent b98814a commit 5de3a92
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 5 deletions.
6 changes: 3 additions & 3 deletions tests/connect/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::<NetworkChannels>();

let server_channels_config = network_channels.get_server_configs();
Expand All @@ -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::<NetworkChannels>();

let server_channels_config = network_channels.get_server_configs();
Expand All @@ -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();
Expand Down
53 changes: 51 additions & 2 deletions tests/server_event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,57 @@ fn event_queue() {

client_app.update();

let dummy_events = client_app.world.resource::<Events<DummyEvent>>();
assert_eq!(dummy_events.len(), 1);
assert_eq!(client_app.world.resource::<Events<DummyEvent>>().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::<DummyComponent>()
.add_server_event::<DummyEvent>(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::<Events<DummyEvent>>().len(), 1);
assert_eq!(client_app2.world.resource::<Events<DummyEvent>>().len(), 1);
}

#[derive(Component, Serialize, Deserialize)]
Expand Down

0 comments on commit 5de3a92

Please sign in to comment.