Skip to content

Commit 6b611e7

Browse files
fix: NetworkObjectOnNetworkDespawnTests invalid wait (#2771)
* test fix Updating the NetworkObjectOnNetworkDespawnTests to use NetcodeIntegrationTest while also fixing an issue with the logic used to wait for the object to despawn.
1 parent a2c6f7d commit 6b611e7

File tree

3 files changed

+85
-86
lines changed

3 files changed

+85
-86
lines changed

com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTestHelpers.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,8 @@ public static IEnumerator WaitForCondition(Func<bool> predicate, ResultWrapper<b
813813

814814
if (minFrames > 0)
815815
{
816-
yield return new WaitUntil(() => Time.frameCount >= minFrames);
816+
var waitForFrameCount = Time.frameCount + minFrames;
817+
yield return new WaitUntil(() => Time.frameCount >= waitForFrameCount);
817818
}
818819

819820
while (Time.realtimeSinceStartup - startTime < timeout && !predicate())

com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectOnNetworkDespawnTests.cs

Lines changed: 67 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -10,111 +10,104 @@ namespace Unity.Netcode.RuntimeTests
1010
/// <summary>
1111
/// Tests that check OnNetworkDespawn being invoked
1212
/// </summary>
13-
public class NetworkObjectOnNetworkDespawnTests
13+
[TestFixture(HostOrServer.Host)]
14+
[TestFixture(HostOrServer.Server)]
15+
public class NetworkObjectOnNetworkDespawnTests : NetcodeIntegrationTest
1416
{
15-
private NetworkManager m_ServerHost;
16-
private NetworkManager[] m_Clients;
17+
private const string k_ObjectName = "TestDespawn";
18+
public enum InstanceType
19+
{
20+
Server,
21+
Client
22+
}
1723

24+
protected override int NumberOfClients => 1;
1825
private GameObject m_ObjectToSpawn;
19-
private NetworkObject m_NetworkObject;
26+
private HostOrServer m_HostOrServer;
27+
public NetworkObjectOnNetworkDespawnTests(HostOrServer hostOrServer) : base(hostOrServer)
28+
{
29+
m_HostOrServer = hostOrServer;
30+
}
2031

2132
internal class OnNetworkDespawnTestComponent : NetworkBehaviour
2233
{
23-
public bool OnNetworkDespawnCalled { get; internal set; }
34+
public static bool OnServerNetworkDespawnCalled { get; internal set; }
35+
public static bool OnClientNetworkDespawnCalled { get; internal set; }
2436

2537
public override void OnNetworkSpawn()
2638
{
27-
OnNetworkDespawnCalled = false;
39+
if (IsServer)
40+
{
41+
OnServerNetworkDespawnCalled = false;
42+
}
43+
else
44+
{
45+
OnClientNetworkDespawnCalled = false;
46+
}
2847
base.OnNetworkSpawn();
2948
}
3049

3150
public override void OnNetworkDespawn()
3251
{
33-
OnNetworkDespawnCalled = true;
52+
if (IsServer)
53+
{
54+
OnServerNetworkDespawnCalled = true;
55+
}
56+
else
57+
{
58+
OnClientNetworkDespawnCalled = true;
59+
}
3460
base.OnNetworkDespawn();
3561
}
3662
}
3763

38-
[UnitySetUp]
39-
public IEnumerator Setup()
64+
protected override void OnServerAndClientsCreated()
4065
{
41-
Assert.IsTrue(NetcodeIntegrationTestHelpers.Create(1, out m_ServerHost, out m_Clients));
42-
43-
m_ObjectToSpawn = NetcodeIntegrationTestHelpers.CreateNetworkObjectPrefab(nameof(NetworkObjectOnNetworkDespawnTests), m_ServerHost, m_Clients);
66+
m_ObjectToSpawn = CreateNetworkObjectPrefab(k_ObjectName);
4467
m_ObjectToSpawn.AddComponent<OnNetworkDespawnTestComponent>();
45-
m_NetworkObject = m_ObjectToSpawn.GetComponent<NetworkObject>();
46-
47-
yield return null;
48-
}
49-
50-
[UnityTearDown]
51-
public IEnumerator Teardown()
52-
{
53-
// Shutdown and clean up both of our NetworkManager instances
54-
if (m_ObjectToSpawn)
55-
{
56-
Object.Destroy(m_ObjectToSpawn);
57-
m_ObjectToSpawn = null;
58-
}
59-
NetcodeIntegrationTestHelpers.Destroy();
60-
yield return null;
61-
}
62-
63-
public enum InstanceType
64-
{
65-
Server,
66-
Host,
67-
Client
68+
base.OnServerAndClientsCreated();
6869
}
6970

7071
/// <summary>
71-
/// Tests that a spawned NetworkObject's associated NetworkBehaviours will have
72-
/// their OnNetworkDespawn invoked during NetworkManager shutdown.
72+
/// This test validates that <see cref="NetworkBehaviour.OnNetworkDespawn"/> is invoked when the
73+
/// <see cref="NetworkManager"/> is shutdown.
7374
/// </summary>
7475
[UnityTest]
75-
public IEnumerator TestNetworkObjectDespawnOnShutdown([Values(InstanceType.Server, InstanceType.Host, InstanceType.Client)] InstanceType despawnCheck)
76+
public IEnumerator TestNetworkObjectDespawnOnShutdown()
7677
{
77-
var useHost = despawnCheck != InstanceType.Server;
78-
var networkManager = despawnCheck == InstanceType.Host || despawnCheck == InstanceType.Server ? m_ServerHost : m_Clients[0];
79-
80-
// Start the instances
81-
if (!NetcodeIntegrationTestHelpers.Start(useHost, m_ServerHost, m_Clients))
82-
{
83-
Debug.LogError("Failed to start instances");
84-
Assert.Fail("Failed to start instances");
85-
}
86-
87-
// [Client-Side] Wait for a connection to the server
88-
yield return NetcodeIntegrationTestHelpers.WaitForClientsConnected(m_Clients, null, 512);
89-
90-
// [Host-Server-Side] Check to make sure all clients are connected
91-
var clientCount = useHost ? m_Clients.Length + 1 : m_Clients.Length;
92-
yield return NetcodeIntegrationTestHelpers.WaitForClientsConnectedToServer(m_ServerHost, clientCount, null, 512);
93-
9478
// Spawn the test object
95-
var spawnedObject = Object.Instantiate(m_NetworkObject);
79+
var spawnedObject = SpawnObject(m_ObjectToSpawn, m_ServerNetworkManager);
9680
var spawnedNetworkObject = spawnedObject.GetComponent<NetworkObject>();
97-
spawnedNetworkObject.NetworkManagerOwner = m_ServerHost;
98-
spawnedNetworkObject.Spawn(true);
9981

100-
// Get the spawned object relative to which NetworkManager instance we are testing.
101-
var relativeSpawnedObject = new NetcodeIntegrationTestHelpers.ResultWrapper<NetworkObject>();
102-
yield return NetcodeIntegrationTestHelpers.GetNetworkObjectByRepresentation((x => x.GetComponent<OnNetworkDespawnTestComponent>() != null), networkManager, relativeSpawnedObject);
103-
var onNetworkDespawnTestComponent = relativeSpawnedObject.Result.GetComponent<OnNetworkDespawnTestComponent>();
82+
// Wait for the client to spawn the object
83+
yield return WaitForConditionOrTimeOut(() =>
84+
{
85+
if (!s_GlobalNetworkObjects.ContainsKey(m_ClientNetworkManagers[0].LocalClientId))
86+
{
87+
return false;
88+
}
89+
if (!s_GlobalNetworkObjects[m_ClientNetworkManagers[0].LocalClientId].ContainsKey(spawnedNetworkObject.NetworkObjectId))
90+
{
91+
return false;
92+
}
93+
return true;
94+
});
95+
96+
AssertOnTimeout($"Timed out waiting for client to spawn {k_ObjectName}!");
10497

10598
// Confirm it is not set before shutting down the NetworkManager
106-
Assert.IsFalse(onNetworkDespawnTestComponent.OnNetworkDespawnCalled);
107-
108-
// Shutdown the NetworkManager instance we are testing.
109-
networkManager.Shutdown();
110-
111-
// Since shutdown is now delayed until the post frame update
112-
// just wait 2 frames before checking to see if OnNetworkDespawnCalled is true
113-
var currentFrame = Time.frameCount + 2;
114-
yield return new WaitUntil(() => Time.frameCount <= currentFrame);
115-
116-
// Confirm that OnNetworkDespawn is invoked after shutdown
117-
Assert.IsTrue(onNetworkDespawnTestComponent.OnNetworkDespawnCalled);
99+
Assert.IsFalse(OnNetworkDespawnTestComponent.OnClientNetworkDespawnCalled, "[Client-side] despawn state is already set (should not be set at this point)!");
100+
Assert.IsFalse(OnNetworkDespawnTestComponent.OnServerNetworkDespawnCalled, $"[{m_HostOrServer}-side] despawn state is already set (should not be set at this point)!");
101+
102+
// Shutdown the client-side first to validate the client-side instance invokes OnNetworkDespawn
103+
m_ClientNetworkManagers[0].Shutdown();
104+
yield return WaitForConditionOrTimeOut(() => OnNetworkDespawnTestComponent.OnClientNetworkDespawnCalled);
105+
AssertOnTimeout($"[Client-side] Timed out waiting for {k_ObjectName}'s {nameof(NetworkBehaviour.OnNetworkDespawn)} to be invoked!");
106+
107+
// Shutdown the servr-host-side second to validate servr-host-side instance invokes OnNetworkDespawn
108+
m_ServerNetworkManager.Shutdown();
109+
yield return WaitForConditionOrTimeOut(() => OnNetworkDespawnTestComponent.OnClientNetworkDespawnCalled);
110+
AssertOnTimeout($"[{m_HostOrServer}-side]Timed out waiting for {k_ObjectName}'s {nameof(NetworkBehaviour.OnNetworkDespawn)} to be invoked!");
118111
}
119112
}
120113
}

com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformPacketLossTests.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ namespace Unity.Netcode.RuntimeTests
1010
/// <summary>
1111
/// Integration tests for NetworkTransform that will test both
1212
/// server and host operating modes and will test both authoritative
13-
/// models for each operating mode.
13+
/// models for each operating mode when packet loss and latency is
14+
/// present.
1415
/// </summary>
1516
[TestFixture(HostOrServer.Host, Authority.ServerAuthority)]
1617
[TestFixture(HostOrServer.Host, Authority.OwnerAuthority)]
@@ -97,7 +98,7 @@ public enum NetworkConditions
9798
/// <param name="authority">Determines if we are using server or owner authority</param>
9899
public NetworkTransformPacketLossTests(HostOrServer testWithHost, Authority authority)
99100
{
100-
m_UseHost = testWithHost == HostOrServer.Host ? true : false;
101+
m_UseHost = testWithHost == HostOrServer.Host;
101102
m_Authority = authority;
102103
}
103104

@@ -139,8 +140,8 @@ protected override void OnCreatePlayerPrefab()
139140
networkTransformTestComponent.ServerAuthority = m_Authority == Authority.ServerAuthority;
140141
}
141142

142-
private const int k_Latency = 100;
143-
private const int k_PacketLoss = 5;
143+
private const int k_Latency = 50;
144+
private const int k_PacketLoss = 2;
144145
protected override void OnServerAndClientsCreated()
145146
{
146147
var subChildObject = CreateNetworkObjectPrefab("SubChildObject");
@@ -198,7 +199,7 @@ protected override IEnumerator OnServerAndClientsConnected()
198199
AssertOnTimeout("Timed out waiting for client-side to notify it is ready!");
199200

200201
// Get the client player representation on both the server and the client side
201-
var serverSideClientPlayer = m_PlayerNetworkObjects[0][m_ClientNetworkManagers[0].LocalClientId];// m_ServerNetworkManager.ConnectedClients[m_ClientNetworkManagers[0].LocalClientId].PlayerObject;
202+
var serverSideClientPlayer = m_PlayerNetworkObjects[0][m_ClientNetworkManagers[0].LocalClientId];
202203
var clientSideClientPlayer = m_PlayerNetworkObjects[m_ClientNetworkManagers[0].LocalClientId][m_ClientNetworkManagers[0].LocalClientId];
203204

204205
m_AuthoritativePlayer = m_Authority == Authority.ServerAuthority ? serverSideClientPlayer : clientSideClientPlayer;
@@ -328,9 +329,10 @@ private enum ChildrenTransformCheckType
328329
/// </summary>
329330
private IEnumerator AllChildrenLocalTransformValuesMatch(bool useSubChild, ChildrenTransformCheckType checkType)
330331
{
332+
var infoMessage = new StringBuilder($"[{checkType}][{useSubChild}] Timed out waiting for all children to have the correct local space values:\n");
331333
yield return WaitForConditionOrTimeOut(AllInstancesKeptLocalTransformValues);
334+
AssertOnTimeout(infoMessage.ToString());
332335

333-
var infoMessage = new StringBuilder($"[{checkType}][{useSubChild}] Timed out waiting for all children to have the correct local space values:\n");
334336
var authorityObjectLocalPosition = useSubChild ? m_AuthoritySubChildObject.transform.localPosition : m_AuthorityChildObject.transform.localPosition;
335337
var authorityObjectLocalRotation = useSubChild ? m_AuthoritySubChildObject.transform.localRotation.eulerAngles : m_AuthorityChildObject.transform.localRotation.eulerAngles;
336338
var authorityObjectLocalScale = useSubChild ? m_AuthoritySubChildObject.transform.localScale : m_AuthorityChildObject.transform.localScale;
@@ -621,11 +623,12 @@ private Vector3 RandomlyExcludeAxis(Vector3 delta)
621623
/// delta update, and it runs through 8 delta updates per unique test.
622624
/// </remarks>
623625
[UnityTest]
624-
public IEnumerator NetworkTransformMultipleChangesOverTime([Values] TransformSpace testLocalTransform, [Values] OverrideState overideState,
626+
public IEnumerator NetworkTransformMultipleChangesOverTime([Values] TransformSpace testLocalTransform,
625627
[Values] Precision precision, [Values] Rotation rotationSynch, [Values] Axis axis)
626628
{
627629
yield return s_DefaultWaitForTick;
628-
630+
// Just test for OverrideState.Update (they are already being tested for functionality in normal NetworkTransformTests)
631+
var overideState = OverrideState.Update;
629632
var tickRelativeTime = new WaitForSeconds(1.0f / m_ServerNetworkManager.NetworkConfig.TickRate);
630633
m_AuthoritativeTransform.InLocalSpace = testLocalTransform == TransformSpace.Local;
631634
bool axisX = axis == Axis.X || axis == Axis.XY || axis == Axis.XZ || axis == Axis.XYZ;
@@ -781,7 +784,7 @@ public IEnumerator NetworkTransformMultipleChangesOverTime([Values] TransformSpa
781784

782785
if (axisCount == 3)
783786
{
784-
// As a final test, wait for deltas to synchronize on non-authoritative side to assure it interpolates to th
787+
// As a final test, wait for deltas to synchronize on non-authoritative side to assure it interpolates to the correct values
785788
yield return WaitForConditionOrTimeOut(PositionRotationScaleMatches);
786789
// Provide additional debug info about what failed (if it fails)
787790
if (s_GlobalTimeoutHelper.TimedOut)
@@ -823,9 +826,11 @@ public IEnumerator NetworkTransformMultipleChangesOverTime([Values] TransformSpa
823826
/// from a child derived or external class.
824827
/// </summary>
825828
[UnityTest]
826-
public IEnumerator TestAuthoritativeTransformChangeOneAtATime([Values] TransformSpace testLocalTransform, [Values] Interpolation interpolation, [Values] OverrideState overideState)
829+
public IEnumerator TestAuthoritativeTransformChangeOneAtATime([Values] TransformSpace testLocalTransform, [Values] Interpolation interpolation)
827830
{
828-
var overrideUpdate = overideState == OverrideState.CommitToTransform;
831+
// Just test for OverrideState.Update (they are already being tested for functionality in normal NetworkTransformTests)
832+
var overideState = OverrideState.Update;
833+
var overrideUpdate = false;
829834
m_AuthoritativeTransform.Interpolate = interpolation == Interpolation.EnableInterpolate;
830835
m_NonAuthoritativeTransform.Interpolate = interpolation == Interpolation.EnableInterpolate;
831836

0 commit comments

Comments
 (0)