From e6910abd80dbf245130fe54f7f204c9b33509901 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 21 Jun 2021 13:37:16 -0400 Subject: [PATCH 1/3] Revert "moving this to a separate PR" This reverts commit b3d89cde452046b471ba5d019053d08d9181b329. --- .../Tests/Runtime/BaseMultiInstanceTest.cs | 77 +++++++++++++++++++ .../Runtime/BaseMultiInstanceTest.cs.meta | 3 + 2 files changed, 80 insertions(+) create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs.meta 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..20909236d7 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections; +using NUnit.Framework; +using UnityEngine; + +namespace MLAPI.RuntimeTests +{ + public abstract class BaseMultiInstanceTest + { + private int m_OriginalTargetFrameRate; + + protected GameObject m_PlayerPrefab; + + protected NetworkManager m_ServerNetworkManager; + protected NetworkManager[] m_ClientNetworkManagers; + + public virtual IEnumerator Teardown() + { + // Shutdown and clean up both of our NetworkManager instances + MultiInstanceHelpers.Destroy(); + + yield return new WaitForSeconds(0); // wait for next frame so everything is destroyed, so following tests can execute from clean environment + } + + /// + /// Utility to spawn some clients and a server and set them up + /// + /// + /// Update the prefab with whatever is needed before players spawn + /// + public IEnumerator StartSomeClientsAndServer(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(); + + // 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 + 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: 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 From 75c1128bbd682c34ad6d1a952d0dba603ddb394d Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 21 Jun 2021 15:42:33 -0400 Subject: [PATCH 2/3] Adding this to all appropriate tests --- .../Tests/Runtime/BaseMultiInstanceTest.cs | 43 +++++-- .../NetworkObjectOnSpawnTests.cs | 68 +++-------- .../Tests/Runtime/NetworkSpawnManagerTests.cs | 63 +---------- .../Tests/Runtime/RpcTests.cs | 64 +++-------- .../Tests/Runtime/RpcINetworkSerializable.cs | 106 ++++-------------- .../Assets/Tests/Runtime/RpcTestsAutomated.cs | 75 ++++--------- 6 files changed, 113 insertions(+), 306 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs index 20909236d7..c2a3462967 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs @@ -2,6 +2,8 @@ using System.Collections; using NUnit.Framework; using UnityEngine; +using UnityEngine.TestTools; +using Object = UnityEngine.Object; namespace MLAPI.RuntimeTests { @@ -14,12 +16,35 @@ public abstract class BaseMultiInstanceTest protected NetworkManager m_ServerNetworkManager; protected NetworkManager[] m_ClientNetworkManagers; + public 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 - MultiInstanceHelpers.Destroy(); + try + { + MultiInstanceHelpers.Destroy(); + } + catch (Exception e) { throw e; } + finally + { + if (m_PlayerPrefab != null) + { + Object.Destroy(m_PlayerPrefab); + m_PlayerPrefab = null; + } + } - yield return new WaitForSeconds(0); // wait for next frame so everything is destroyed, so following tests can execute from clean environment + // 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); } /// @@ -28,7 +53,7 @@ public virtual IEnumerator Teardown() /// /// Update the prefab with whatever is needed before players spawn /// - public IEnumerator StartSomeClientsAndServer(bool useHost, int nbClients, Action updatePlayerPrefab) + public IEnumerator StartSomeClientsAndServerWithPlayers(bool useHost, int nbClients, Action updatePlayerPrefab) { // Create multiple NetworkManager instances if (!MultiInstanceHelpers.Create(nbClients, out NetworkManager server, out NetworkManager[] clients)) @@ -44,6 +69,13 @@ public IEnumerator StartSomeClientsAndServer(bool useHost, int nbClients, Action 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); @@ -65,10 +97,7 @@ public IEnumerator StartSomeClientsAndServer(bool useHost, int nbClients, Action } // Wait for connection on client side - for (int i = 0; i < clients.Length; i++) - { - yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnected(clients[i])); - } + 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/NetworkObject/NetworkObjectOnSpawnTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs index 0bf6720dad..bddd6d1273 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; + public override int NbClients => 2; + /// /// Tests that instantiating a and destroying without spawning it @@ -48,6 +49,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. /// @@ -55,51 +66,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); @@ -174,9 +151,6 @@ public IEnumerator TestOnNetworkSpawnCallbacks() { Assert.AreEqual(1, clientInstance.OnNetworkDespawnCalledCount); } - - // Shutdown and clean up both of our NetworkManager instances - MultiInstanceHelpers.Destroy(); } private class TrackOnSpawnFunctions : NetworkBehaviour @@ -194,15 +168,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..41705fb637 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)); - } + public 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..4c60b927dd 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; - } + public 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..dc2b59a6a6 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; + public 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..8de96fe85d 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; + + public 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(); - } } } From e5d7626e702bebd065e652b855cd196d15ac691a Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 21 Jun 2021 15:48:31 -0400 Subject: [PATCH 3/3] cleanup --- .../Tests/Runtime/BaseMultiInstanceTest.cs | 5 +---- .../Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs | 2 +- .../Tests/Runtime/NetworkSpawnManagerTests.cs | 2 +- com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs | 2 +- testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs | 2 +- testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs | 2 +- 6 files changed, 6 insertions(+), 9 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs index c2a3462967..2b68ca0e30 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/BaseMultiInstanceTest.cs @@ -9,14 +9,11 @@ namespace MLAPI.RuntimeTests { public abstract class BaseMultiInstanceTest { - private int m_OriginalTargetFrameRate; - protected GameObject m_PlayerPrefab; - protected NetworkManager m_ServerNetworkManager; protected NetworkManager[] m_ClientNetworkManagers; - public abstract int NbClients { get; } + protected abstract int NbClients { get; } [UnitySetUp] public virtual IEnumerator Setup() diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs index bddd6d1273..0404e23e21 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs @@ -10,7 +10,7 @@ namespace MLAPI.RuntimeTests { public class NetworkObjectOnSpawnTests : BaseMultiInstanceTest { - public override int NbClients => 2; + protected override int NbClients => 2; /// diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkSpawnManagerTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkSpawnManagerTests.cs index 41705fb637..6702dd5423 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkSpawnManagerTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkSpawnManagerTests.cs @@ -12,7 +12,7 @@ public class NetworkSpawnManagerTests : BaseMultiInstanceTest private ulong clientSideClientId => m_ClientNetworkManagers[0].LocalClientId; private ulong otherClientSideClientId => m_ClientNetworkManagers[1].LocalClientId; - public override int NbClients => 2; + protected override int NbClients => 2; [Test] public void TestServerCanAccessItsOwnPlayer() diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs index 4c60b927dd..edb0a1464a 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/RpcTests.cs @@ -28,7 +28,7 @@ public void MyClientRpc() } } - public override int NbClients => 1; + protected override int NbClients => 1; [UnitySetUp] public override IEnumerator Setup() diff --git a/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs b/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs index dc2b59a6a6..2f24cc284e 100644 --- a/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs +++ b/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs @@ -22,7 +22,7 @@ public class RpcINetworkSerializable : BaseMultiInstanceTest private bool m_IsSendingNull; private bool m_IsArrayEmpty; - public override int NbClients => 1; + protected override int NbClients => 1; [UnitySetUp] public override IEnumerator Setup() diff --git a/testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs b/testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs index 8de96fe85d..6d10b7e9e2 100644 --- a/testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs +++ b/testproject/Assets/Tests/Runtime/RpcTestsAutomated.cs @@ -17,7 +17,7 @@ public class RpcTestsAutomated : BaseMultiInstanceTest private bool m_TimedOut; private int m_MaxFrames; - public override int NbClients => throw new NotSupportedException("Not implemented on purpose, setup is implementing this itself"); + protected override int NbClients => throw new NotSupportedException("Not implemented on purpose, setup is implementing this itself"); [UnitySetUp] public override IEnumerator Setup()