Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Add unit test for entity-despawns with interest-management #768

Merged
merged 1 commit into from
Jan 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions lightyear/src/server/relevance/immediate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,9 +296,14 @@ impl Plugin for NetworkRelevancePlugin {
#[cfg(test)]
mod tests {
use super::*;
use crate::prelude::server::Replicate;
use crate::prelude::{client, ClientConnectionManager, NetworkRelevanceMode};
use crate::shared::replication::components::ReplicationGroupId;
use crate::tests::stepper::{BevyStepper, TEST_CLIENT_ID};
use bevy::ecs::system::RunSystemOnce;

/// Multiple entities gain relevance for a given client
/// Check that interest management works correctly
#[test]
fn test_multiple_relevance_gain() {
let mut app = App::new();
Expand Down Expand Up @@ -420,4 +425,76 @@ mod tests {
&ClientRelevance::Maintained
);
}

/// https://github.com/cBournhonesque/lightyear/issues/637
/// Make sure that entity despawns aren't replicated to clients that don't have visibility of the entity
/// E1 gains relevance with C1, E1 is replicated
/// E1 loses relevance with C1, E1 is despawned
/// E1 gets despawned on server -> we shouldn't send an extra despawn message to C1
#[test]
fn test_redundant_despawn() {
// tracing_subscriber::FmtSubscriber::builder()
// .with_max_level(tracing::Level::DEBUG)
// .init();
let mut stepper = BevyStepper::default();

let client = ClientId::Netcode(TEST_CLIENT_ID);
let server_entity = stepper
.server_app
.world_mut()
.spawn(Replicate {
relevance_mode: NetworkRelevanceMode::InterestManagement,
..Default::default()
})
.id();
stepper
.server_app
.world_mut()
.resource_mut::<RelevanceManager>()
.gain_relevance(client, server_entity);

stepper.frame_step();
stepper.frame_step();

// check that entity is replicated, since it's relevant
let client_entity = stepper
.client_app
.world()
.resource::<client::ConnectionManager>()
.replication_receiver
.remote_entity_map
.get_local(server_entity)
.expect("server entity was not replicated to client");

// lose relevance, check that entity is despawned
stepper
.server_app
.world_mut()
.resource_mut::<RelevanceManager>()
.lose_relevance(client, server_entity);
stepper.frame_step();
stepper.frame_step();
assert!(stepper
.client_app
.world()
.get_entity(client_entity)
.is_err());

// despawn entity on the server
// we shouldn't send an extra Despawn message to the client
// We check this by making sure that the next_action_message on the receiver channel is 2
// (because we received one spawn and one despawn)
stepper.server_app.world_mut().despawn(server_entity);
stepper.frame_step();
stepper.frame_step();
let channel = stepper
.client_app
.world()
.resource::<ClientConnectionManager>()
.replication_receiver
.group_channels
.get(&ReplicationGroupId(server_entity.to_bits()))
.unwrap();
assert_eq!(channel.actions_pending_recv_message_id.0, 2);
}
}
6 changes: 3 additions & 3 deletions lightyear/src/server/relevance/room.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1131,9 +1131,9 @@ mod tests {
// C1 and E2 leaves room 2 and joins room 1: visibility gained (and entity spawned)
#[test]
fn test_multiple_clients_leave_enter_room() {
tracing_subscriber::FmtSubscriber::builder()
.with_max_level(tracing::Level::DEBUG)
.init();
// tracing_subscriber::FmtSubscriber::builder()
// .with_max_level(tracing::Level::DEBUG)
// .init();
let mut stepper = MultiBevyStepper::default();
let c1 = ClientId::Netcode(TEST_CLIENT_ID_1);
let c2 = ClientId::Netcode(TEST_CLIENT_ID_2);
Expand Down
Loading