Skip to content

Commit 22f87dd

Browse files
test
Made a few adjustments to this test in order to debug, added additional logging, and marked this test as needing to be updated (and extended).
1 parent b73615c commit 22f87dd

File tree

3 files changed

+92
-38
lines changed

3 files changed

+92
-38
lines changed

testproject/Assets/Tests/Runtime/MessageOrdering.cs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
namespace TestProject.RuntimeTests
1111
{
12+
/// <summary>
13+
/// TODO: This test needs to be converted to an integration test
14+
/// </summary>
1215
public class MessageOrderingTests
1316
{
1417
private GameObject m_Prefab;
@@ -117,7 +120,7 @@ public IEnumerator SpawnRpcDespawn()
117120
//server.PrefabHandler.AddHandler(networkObject.GlobalObjectIdHash, handler);
118121
foreach (var client in m_ClientNetworkManagers)
119122
{
120-
var clientHandler = new SpawnRpcDespawnInstanceHandler(networkObject.GlobalObjectIdHash);
123+
var clientHandler = new SpawnRpcDespawnInstanceHandler(networkObject.GlobalObjectIdHash, client);
121124
client.PrefabHandler.AddHandler(networkObject, clientHandler);
122125
clientHandlers.Add(clientHandler);
123126
}
@@ -196,6 +199,8 @@ public IEnumerator SpawnRpcDespawn()
196199
Debug.Log($"It took {Time.frameCount - frameCountStart} frames to process the MessageOrdering.SpawnRpcDespawn integration test.");
197200
}
198201

202+
private ulong m_SpawnedNetworkObjectId;
203+
199204
[UnityTest]
200205
public IEnumerator RpcOnNetworkSpawn()
201206
{
@@ -211,15 +216,15 @@ public IEnumerator RpcOnNetworkSpawn()
211216
// Make it a prefab
212217
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(networkObject);
213218
var handlers = new List<SpawnRpcDespawnInstanceHandler>();
214-
var handler = new SpawnRpcDespawnInstanceHandler(networkObject.GlobalObjectIdHash);
219+
var handler = new SpawnRpcDespawnInstanceHandler(networkObject.GlobalObjectIdHash, server);
215220

216221
// We *must* always add a unique handler to both the server and the clients
217222
server.PrefabHandler.AddHandler(networkObject, handler);
218223
handlers.Add(handler);
219224
foreach (var client in clients)
220225
{
221226
// Create a unique SpawnRpcDespawnInstanceHandler per client
222-
handler = new SpawnRpcDespawnInstanceHandler(networkObject.GlobalObjectIdHash);
227+
handler = new SpawnRpcDespawnInstanceHandler(networkObject.GlobalObjectIdHash, client);
223228
handlers.Add(handler);
224229
client.PrefabHandler.AddHandler(networkObject, handler);
225230
}
@@ -249,10 +254,30 @@ public IEnumerator RpcOnNetworkSpawn()
249254
// [Host-Side] Check to make sure all clients are connected
250255
yield return NetcodeIntegrationTestHelpers.WaitForClientsConnectedToServer(server, clients.Length, null, 512);
251256

252-
var serverObject = Object.Instantiate(m_Prefab, Vector3.zero, Quaternion.identity);
253-
NetworkObject serverNetworkObject = serverObject.GetComponent<NetworkObject>();
254-
serverNetworkObject.NetworkManagerOwner = server;
255-
serverNetworkObject.Spawn();
257+
var serverNetworkObject = NetworkObject.InstantiateAndSpawn(m_Prefab, server);
258+
259+
m_SpawnedNetworkObjectId = serverNetworkObject.GlobalObjectIdHash;
260+
261+
// Make sure everyone spawns the object
262+
var allClientsSpawnedObject = false;
263+
var waitPeriod = new WaitForSeconds(1.0f / server.NetworkConfig.TickRate);
264+
var timeout = Time.realtimeSinceStartup + 4.0f;
265+
while (!allClientsSpawnedObject)
266+
{
267+
if (timeout < Time.realtimeSinceStartup)
268+
{
269+
Assert.Fail($"Timed out waiting for all clients to spawn {serverNetworkObject.name}!");
270+
}
271+
foreach (var client in clients)
272+
{
273+
if (!client.SpawnManager.SpawnedObjects.ContainsKey(m_SpawnedNetworkObjectId))
274+
{
275+
yield return waitPeriod;
276+
continue;
277+
}
278+
}
279+
allClientsSpawnedObject = true;
280+
}
256281

257282
// Wait until all objects have spawned.
258283
const int maxFrames = 240;

testproject/Assets/Tests/Runtime/Support/SpawnRpcDespawn.cs

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using NUnit.Framework;
32
using Unity.Netcode;
43
using UnityEngine;
@@ -7,7 +6,16 @@ namespace TestProject.RuntimeTests.Support
76
{
87
public class SpawnRpcDespawn : NetworkBehaviour, INetworkUpdateSystem
98
{
10-
public static NetworkUpdateStage TestStage;
9+
public static bool VerboseLogging;
10+
private static NetworkUpdateStage s_TestStage;
11+
public static NetworkUpdateStage TestStage
12+
{
13+
get { return s_TestStage; }
14+
set
15+
{
16+
s_TestStage = value;
17+
}
18+
}
1119
public static int ClientUpdateCount;
1220
public static int ServerUpdateCount;
1321
public static bool ClientNetworkSpawnRpcCalled;
@@ -17,69 +25,84 @@ public class SpawnRpcDespawn : NetworkBehaviour, INetworkUpdateSystem
1725

1826
private bool m_Active = false;
1927

28+
private void Log(string header, string msg)
29+
{
30+
if (!VerboseLogging)
31+
{
32+
return;
33+
}
34+
Debug.Log($"[{nameof(SpawnRpcDespawn)}][Client-{NetworkManager.LocalClientId}]{header} {msg}");
35+
}
36+
37+
private void Log(string msg)
38+
{
39+
if (!VerboseLogging)
40+
{
41+
return;
42+
}
43+
Log(string.Empty, msg);
44+
}
45+
2046
[ClientRpc]
2147
public void SendIncrementUpdateCountClientRpc()
2248
{
2349
Assert.AreEqual(NetworkUpdateStage.EarlyUpdate, NetworkUpdateLoop.UpdateStage);
2450

2551
StageExecutedByReceiver = NetworkUpdateLoop.UpdateStage;
2652
++ClientUpdateCount;
27-
Debug.Log($"Client RPC executed at {NetworkUpdateLoop.UpdateStage}; client count to {ClientUpdateCount.ToString()}");
53+
Log($"Client RPC executed at {NetworkUpdateLoop.UpdateStage}; client count to {ClientUpdateCount.ToString()}");
2854
}
2955

3056
public void IncrementUpdateCount()
3157
{
3258
++ServerUpdateCount;
33-
Debug.Log($"Server count to {ServerUpdateCount.ToString()}");
59+
Log($"Server count to {ServerUpdateCount.ToString()}");
3460
SendIncrementUpdateCountClientRpc();
3561
}
3662

3763
public void Activate()
3864
{
39-
Debug.Log("Activated");
65+
Log("Activated");
4066
m_Active = true;
4167
}
4268

4369
public override void OnNetworkSpawn()
4470
{
4571
if (!IsServer)
4672
{
73+
Log("Client instance spawning!");
4774
// Asserting that the RPC is not called before OnNetworkSpawn
4875
Assert.IsFalse(ClientNetworkSpawnRpcCalled);
4976
return;
5077
}
51-
78+
Log($"[Should execute: {ExecuteClientRpc}]", "Server instance spawning");
5279
if (ExecuteClientRpc)
5380
{
54-
TestClientRpc();
81+
Log($"[Executing]", $"Server invoking {nameof(ClientTestRpc)}.");
82+
ClientTestRpc();
5583
}
5684
}
5785

58-
[ClientRpc]
59-
private void TestClientRpc()
86+
[Rpc(SendTo.NotMe)]
87+
private void ClientTestRpc()
6088
{
89+
Log($"Received {nameof(ClientTestRpc)} message and processed it!");
6190
ClientNetworkSpawnRpcCalled = true;
6291
if (ShutdownInClientRpc)
6392
{
6493
NetworkManager.Shutdown();
6594
}
6695
}
6796

68-
public void Awake()
97+
protected override void OnNetworkPreSpawn(ref NetworkManager networkManager)
6998
{
70-
foreach (NetworkUpdateStage stage in Enum.GetValues(typeof(NetworkUpdateStage)))
71-
{
72-
NetworkUpdateLoop.RegisterNetworkUpdate(this, stage);
73-
}
99+
NetworkUpdateLoop.RegisterAllNetworkUpdates(this);
100+
base.OnNetworkPreSpawn(ref networkManager);
74101
}
75102

76103
public override void OnDestroy()
77104
{
78-
foreach (NetworkUpdateStage stage in Enum.GetValues(typeof(NetworkUpdateStage)))
79-
{
80-
NetworkUpdateLoop.UnregisterNetworkUpdate(this, stage);
81-
}
82-
105+
NetworkUpdateLoop.UnregisterAllNetworkUpdates(this);
83106
base.OnDestroy();
84107
}
85108

testproject/Assets/Tests/Runtime/Support/SpawnRpcDespawnInstanceHandler.cs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,36 @@ public class SpawnRpcDespawnInstanceHandler : INetworkPrefabInstanceHandler
1010

1111
public bool WasSpawned = false;
1212
public bool WasDestroyed = false;
13+
private NetworkManager m_NetworkManager;
1314

14-
public SpawnRpcDespawnInstanceHandler(uint prefabHash)
15+
public SpawnRpcDespawnInstanceHandler(uint prefabHash, NetworkManager networkManager)
1516
{
17+
m_NetworkManager = networkManager;
1618
m_PrefabHash = prefabHash;
1719
}
1820

1921
public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation)
2022
{
2123
WasSpawned = true;
22-
Assert.AreEqual(NetworkUpdateStage.EarlyUpdate, NetworkUpdateLoop.UpdateStage);
2324

25+
if (ownerClientId != NetworkManager.ServerClientId)
26+
{
27+
Assert.AreEqual(NetworkUpdateStage.EarlyUpdate, NetworkUpdateLoop.UpdateStage);
28+
}
2429

2530
// See if there is a valid registered NetworkPrefabOverrideLink associated with the provided prefabHash
2631
GameObject networkPrefabReference = null;
27-
if (NetworkManager.Singleton.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks.ContainsKey(m_PrefabHash))
32+
if (m_NetworkManager.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks.ContainsKey(m_PrefabHash))
2833
{
29-
switch (NetworkManager.Singleton.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks[m_PrefabHash].Override)
34+
switch (m_NetworkManager.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks[m_PrefabHash].Override)
3035
{
3136
default:
3237
case NetworkPrefabOverride.None:
33-
networkPrefabReference = NetworkManager.Singleton.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks[m_PrefabHash].Prefab;
38+
networkPrefabReference = m_NetworkManager.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks[m_PrefabHash].Prefab;
3439
break;
3540
case NetworkPrefabOverride.Hash:
3641
case NetworkPrefabOverride.Prefab:
37-
networkPrefabReference = NetworkManager.Singleton.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks[m_PrefabHash].OverridingTargetPrefab;
42+
networkPrefabReference = m_NetworkManager.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks[m_PrefabHash].OverridingTargetPrefab;
3843
break;
3944
}
4045
}
@@ -50,19 +55,20 @@ public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaterni
5055
}
5156

5257
// Otherwise, instantiate an instance of the NetworkPrefab linked to the prefabHash
53-
var networkObject = Object.Instantiate(networkPrefabReference, position, rotation).GetComponent<NetworkObject>();
54-
55-
return networkObject;
58+
return Object.Instantiate(networkPrefabReference, position, rotation).GetComponent<NetworkObject>();
5659
}
5760

5861
public void Destroy(NetworkObject networkObject)
5962
{
63+
if (m_NetworkManager.ShutdownInProgress)
64+
{
65+
return;
66+
}
6067
WasDestroyed = true;
61-
if (networkObject.NetworkManager.IsClient)
68+
if (!networkObject.NetworkManager.IsServer)
6269
{
6370
Assert.AreEqual(NetworkUpdateStage.EarlyUpdate, NetworkUpdateLoop.UpdateStage);
64-
}
65-
71+
}
6672
Object.Destroy(networkObject.gameObject);
6773
}
6874
}

0 commit comments

Comments
 (0)