Skip to content

Commit 8768263

Browse files
test
Updating tests based on the fixes applied to this branch. A large portion is related to some integration tests trying to spawn NetworkObjects with a GlobalObjectIdHash value of zero(0).
1 parent e70d82a commit 8768263

8 files changed

Lines changed: 454 additions & 176 deletions

File tree

com.unity.netcode.gameobjects/Tests/Runtime/Connection/ConnectionApproval.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public ConnectionApprovalTests(PlayerCreation playerCreation)
4040

4141
private string m_ValidationToken;
4242

43+
internal override bool ShouldCreatePlayerPrefab()
44+
{
45+
return m_PlayerCreation != PlayerCreation.NoPlayer && m_PlayerCreation != PlayerCreation.FailValidation;
46+
}
47+
4348
protected override bool ShouldCheckForSpawnedPlayers()
4449
{
4550
return m_PlayerCreation != PlayerCreation.NoPlayer;

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

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public override void OnNetworkDespawn()
3939
protected override void OnServerAndClientsCreated()
4040
{
4141
m_PrefabToSpawn = CreateNetworkObjectPrefab("TestPrefab");
42+
m_PrefabToSpawn.AddComponent<SimpleNetworkBehaviour>();
4243

4344
var childObject = new GameObject
4445
{
@@ -137,32 +138,41 @@ public IEnumerator ValidatedDisableddNetworkBehaviourWarning([Values] bool disab
137138
public IEnumerator ValidateNoSpam()
138139
{
139140
m_AllowServerToStart = true;
140-
var objectToTest = new GameObject();
141-
var simpleNetworkBehaviour = objectToTest.AddComponent<SimpleNetworkBehaviour>();
142141

143142
// Now just start the Host
144143
yield return StartServerAndClients();
145144

146145
// set the log level to developer
147146
m_ServerNetworkManager.LogLevel = LogLevel.Developer;
148147

149-
// The only valid condition for this would be if the NetworkBehaviour is spawned.
150-
simpleNetworkBehaviour.IsSpawned = true;
148+
// We make an instance of the m_PrefabToSpawn
149+
var validateInstance = Object.Instantiate(m_PrefabToSpawn);
150+
// Then destroy the NetworkObject componwent of that instance.
151+
Object.DestroyImmediate(validateInstance.GetComponent<NetworkObject>());
151152

153+
// Now get the Networkbehaviour and verify when you attempt to get a reference
154+
// to the NetworkObject a warning is logged.
155+
var simpleNetworkBehaviour = validateInstance.GetComponent<SimpleNetworkBehaviour>();
156+
simpleNetworkBehaviour.IsSpawned = true;
157+
152158
// Verify the warning gets logged under normal conditions
153159
var isNull = simpleNetworkBehaviour.NetworkObject == null;
154160
LogAssert.Expect(LogType.Warning, $"[Netcode] Could not get {nameof(NetworkObject)} for the {nameof(NetworkBehaviour)}. Are you missing a {nameof(NetworkObject)} component?");
155161

156-
var networkObjectToTest = objectToTest.AddComponent<NetworkObject>();
157-
networkObjectToTest.NetworkManagerOwner = m_ServerNetworkManager;
158-
networkObjectToTest.Spawn();
162+
simpleNetworkBehaviour.IsSpawned = false;
163+
simpleNetworkBehaviour = null;
164+
// Destroy this test instance
165+
Object.DestroyImmediate(validateInstance);
166+
167+
// Now create a spawned instance (NetworkObject will exist)
168+
var instance = SpawnObject(m_PrefabToSpawn, GetAuthorityNetworkManager()).GetComponent<NetworkObject>();
159169

160170
// Assure no log messages are logged when they should not be logged
161-
isNull = simpleNetworkBehaviour.NetworkObject != null;
171+
isNull = instance.GetComponent<SimpleNetworkBehaviour>().NetworkObject != null;
162172
LogAssert.NoUnexpectedReceived();
163173

164-
networkObjectToTest.Despawn();
165-
Object.Destroy(networkObjectToTest);
174+
instance.Despawn();
175+
Object.Destroy(instance.gameObject);
166176
}
167177

168178
/// <summary>
@@ -182,13 +192,11 @@ public IEnumerator ValidateDeleteChildNetworkBehaviour()
182192
// Now just start the Host
183193
yield return StartServerAndClients();
184194

185-
var parentObject = new GameObject();
186-
var childObject = new GameObject();
187-
childObject.transform.parent = parentObject.transform;
188-
var parentNetworkObject = parentObject.AddComponent<NetworkObject>();
189-
childObject.AddComponent<SimpleNetworkBehaviour>();
190195

191-
parentNetworkObject.Spawn();
196+
var serverInstance = SpawnObject(m_PrefabToSpawn, GetAuthorityNetworkManager());
197+
var parentNetworkObject = serverInstance.GetComponent<NetworkObject>();
198+
var childObject = parentNetworkObject.transform.GetChild(0).gameObject;
199+
192200
yield return s_DefaultWaitForTick;
193201

194202
// Destroy the child object with child NetworkBehaviour
@@ -201,7 +209,7 @@ public IEnumerator ValidateDeleteChildNetworkBehaviour()
201209

202210
// Destroy the parent object which should not cause any exceptions
203211
// (validating the fix)
204-
Object.Destroy(parentObject);
212+
Object.Destroy(serverInstance);
205213
}
206214

207215
protected override void OnPlayerPrefabGameObjectCreated()

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

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,29 @@ public NetworkManagerPlayerPrefab(HostOrServer hostOrServer) : base(hostOrServer
2020
{
2121
}
2222

23-
/// <summary>
24-
/// Assure no player prefab is assigned.
25-
/// </summary>
26-
protected override void OnServerAndClientsCreated()
23+
internal override bool ShouldCreatePlayerPrefab()
2724
{
28-
foreach (var networkManager in m_NetworkManagers)
29-
{
30-
networkManager.NetworkConfig.PlayerPrefab = null;
31-
}
32-
base.OnServerAndClientsCreated();
25+
return false;
3326
}
3427

35-
protected override void OnNewClientCreated(NetworkManager networkManager)
36-
{
37-
networkManager.NetworkConfig.PlayerPrefab = null;
38-
base.OnNewClientCreated(networkManager);
39-
}
28+
///// <summary>
29+
///// Assure no player prefab is assigned.
30+
///// </summary>
31+
//protected override void OnServerAndClientsCreated()
32+
//{
33+
// foreach (var networkManager in m_NetworkManagers)
34+
// {
35+
// networkManager.NetworkConfig.Prefabs.Remove(m_PlayerPrefab);
36+
// networkManager.NetworkConfig.PlayerPrefab = null;
37+
// }
38+
// base.OnServerAndClientsCreated();
39+
//}
40+
41+
//protected override void OnNewClientCreated(NetworkManager networkManager)
42+
//{
43+
// networkManager.NetworkConfig.PlayerPrefab = null;
44+
// base.OnNewClientCreated(networkManager);
45+
//}
4046

4147
/// <summary>
4248
/// Do not wait for spawned players as there are none.

com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ protected override IEnumerator OnSetup()
2525
yield return null;
2626
}
2727

28-
protected override void OnServerAndClientsCreated()
28+
private GameObject GenerateAndRegisterPrefab()
2929
{
30-
m_Prefab = new GameObject("Object");
31-
var networkObject = m_Prefab.AddComponent<NetworkObject>();
32-
m_Prefab.AddComponent<EmptyComponent>();
33-
30+
var originalPrefabInstance = NetcodeIntegrationTestHelpers.CreateNetworkObject("PrefabTest");
3431
// Make it a prefab
35-
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(networkObject);
32+
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(originalPrefabInstance.GetComponent<NetworkObject>());
33+
3634

3735
m_ServerNetworkManager.NetworkConfig.SpawnTimeout = 0;
3836
m_ServerNetworkManager.NetworkConfig.ForceSamePrefabs = false;
@@ -41,6 +39,12 @@ protected override void OnServerAndClientsCreated()
4139
client.NetworkConfig.SpawnTimeout = 0;
4240
client.NetworkConfig.ForceSamePrefabs = false;
4341
}
42+
return originalPrefabInstance;
43+
}
44+
45+
protected override void OnServerAndClientsCreated()
46+
{
47+
RegisterPrefab();
4448
}
4549

4650
private EmptyComponent GetObjectForClient(ulong clientId)
@@ -50,15 +54,25 @@ private EmptyComponent GetObjectForClient(ulong clientId)
5054
{
5155
if (component.IsSpawned && component.NetworkManager.LocalClientId == clientId)
5256
{
53-
return component;
57+
var prefabGlobalObjectIdHash = m_Prefab.GetComponent<NetworkObject>().GlobalObjectIdHash;
58+
var componentGlobalObjectIdHash = m_Prefab.GetComponent<NetworkObject>().GlobalObjectIdHash;
59+
if (prefabGlobalObjectIdHash == componentGlobalObjectIdHash)
60+
{
61+
return component;
62+
}
5463
}
5564
}
5665
return null;
5766
}
5867

59-
private void RegisterPrefab()
68+
private void RegisterPrefab(bool includeClients = true)
6069
{
70+
m_Prefab = GenerateAndRegisterPrefab();
6171
m_ServerNetworkManager.AddNetworkPrefab(m_Prefab);
72+
if (!includeClients)
73+
{
74+
return;
75+
}
6276
foreach (var client in m_ClientNetworkManagers)
6377
{
6478
client.AddNetworkPrefab(m_Prefab);
@@ -89,7 +103,7 @@ public IEnumerator WhenSpawningBeforeAddingPrefab_SpawnFails()
89103
[UnityTest]
90104
public IEnumerator WhenSpawningAfterAddingServerPrefabButBeforeAddingClientPrefab_SpawnFails()
91105
{
92-
m_ServerNetworkManager.AddNetworkPrefab(m_Prefab);
106+
RegisterPrefab(false);
93107

94108
var serverObject = Object.Instantiate(m_Prefab);
95109
serverObject.GetComponent<NetworkObject>().NetworkManagerOwner = m_ServerNetworkManager;
@@ -104,10 +118,12 @@ public IEnumerator WhenSpawningAfterAddingPrefabOnServerAndClient_SpawnSucceeds(
104118
RegisterPrefab();
105119

106120
var serverObject = Object.Instantiate(m_Prefab);
107-
serverObject.GetComponent<NetworkObject>().NetworkManagerOwner = m_ServerNetworkManager;
108-
serverObject.GetComponent<NetworkObject>().Spawn();
109-
yield return NetcodeIntegrationTestHelpers.WaitForMessageOfTypeHandled<CreateObjectMessage>(m_ClientNetworkManagers[0]);
110-
Assert.IsNotNull(GetObjectForClient(m_ClientNetworkManagers[0].LocalClientId));
121+
var serverNetworkObject = serverObject.GetComponent<NetworkObject>();
122+
serverNetworkObject.NetworkManagerOwner = m_ServerNetworkManager;
123+
serverNetworkObject.Spawn();
124+
yield return WaitForSpawnedOnAllOrTimeOut(serverObject);
125+
AssertOnTimeout($"{serverObject.name} did not spawn on all clients!");
126+
Assert.IsTrue(m_ClientNetworkManagers[0].SpawnManager.SpawnedObjects.ContainsKey(serverNetworkObject.NetworkObjectId), $"Client did not spawn object!");
111127
}
112128

113129
[UnityTest]
@@ -116,10 +132,13 @@ public IEnumerator WhenSpawningAfterRemovingPrefabOnClient_SpawnFails()
116132
RegisterPrefab();
117133

118134
var serverObject = Object.Instantiate(m_Prefab);
135+
var serverNetworkObject = serverObject.GetComponent<NetworkObject>();
136+
119137
serverObject.GetComponent<NetworkObject>().NetworkManagerOwner = m_ServerNetworkManager;
120138
serverObject.GetComponent<NetworkObject>().Spawn();
121-
yield return NetcodeIntegrationTestHelpers.WaitForMessageOfTypeReceived<CreateObjectMessage>(m_ClientNetworkManagers[0]);
122-
Assert.IsNotNull(GetObjectForClient(m_ClientNetworkManagers[0].LocalClientId));
139+
yield return WaitForSpawnedOnAllOrTimeOut(serverObject);
140+
AssertOnTimeout($"{serverObject.name} did not spawn on all clients!");
141+
Assert.IsTrue(m_ClientNetworkManagers[0].SpawnManager.SpawnedObjects.ContainsKey(serverNetworkObject.NetworkObjectId), $"Client did not spawn object!");
123142

124143
serverObject.GetComponent<NetworkObject>().Despawn();
125144
yield return NetcodeIntegrationTestHelpers.WaitForMessageOfTypeReceived<DestroyObjectMessage>(m_ClientNetworkManagers[0]);

com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,22 @@ public void OneTimeSetup()
2828
private uint m_ObjectId = 1;
2929
private GameObject MakeValidNetworkPrefab()
3030
{
31-
Guid baseObjectID = NetworkManagerHelper.AddGameNetworkObject(k_TestPrefabObjectName + m_ObjectId.ToString());
32-
NetworkObject validPrefab = NetworkManagerHelper.InstantiatedNetworkObjects[baseObjectID];
33-
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(validPrefab);
31+
return GenerateAndRegisterPrefab();
32+
//Guid baseObjectID = NetworkManagerHelper.AddGameNetworkObject(k_TestPrefabObjectName + m_ObjectId.ToString());
33+
//NetworkObject validPrefab = NetworkManagerHelper.InstantiatedNetworkObjects[baseObjectID];
34+
//NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(validPrefab);
35+
//m_ObjectId++;
36+
//return validPrefab.gameObject;
37+
}
38+
39+
private GameObject GenerateAndRegisterPrefab()
40+
{
41+
// We must migrate this into the DDOL to avoid being
42+
var originalPrefabInstance = NetcodeIntegrationTestHelpers.CreateNetworkObject(k_TestPrefabObjectName + m_ObjectId.ToString());
43+
// Make it a prefab
44+
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(originalPrefabInstance.GetComponent<NetworkObject>());
3445
m_ObjectId++;
35-
return validPrefab.gameObject;
46+
return originalPrefabInstance;
3647
}
3748

3849

@@ -63,14 +74,23 @@ public void NetworkConfigInvalidNetworkPrefabTest()
6374
// Add a NetworkPrefab override with an invalid source prefab to override
6475
NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Prefab, SourcePrefabToOverride = null });
6576

66-
// Add a NetworkPrefab override with a valid source prefab to override but an invalid target prefab
67-
NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Prefab, SourcePrefabToOverride = MakeValidNetworkPrefab(), OverridingTargetPrefab = null });
6877

69-
// Add a valid prefab
70-
NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Prefab = MakeValidNetworkPrefab() });
78+
// Create a valid network prefab "asset".
79+
var validPrefabAsset = MakeValidNetworkPrefab().GetComponent<NetworkObject>();
7180

81+
// Add a NetworkPrefab override with a valid source prefab to override but an invalid target prefab.
82+
NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Prefab, SourcePrefabToOverride = validPrefabAsset.gameObject, OverridingTargetPrefab = null });
83+
84+
// Now add the valid asset as a network prefab with no override.
85+
NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Prefab = validPrefabAsset.gameObject });
86+
87+
var validPrefabForSourceHash = MakeValidNetworkPrefab().GetComponent<NetworkObject>();
88+
// This would be the scenario that a hash would be used (typically when scene management is disabled)
89+
validPrefabForSourceHash.InScenePlaced = true;
90+
7291
// Add a NetworkPrefab override with a valid hash and valid target prefab
73-
NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Hash, SourceHashToOverride = 11111111, OverridingTargetPrefab = MakeValidNetworkPrefab() });
92+
NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Hash, SourceHashToOverride = validPrefabForSourceHash.GlobalObjectIdHash, OverridingTargetPrefab = validPrefabAsset.gameObject });
93+
7494

7595
// Add a NetworkPrefab override with a valid prefab and valid target prefab
7696
NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Prefab, SourcePrefabToOverride = MakeValidNetworkPrefab(), OverridingTargetPrefab = MakeValidNetworkPrefab() });
@@ -88,7 +108,7 @@ public void NetworkConfigInvalidNetworkPrefabTest()
88108
Assert.False(exceptionOccurred);
89109

90110
// In the end we should only have 3 valid registered network prefabs
91-
Assert.True(NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks.Count == 3);
111+
Assert.AreEqual(3, NetworkManagerHelper.NetworkManagerObject.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks.Count);
92112
}
93113

94114
private const string k_PrefabObjectName = "NetworkPrefabHandlerTestObject";

0 commit comments

Comments
 (0)