diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs
new file mode 100644
index 0000000000..2b68ca0e30
--- /dev/null
+++ b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections;
+using NUnit.Framework;
+using UnityEngine;
+using UnityEngine.TestTools;
+using Object = UnityEngine.Object;
+
+namespace MLAPI.RuntimeTests
+{
+ public abstract class BaseMultiInstanceTest
+ {
+ protected GameObject m_PlayerPrefab;
+ protected NetworkManager m_ServerNetworkManager;
+ protected NetworkManager[] m_ClientNetworkManagers;
+
+ protected abstract int NbClients { get; }
+
+ [UnitySetUp]
+ public virtual IEnumerator Setup()
+ {
+ yield return StartSomeClientsAndServerWithPlayers(true, NbClients, _ => { });
+ }
+
+ [UnityTearDown]
+ public virtual IEnumerator Teardown()
+ {
+ // Shutdown and clean up both of our NetworkManager instances
+ try
+ {
+ MultiInstanceHelpers.Destroy();
+ }
+ catch (Exception e) { throw e; }
+ finally
+ {
+ if (m_PlayerPrefab != null)
+ {
+ Object.Destroy(m_PlayerPrefab);
+ m_PlayerPrefab = null;
+ }
+ }
+
+ // wait for next frame so everything is destroyed, so following tests can execute from clean environment
+ int nextFrameNumber = Time.frameCount + 1;
+ yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
+ }
+
+ ///
+ /// Utility to spawn some clients and a server and set them up
+ ///
+ ///
+ /// Update the prefab with whatever is needed before players spawn
+ ///
+ public IEnumerator StartSomeClientsAndServerWithPlayers(bool useHost, int nbClients, Action updatePlayerPrefab)
+ {
+ // Create multiple NetworkManager instances
+ if (!MultiInstanceHelpers.Create(nbClients, out NetworkManager server, out NetworkManager[] clients))
+ {
+ Debug.LogError("Failed to create instances");
+ Assert.Fail("Failed to create instances");
+ }
+
+ m_ClientNetworkManagers = clients;
+ m_ServerNetworkManager = server;
+
+ // Create playerPrefab
+ m_PlayerPrefab = new GameObject("Player");
+ NetworkObject networkObject = m_PlayerPrefab.AddComponent();
+
+ /*
+ * Normally we would only allow player prefabs to be set to a prefab. Not runtime created objects.
+ * In order to prevent having a Resource folder full of a TON of prefabs that we have to maintain,
+ * MultiInstanceHelper has a helper function that lets you mark a runtime created object to be
+ * treated as a prefab by the MLAPI. That's how we can get away with creating the player prefab
+ * at runtime without it being treated as a SceneObject or causing other conflicts with the MLAPI.
+ */
+ // Make it a prefab
+ MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
+
+ updatePlayerPrefab(m_PlayerPrefab); // update player prefab with whatever is needed before players are spawned
+
+ // Set the player prefab
+ server.NetworkConfig.PlayerPrefab = m_PlayerPrefab;
+
+ for (int i = 0; i < clients.Length; i++)
+ {
+ clients[i].NetworkConfig.PlayerPrefab = m_PlayerPrefab;
+ }
+
+ // Start the instances
+ if (!MultiInstanceHelpers.Start(useHost, server, clients))
+ {
+ Debug.LogError("Failed to start instances");
+ Assert.Fail("Failed to start instances");
+ }
+
+ // Wait for connection on client side
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients));
+
+ // Wait for connection on server side
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnectedToServer(server, clientCount: useHost ? nbClients + 1 : nbClients));
+ }
+ }
+}
diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs.meta
new file mode 100644
index 0000000000..94eb21978a
--- /dev/null
+++ b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 789a3189410645aca48f11a51c823418
+timeCreated: 1621620979
\ No newline at end of file
diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs
index 5c3360e64d..af962d18a6 100644
--- a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs
+++ b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs
@@ -8,9 +8,10 @@
namespace MLAPI.RuntimeTests
{
- public class NetworkObjectOnSpawnTests
+ public class NetworkObjectOnSpawnTests : BaseMultiInstanceTest
{
- private GameObject m_Prefab;
+ protected override int NbClients => 2;
+
///
/// Tests that instantiating a and destroying without spawning it
@@ -45,6 +46,16 @@ public override void OnNetworkDespawn()
}
}
+ [UnitySetUp]
+ public override IEnumerator Setup()
+ {
+ yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab =>
+ {
+ // add test component
+ playerPrefab.AddComponent();
+ });
+ }
+
///
/// Test that callbacks are run for playerobject spawn, despawn, regular spawn, destroy on server.
///
@@ -52,51 +63,17 @@ public override void OnNetworkDespawn()
[UnityTest]
public IEnumerator TestOnNetworkSpawnCallbacks()
{
- // Create Host and (numClients) clients
- Assert.True(MultiInstanceHelpers.Create(2, out NetworkManager server, out NetworkManager[] clients));
-
- // Create a default player GameObject to use
- m_Prefab = new GameObject("TestObject");
- var networkObject = m_Prefab.AddComponent();
-
- // add test component
- m_Prefab.AddComponent();
-
- // Make it a prefab
- MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
-
- // Set the player prefab
- server.NetworkConfig.PlayerPrefab = m_Prefab;
-
- // Set all of the client's player prefab
- for (int i = 0; i < clients.Length; i++)
- {
- clients[i].NetworkConfig.PlayerPrefab = m_Prefab;
- }
-
- // Start the instances
- if (!MultiInstanceHelpers.Start(true, server, clients))
- {
- Assert.Fail("Failed to start instances");
- }
-
- // [Client-Side] Wait for a connection to the server
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients, null, 512));
-
- // [Host-Side] Check to make sure all clients are connected
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnectedToServer(server, clients.Length + 1, null, 512));
-
// [Host-Side] Get the Host owned instance
var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), server, serverClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult));
var serverInstance = serverClientPlayerResult.Result.GetComponent();
var clientInstances = new List();
- foreach (var client in clients)
+ foreach (var client in m_ClientNetworkManagers)
{
var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), client, clientClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), client, clientClientPlayerResult));
var clientRpcTests = clientClientPlayerResult.Result.GetComponent();
Assert.IsNotNull(clientRpcTests);
clientInstances.Add(clientRpcTests);
@@ -171,9 +148,6 @@ public IEnumerator TestOnNetworkSpawnCallbacks()
{
Assert.AreEqual(1, clientInstance.OnNetworkDespawnCalledCount);
}
-
- // Shutdown and clean up both of our NetworkManager instances
- MultiInstanceHelpers.Destroy();
}
private class TrackOnSpawnFunctions : NetworkBehaviour
@@ -191,15 +165,5 @@ public override void OnNetworkDespawn()
OnNetworkDespawnCalledCount++;
}
}
-
- [TearDown]
- public void TearDown()
- {
- if (m_Prefab != null)
- {
- Object.Destroy(m_Prefab);
- m_Prefab = null;
- }
- }
}
}
diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkSpawnManagerTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkSpawnManagerTests.cs
index e09b1a2084..6702dd5423 100644
--- a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkSpawnManagerTests.cs
+++ b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkSpawnManagerTests.cs
@@ -6,59 +6,13 @@
namespace MLAPI.RuntimeTests
{
- public class NetworkSpawnManagerTests
+ public class NetworkSpawnManagerTests : BaseMultiInstanceTest
{
- private NetworkManager m_ServerNetworkManager;
- private NetworkManager[] m_ClientNetworkManagers;
- private GameObject m_PlayerPrefab;
-
private ulong serverSideClientId => m_ServerNetworkManager.ServerClientId;
private ulong clientSideClientId => m_ClientNetworkManagers[0].LocalClientId;
private ulong otherClientSideClientId => m_ClientNetworkManagers[1].LocalClientId;
- [UnitySetUp]
- public IEnumerator Setup()
- {
- // Create multiple NetworkManager instances
- if (!MultiInstanceHelpers.Create(2, out NetworkManager server, out NetworkManager[] clients))
- {
- Debug.LogError("Failed to create instances");
- Assert.Fail("Failed to create instances");
- }
-
- m_ServerNetworkManager = server;
- m_ClientNetworkManagers = clients;
-
- // Create playerPrefab
- m_PlayerPrefab = new GameObject("Player");
- NetworkObject networkObject = m_PlayerPrefab.AddComponent();
-
- // Make it a prefab
- MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
-
- // Set the player prefab
- server.NetworkConfig.PlayerPrefab = m_PlayerPrefab;
-
- for (int i = 0; i < clients.Length; i++)
- {
- clients[i].NetworkConfig.PlayerPrefab = m_PlayerPrefab;
- }
-
- // Start the instances
- if (!MultiInstanceHelpers.Start(true, server, clients))
- {
- Assert.Fail("Failed to start instances");
- }
-
- // Wait for connection on client side
- for (int i = 0; i < clients.Length; i++)
- {
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnected(clients[i]));
- }
-
- // Wait for connection on server side
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnectedToServer(server, clientCount: 3));
- }
+ protected override int NbClients => 2;
[Test]
public void TestServerCanAccessItsOwnPlayer()
@@ -168,20 +122,9 @@ public IEnumerator TestConnectAndDisconnect()
var nbConnectedClients = m_ServerNetworkManager.ConnectedClients.Count;
MultiInstanceHelpers.StopOneClient(newClientNetworkManager);
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForCondition(() => m_ServerNetworkManager.ConnectedClients.Count == nbConnectedClients - 1));
+
serverSideNewClientPlayer = m_ServerNetworkManager.SpawnManager.GetPlayerNetworkObject(newClientLocalClientId);
Assert.Null(serverSideNewClientPlayer);
}
-
- [UnityTearDown]
- public IEnumerator Teardown()
- {
- // Shutdown and clean up both of our NetworkManager instances
- MultiInstanceHelpers.Destroy();
- Object.Destroy(m_PlayerPrefab);
-
- // wait for next frame so everything is destroyed, so following tests can execute from clean environment
- int nextFrameNumber = Time.frameCount + 1;
- yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
- }
}
}
diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs
index 804d2006b5..edb0a1464a 100644
--- a/com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs
+++ b/com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs
@@ -8,7 +8,7 @@
namespace MLAPI.RuntimeTests
{
- public class RpcTests
+ public class RpcTests : BaseMultiInstanceTest
{
public class RpcTestNB : NetworkBehaviour
{
@@ -28,60 +28,27 @@ public void MyClientRpc()
}
}
- [UnityTest]
- public IEnumerator TestRpcs()
- {
- // Create multiple NetworkManager instances
- if (!MultiInstanceHelpers.Create(1, out NetworkManager server, out NetworkManager[] clients))
- {
- Debug.LogError("Failed to create instances");
- Assert.Fail("Failed to create instances");
- }
-
- /*
- * Normally we would only allow player prefabs to be set to a prefab. Not runtime created objects.
- * In order to prevent having a Resource folder full of a TON of prefabs that we have to maintain,
- * MultiInstanceHelper has a helper function that lets you mark a runtime created object to be
- * treated as a prefab by the MLAPI. That's how we can get away with creating the player prefab
- * at runtime without it being treated as a SceneObject or causing other conflicts with the MLAPI.
- */
-
- // Create playerPrefab
- var playerPrefab = new GameObject("Player");
- NetworkObject networkObject = playerPrefab.AddComponent();
- playerPrefab.AddComponent();
-
- // Make it a prefab
- MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
-
- // Set the player prefab
- server.NetworkConfig.PlayerPrefab = playerPrefab;
-
- for (int i = 0; i < clients.Length; i++)
- {
- clients[i].NetworkConfig.PlayerPrefab = playerPrefab;
- }
+ protected override int NbClients => 1;
- // Start the instances
- if (!MultiInstanceHelpers.Start(true, server, clients))
+ [UnitySetUp]
+ public override IEnumerator Setup()
+ {
+ yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab =>
{
- Assert.Fail("Failed to start instances");
- }
-
-
- // Wait for connection on client side
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients));
-
- // Wait for connection on server side
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnectedToServer(server));
+ playerPrefab.AddComponent();
+ });
+ }
+ [UnityTest]
+ public IEnumerator TestRpcs()
+ {
// This is the *SERVER VERSION* of the *CLIENT PLAYER*
var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), server, serverClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult));
// This is the *CLIENT VERSION* of the *CLIENT PLAYER*
var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), clients[0], clientClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult));
// Setup state
bool hasReceivedServerRpc = false;
@@ -125,9 +92,6 @@ public IEnumerator TestRpcs()
Assert.True(hasReceivedServerRpc, "ServerRpc was not received");
Assert.True(hasReceivedClientRpcLocally, "ClientRpc was not locally received on the server");
Assert.True(hasReceivedClientRpcRemotely, "ClientRpc was not remotely received on the client");
-
- // Cleanup
- MultiInstanceHelpers.Destroy();
}
}
}
diff --git a/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs b/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs
index 5ecc155f0b..2f24cc284e 100644
--- a/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs
+++ b/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs
@@ -7,14 +7,13 @@
using MLAPI.RuntimeTests;
using MLAPI.Serialization;
using MLAPI.Messaging;
+using UnityEditorInternal;
using Debug = UnityEngine.Debug;
namespace TestProject.RuntimeTests
{
- public class RpcINetworkSerializable
+ public class RpcINetworkSerializable : BaseMultiInstanceTest
{
- private GameObject m_PlayerPrefab;
-
private UserSerializableClass m_UserSerializableClass;
private List m_UserSerializableClassArray;
@@ -23,6 +22,14 @@ public class RpcINetworkSerializable
private bool m_IsSendingNull;
private bool m_IsArrayEmpty;
+ protected override int NbClients => 1;
+
+ [UnitySetUp]
+ public override IEnumerator Setup()
+ {
+ yield break; // ignore
+ }
+
///
/// Tests that INetworkSerializable can be used through RPCs by a user
///
@@ -31,43 +38,16 @@ public class RpcINetworkSerializable
public IEnumerator NetworkSerializableTest()
{
m_FinishedTest = false;
- var numClients = 1;
var startTime = Time.realtimeSinceStartup;
- // Create Host and (numClients) clients
- Assert.True(MultiInstanceHelpers.Create(numClients, out NetworkManager server, out NetworkManager[] clients));
-
- // Create a default player GameObject to use
- m_PlayerPrefab = new GameObject("Player");
- var networkObject = m_PlayerPrefab.AddComponent();
- m_PlayerPrefab.AddComponent();
-
- // Make it a prefab
- MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
-
- // [Host-Side] Set the player prefab
- server.NetworkConfig.PlayerPrefab = m_PlayerPrefab;
-
- foreach (var client in clients)
- {
- client.NetworkConfig.PlayerPrefab = m_PlayerPrefab;
- }
-
- // Start the instances
- if (!MultiInstanceHelpers.Start(true, server, clients))
+ yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab =>
{
- Assert.Fail("Failed to start instances");
- }
-
- // [Client-Side] Wait for a connection to the server
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients, null, 512));
-
- // [Host-Side] Check to make sure all clients are connected
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnectedToServer(server, clients.Length + 1, null, 512));
+ playerPrefab.AddComponent();
+ });
// [Client-Side] We only need to get the client side Player's NetworkObject so we can grab that instance of the TestSerializationComponent
var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), clients[0], clientClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult));
var clientSideNetworkBehaviourClass = clientClientPlayerResult.Result.gameObject.GetComponent();
clientSideNetworkBehaviourClass.OnSerializableClassUpdated = OnClientReceivedUserSerializableClassUpdated;
@@ -111,9 +91,8 @@ public IEnumerator NetworkSerializableTest()
}
// End of test
- clients[0].StopClient();
- server.StopHost();
-
+ m_ClientNetworkManagers[0].StopClient();
+ m_ServerNetworkManager.StopHost();
}
///
@@ -177,49 +156,22 @@ public IEnumerator NetworkSerializableArrayTestHandler(int arraySize, bool sendN
m_IsArrayEmpty = true;
}
- var numClients = 1;
var startTime = Time.realtimeSinceStartup;
- // Create Host and (numClients) clients
- Assert.True(MultiInstanceHelpers.Create(numClients, out NetworkManager server, out NetworkManager[] clients));
-
- // Create a default player GameObject to use
- m_PlayerPrefab = new GameObject("Player");
- var networkObject = m_PlayerPrefab.AddComponent();
- m_PlayerPrefab.AddComponent();
-
- // Make it a prefab
- MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
-
- // [Host-Side] Set the player prefab
- server.NetworkConfig.PlayerPrefab = m_PlayerPrefab;
-
- foreach (var client in clients)
+ yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab =>
{
- client.NetworkConfig.PlayerPrefab = m_PlayerPrefab;
- }
-
- // Start the instances
- if (!MultiInstanceHelpers.Start(true, server, clients))
- {
- Assert.Fail("Failed to start instances");
- }
-
- // [Client-Side] Wait for a connection to the server
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients, null, 512));
-
- // [Host-Side] Check to make sure all clients are connected
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnectedToServer(server, clients.Length + 1, null, 512));
+ playerPrefab.AddComponent();
+ });
// [Host-Side] Get the host-server side Player's NetworkObject so we can grab that instance of the TestCustomTypesArrayComponent
var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), server, serverClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult));
var serverSideNetworkBehaviourClass = serverClientPlayerResult.Result.gameObject.GetComponent();
serverSideNetworkBehaviourClass.OnSerializableClassesUpdatedServerRpc = OnServerReceivedUserSerializableClassesUpdated;
// [Client-Side] Get the client side Player's NetworkObject so we can grab that instance of the TestCustomTypesArrayComponent
var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), clients[0], clientClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult));
var clientSideNetworkBehaviourClass = clientClientPlayerResult.Result.gameObject.GetComponent();
clientSideNetworkBehaviourClass.OnSerializableClassesUpdatedClientRpc = OnClientReceivedUserSerializableClassesUpdated;
@@ -261,8 +213,8 @@ public IEnumerator NetworkSerializableArrayTestHandler(int arraySize, bool sendN
Assert.False(timedOut);
// End of test
- clients[0].StopClient();
- server.StopHost();
+ m_ClientNetworkManagers[0].StopClient();
+ m_ServerNetworkManager.StopHost();
}
@@ -314,18 +266,6 @@ private void OnServerReceivedUserSerializableClassesUpdated(UserSerializableClas
ValidateUserSerializableClasses(userSerializableClass);
}
- [TearDown]
- public void TearDown()
- {
- if (m_PlayerPrefab != null)
- {
- Object.Destroy(m_PlayerPrefab);
- m_PlayerPrefab = null;
- }
-
- // Shutdown and clean up both of our NetworkManager instances
- MultiInstanceHelpers.Destroy();
- }
}
///
diff --git a/testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs b/testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs
index 191dfa0168..6d10b7e9e2 100644
--- a/testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs
+++ b/testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
@@ -7,14 +8,22 @@
using MLAPI.RuntimeTests;
using MLAPI;
using Debug = UnityEngine.Debug;
+using Object = UnityEngine.Object;
namespace TestProject.RuntimeTests
{
- public class RpcTestsAutomated
+ public class RpcTestsAutomated : BaseMultiInstanceTest
{
private bool m_TimedOut;
private int m_MaxFrames;
- private GameObject m_PlayerPrefab;
+
+ protected override int NbClients => throw new NotSupportedException("Not implemented on purpose, setup is implementing this itself");
+
+ [UnitySetUp]
+ public override IEnumerator Setup()
+ {
+ yield break;
+ }
///
/// Default Mode (Batched RPCs Enabled)
@@ -54,52 +63,23 @@ private IEnumerator AutomatedRpcTestsHandler(int numClients, bool useBatching =
// Set RpcQueueManualTests into unit testing mode
RpcQueueManualTests.UnitTesting = true;
- // Create Host and (numClients) clients
- Assert.True(MultiInstanceHelpers.Create(numClients, out NetworkManager server, out NetworkManager[] clients));
-
- // Create a default player GameObject to use
- m_PlayerPrefab = new GameObject("Player");
- var networkObject = m_PlayerPrefab.AddComponent();
-
- // Add our RpcQueueManualTests component
- m_PlayerPrefab.AddComponent();
-
- // Make it a prefab
- MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
-
- // Set the player prefab
- server.NetworkConfig.PlayerPrefab = m_PlayerPrefab;
-
-
- // Set all of the client's player prefab
- for (int i = 0; i < clients.Length; i++)
- {
- clients[i].NetworkConfig.PlayerPrefab = m_PlayerPrefab;
- }
-
- // Start the instances
- if (!MultiInstanceHelpers.Start(true, server, clients))
+ yield return StartSomeClientsAndServerWithPlayers(useHost:true, numClients, playerPrefab =>
{
- Assert.Fail("Failed to start instances");
- }
+ // Add our RpcQueueManualTests component
+ playerPrefab.AddComponent();
+ });
// Set the RPC Batch sending mode
- server.RpcQueueContainer.EnableBatchedRpcs(useBatching);
+ m_ServerNetworkManager.RpcQueueContainer.EnableBatchedRpcs(useBatching);
- for (int i = 0; i < clients.Length; i++)
+ for (int i = 0; i < m_ClientNetworkManagers.Length; i++)
{
- clients[i].RpcQueueContainer.EnableBatchedRpcs(useBatching);
+ m_ClientNetworkManagers[i].RpcQueueContainer.EnableBatchedRpcs(useBatching);
}
- // [Client-Side] Wait for a connection to the server
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients, null, 512));
-
- // [Host-Side] Check to make sure all clients are connected
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnectedToServer(server, clients.Length + 1, null, 512));
-
// [Host-Side] Get the Host owned instance of the RpcQueueManualTests
var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), server, serverClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult));
var serverRpcTests = serverClientPlayerResult.Result.GetComponent();
Assert.IsNotNull(serverRpcTests);
@@ -109,10 +89,10 @@ private IEnumerator AutomatedRpcTestsHandler(int numClients, bool useBatching =
// [Client-Side] Get all of the RpcQueueManualTests instances relative to each client
var clientRpcQueueManualTestInstsances = new List();
- foreach (var client in clients)
+ foreach (var client in m_ClientNetworkManagers)
{
var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
- yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == clients[0].LocalClientId), client, clientClientPlayerResult));
+ yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), client, clientClientPlayerResult));
var clientRpcTests = clientClientPlayerResult.Result.GetComponent();
Assert.IsNotNull(clientRpcTests);
clientRpcQueueManualTestInstsances.Add(clientRpcTests);
@@ -169,18 +149,5 @@ private IEnumerator AutomatedRpcTestsHandler(int numClients, bool useBatching =
Debug.Log($"Total frames updated = {Time.frameCount - startFrameCount} within {Time.realtimeSinceStartup - startTime} seconds.");
}
-
- [TearDown]
- public void TearDown()
- {
- if (m_PlayerPrefab != null)
- {
- Object.Destroy(m_PlayerPrefab);
- m_PlayerPrefab = null;
- }
-
- // Shutdown and clean up both of our NetworkManager instances
- MultiInstanceHelpers.Destroy();
- }
}
}