Skip to content

Commit 683d15f

Browse files
fix
Fixing some issues with DistributedAuthorityCodecTests creating prefabs after having started the NetworkManager and issues with NetworkBehaviourTests having some bad/legacy technical debt in the initial design for those tests (particularly how it was checking if clients spawned objects).
1 parent 145aada commit 683d15f

File tree

3 files changed

+83
-46
lines changed

3 files changed

+83
-46
lines changed

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,23 @@ protected NetworkManager GetNonAuthorityNetworkManager()
218218
/// <remarks>Can only be true if <see cref="UseCMBService"/> returns true.</remarks>
219219
protected bool m_UseCmbService { get; private set; }
220220

221+
private string m_UseCmbServiceEnvString = null;
222+
private bool m_UseCmbServiceEnv;
223+
224+
/// <summary>
225+
/// Will set itself once and if already set then return true
226+
/// </summary>
227+
/// <returns>true/false</returns>
228+
internal bool UseCMBServiceEnviromentVariableSet()
229+
{
230+
if (!m_UseCmbServiceEnv && m_UseCmbServiceEnvString == null)
231+
{
232+
var useCmbService = Environment.GetEnvironmentVariable("USE_CMB_SERVICE") ?? "unset";
233+
m_UseCmbServiceEnv = useCmbService.ToLower() == "true";
234+
}
235+
return m_UseCmbServiceEnv;
236+
}
237+
221238
/// <summary>
222239
/// Indicates whether a hosted CMB service is available.
223240
/// </summary>
@@ -228,8 +245,7 @@ protected virtual bool UseCMBService()
228245
#if USE_CMB_SERVICE
229246
return true;
230247
#else
231-
var useCmbService = Environment.GetEnvironmentVariable("USE_CMB_SERVICE") ?? "unset";
232-
return useCmbService.ToLower() == "true";
248+
return UseCMBServiceEnviromentVariableSet();
233249
#endif
234250
}
235251

@@ -1438,6 +1454,8 @@ public void OneTimeTearDown()
14381454
#endif
14391455

14401456
IsRunning = false;
1457+
m_UseCmbServiceEnvString = null;
1458+
m_UseCmbServiceEnv = false;
14411459
}
14421460

14431461
/// <summary>

com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/DistributedAuthorityCodecTests.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ internal class DistributedAuthorityCodecTests : NetcodeIntegrationTest
4545
private static readonly ushort k_TransportPort = GetPortToBind();
4646
private const int k_ClientId = 0;
4747

48+
private GameObject m_TestPrefab;
49+
4850
/// <summary>
4951
/// Configures the port to look for the rust echo-server.
5052
/// </summary>
@@ -247,9 +249,7 @@ public IEnumerator NetworkVariableDelta()
247249
[UnityTest]
248250
public IEnumerator NetworkVariableDelta_WithValueUpdate()
249251
{
250-
var networkObj = CreateNetworkObjectPrefab("TestObject");
251-
networkObj.AddComponent<TestNetworkComponent>();
252-
var instance = SpawnObject(networkObj, Client);
252+
var instance = SpawnObject(m_SpawnObject, Client);
253253
yield return m_ClientCodecHook.WaitForMessageReceived<CreateObjectMessage>();
254254
var component = instance.GetComponent<TestNetworkComponent>();
255255

@@ -262,9 +262,7 @@ public IEnumerator NetworkVariableDelta_WithValueUpdate()
262262
[UnityTest]
263263
public IEnumerator NetworkListDelta_WithValueUpdate()
264264
{
265-
var networkObj = CreateNetworkObjectPrefab("TestObject");
266-
networkObj.AddComponent<TestNetworkComponent>();
267-
var instance = SpawnObject(networkObj, Client);
265+
var instance = SpawnObject(m_SpawnObject, Client);
268266
yield return m_ClientCodecHook.WaitForMessageReceived<CreateObjectMessage>();
269267
var component = instance.GetComponent<TestNetworkComponent>();
270268

com.unity.netcode.gameobjects/Tests/Runtime/NetworkBehaviourUpdaterTests.cs

Lines changed: 59 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
using System.Collections;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using System.Text;
45
using NUnit.Framework;
56
using Unity.Netcode.TestHelpers.Runtime;
67
using UnityEngine;
78
using UnityEngine.TestTools;
8-
using Object = UnityEngine.Object;
99

1010
namespace Unity.Netcode.RuntimeTests
1111
{
@@ -85,15 +85,6 @@ public void SetOwnerWrite()
8585
m_SeconValue = new NetworkVariable<int>(default, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Owner);
8686
}
8787

88-
public override void OnNetworkSpawn()
89-
{
90-
// Non-Authority will register each NetworkObject when it is spawned
91-
if ((NetworkManager.DistributedAuthorityMode && !IsOwner) || (!NetworkManager.DistributedAuthorityMode && !IsServer))
92-
{
93-
NetworkBehaviourUpdaterTests.ClientSideNotifyObjectSpawned(gameObject);
94-
}
95-
}
96-
9788
/// <summary>
9889
/// Server side only, sets the NetworkVariables being used to the ValueToSetNetVarTo
9990
/// that is pre-configured when the Network Prefab is created.
@@ -160,12 +151,14 @@ internal struct NetVarCombinationTypes
160151
internal class NetworkBehaviourUpdaterTests : NetcodeIntegrationTest
161152
{
162153
// Go ahead and create maximum number of clients (not all tests will use them)
163-
protected override int NumberOfClients => m_NumberOfClients;
154+
protected override int NumberOfClients => m_ClientCount;
164155
public const int NetVarValueToSet = 1;
165-
private static List<GameObject> s_ClientSpawnedNetworkObjects = new List<GameObject>();
156+
private List<ulong> m_SpawnedObjects = new List<ulong>();
166157
private GameObject m_PrefabToSpawn;
167158
private NetVarCombinationTypes m_NetVarCombinationTypes;
168-
private int m_NumberOfClients = 0;
159+
private int m_ClientCount = 0;
160+
161+
private StringBuilder m_ErrorLog = new StringBuilder();
169162

170163
public NetworkBehaviourUpdaterTests(HostOrServer hostOrServer, int numberOfClients, NetVarContainer.NetVarsToCheck first, NetVarContainer.NetVarsToCheck second) : base(hostOrServer)
171164
{
@@ -174,25 +167,24 @@ public NetworkBehaviourUpdaterTests(HostOrServer hostOrServer, int numberOfClien
174167
FirstType = first,
175168
SecondType = second
176169
};
177-
m_NumberOfClients = numberOfClients;
170+
// Adjust the client count if connecting to the service.
171+
m_ClientCount = UseCMBServiceEnviromentVariableSet() ? numberOfClients + 1 : numberOfClients;
178172
}
179173

180-
protected override IEnumerator OnSetup()
174+
protected override bool UseCMBService()
181175
{
182-
s_ClientSpawnedNetworkObjects.Clear();
183-
return base.OnSetup();
176+
return true;
184177
}
185178

186-
/// <summary>
187-
/// Clients will call this when NetworkObjects are spawned on their end
188-
/// </summary>
189-
/// <param name="objectSpaned">the GameObject of the NetworkObject spawned</param>
190-
public static void ClientSideNotifyObjectSpawned(GameObject objectSpaned)
179+
protected override void OnOneTimeTearDown()
191180
{
192-
if (!s_ClientSpawnedNetworkObjects.Contains(objectSpaned))
193-
{
194-
s_ClientSpawnedNetworkObjects.Add(objectSpaned);
195-
}
181+
base.OnOneTimeTearDown();
182+
}
183+
184+
protected override IEnumerator OnSetup()
185+
{
186+
m_SpawnedObjects.Clear();
187+
return base.OnSetup();
196188
}
197189

198190
protected override void OnServerAndClientsCreated()
@@ -221,6 +213,31 @@ protected override void OnServerAndClientsCreated()
221213
base.OnServerAndClientsCreated();
222214
}
223215

216+
/// <summary>
217+
/// Determines if all clients have spawned clone instances.
218+
/// </summary>
219+
/// <remarks>
220+
/// <see cref="m_ErrorLog"/> will contain log entries of the
221+
/// <see cref="NetworkManager"/> instances and NetworkObjects
222+
/// that did not get spawned.
223+
/// </remarks>
224+
/// <returns>true(success) or false (failure)</returns>
225+
private bool AllClientsSpawnedObjects()
226+
{
227+
m_ErrorLog.Clear();
228+
foreach (var networkManager in m_NetworkManagers)
229+
{
230+
foreach (var networkObjectId in m_SpawnedObjects)
231+
{
232+
if (!networkManager.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId))
233+
{
234+
m_ErrorLog.AppendLine($"[{networkManager.name}] Has not spawned {nameof(NetworkObject)}-{networkObjectId}.");
235+
}
236+
}
237+
}
238+
return m_ErrorLog.Length == 0;
239+
}
240+
224241
/// <summary>
225242
/// The updated BehaviourUpdaterAllTests was re-designed to replicate the same functionality being tested in the
226243
/// original version of this test with additional time out handling and a re-organization in the order of operations.
@@ -243,22 +260,19 @@ public IEnumerator BehaviourUpdaterAllTests([Values(1, 2)] int numToSpawn)
243260
// the appropriate number of NetworkObjects with the NetVarContainer behaviour
244261
var numberOfObjectsToSpawn = numToSpawn * NumberOfClients;
245262

246-
var authority = m_NetworkTopologyType == NetworkTopologyTypes.DistributedAuthority ? m_ClientNetworkManagers[0] : m_ServerNetworkManager;
263+
var authority = GetAuthorityNetworkManager();
247264

248265
// spawn the objects
249266
for (int i = 0; i < numToSpawn; i++)
250267
{
251-
var spawnedObject = Object.Instantiate(m_PrefabToSpawn);
268+
var spawnedObject = SpawnObject(m_PrefabToSpawn, authority);
252269
spawnedPrefabs.Add(spawnedObject);
253-
var networkSpawnedObject = spawnedObject.GetComponent<NetworkObject>();
254-
networkSpawnedObject.NetworkManagerOwner = authority;
255-
networkSpawnedObject.Spawn();
270+
m_SpawnedObjects.Add(spawnedObject.GetComponent<NetworkObject>().NetworkObjectId);
256271
}
257272

258273
// Waits for all clients to spawn the NetworkObjects
259-
yield return WaitForConditionOrTimeOut(() => numberOfObjectsToSpawn == s_ClientSpawnedNetworkObjects.Count);
260-
Assert.IsFalse(s_GlobalTimeoutHelper.TimedOut, $"Timed out waiting for clients to report spawning objects! " +
261-
$"Total reported client-side spawned objects {s_ClientSpawnedNetworkObjects.Count}");
274+
yield return WaitForConditionOrTimeOut(AllClientsSpawnedObjects);
275+
AssertOnTimeout($"Timed out waiting for clients to report spawning objects!\n {m_ErrorLog}");
262276

263277

264278
// Once all clients have spawned the NetworkObjects, set the network variables for
@@ -287,12 +301,19 @@ public IEnumerator BehaviourUpdaterAllTests([Values(1, 2)] int numToSpawn)
287301

288302
// Get a list of all NetVarContainer components on the client-side spawned NetworkObjects
289303
var clientSideNetVarContainers = new List<NetVarContainer>();
290-
foreach (var clientSpawnedObjects in s_ClientSpawnedNetworkObjects)
304+
foreach (var networkManager in m_NetworkManagers)
291305
{
292-
var netVarContainers = clientSpawnedObjects.GetComponents<NetVarContainer>();
293-
foreach (var netvarContiner in netVarContainers)
306+
if (networkManager == authority)
294307
{
295-
clientSideNetVarContainers.Add(netvarContiner);
308+
continue;
309+
}
310+
foreach (var networkObjectId in m_SpawnedObjects)
311+
{
312+
var netVarContainers = networkManager.SpawnManager.SpawnedObjects[networkObjectId].GetComponents<NetVarContainer>();
313+
foreach (var netvarContiner in netVarContainers)
314+
{
315+
clientSideNetVarContainers.Add(netvarContiner);
316+
}
296317
}
297318
}
298319

0 commit comments

Comments
 (0)