From 03db1918db8660cf453fc769265fac752dda6895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Sun, 9 May 2021 20:56:46 +0200 Subject: [PATCH 1/9] test: Added MultiInstanceHelper for multi-instance runtime tests --- .../Tests/Runtime/MultiInstance.meta | 3 + .../MultiInstance/MultiInstanceHelpers.cs | 244 ++++++++++++++++++ .../MultiInstanceHelpers.cs.meta | 3 + 3 files changed, 250 insertions(+) create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance.meta create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs.meta diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance.meta new file mode 100644 index 0000000000..990f0da88f --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2df2070ea49a4fc7bfa4db287fc66674 +timeCreated: 1620145216 \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs new file mode 100644 index 0000000000..5147ab3f35 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs @@ -0,0 +1,244 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using MLAPI.Configuration; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace MLAPI.RuntimeTests +{ + internal static class MultiInstanceHelpers + { + public static bool Create(int clientCount, out NetworkManager server, out NetworkManager[] clients) + { + clients = new NetworkManager[clientCount]; + + for (int i = 0; i < clientCount; i++) + { + // Create gameObject + GameObject go = new GameObject("NetworkManager - Client - " + i); + + // Create networkManager component + clients[i] = go.AddComponent(); + + // Set config + clients[i].NetworkConfig = new NetworkConfig() + { + // Set the current scene to prevent unexpected log messages which would trigger a failure + RegisteredScenes = new List() { SceneManager.GetActiveScene().name }, + // Set transport + NetworkTransport = go.AddComponent() + }; + } + + { + // Create gameObject + GameObject go = new GameObject("NetworkManager - Server"); + + // Create networkManager component + server = go.AddComponent(); + + // Set config + server.NetworkConfig = new NetworkConfig() + { + // Set the current scene to prevent unexpected log messages which would trigger a failure + RegisteredScenes = new List() { SceneManager.GetActiveScene().name }, + // Set transport + NetworkTransport = go.AddComponent() + }; + } + + return true; + } + + public static bool Start(bool host, NetworkManager server, NetworkManager[] clients) + { + if (host) + { + server.StartHost(); + } + else + { + server.StartClient(); + } + + for (int i = 0; i < clients.Length; i++) + { + clients[i].StartClient(); + } + + return true; + } + + // Empty MonoBehaviour that is a holder of coroutine + private class CoroutineRunner : MonoBehaviour + { + } + + private static CoroutineRunner s_CoroutineRunner; + + public static Coroutine Run(IEnumerator enumerator) + { + if (s_CoroutineRunner == null) + { + s_CoroutineRunner = new GameObject(nameof(CoroutineRunner)).AddComponent(); + } + + return s_CoroutineRunner.StartCoroutine(enumerator); + } + + public class CoroutineResultWrapper + { + public T Result; + } + + public static void MakeNetworkedObjectTestPrefab(NetworkObject networkObject, uint globalObjectIdHash = default) + { + // Set a globalObjectId for prefab + if (globalObjectIdHash != default) + { + networkObject.TempGlobalObjectIdHashOverride = globalObjectIdHash; + } + + // Force generation + networkObject.GenerateGlobalObjectIdHash(); + + // Prevent object from being snapped up as a scene object + networkObject.IsSceneObject = false; + } + + public static IEnumerator WaitForClientConnected(NetworkManager client, CoroutineResultWrapper result = null, int maxFrames = 64) + { + if (client.IsServer) + { + throw new InvalidOperationException("Cannot wait for connected as server"); + } + + int startFrame = Time.frameCount; + + while (Time.frameCount - startFrame <= maxFrames && !client.IsConnectedClient) + { + int nextFrameId = Time.frameCount + 1; + yield return new WaitUntil(() => Time.frameCount >= nextFrameId); + } + + bool res = client.IsConnectedClient; + + if (result != null) + { + result.Result = res; + } + else + { + Assert.True(res, "Client never connected"); + } + } + + public static IEnumerator WaitForClientConnectedToServer(NetworkManager server, CoroutineResultWrapper result = null, int maxFrames = 64) + { + if (!server.IsServer) + { + throw new InvalidOperationException("Cannot wait for connected as client"); + } + + int startFrame = Time.frameCount; + + while (Time.frameCount - startFrame <= maxFrames && server.ConnectedClients.Count != (server.IsHost ? 2 : 1)) + { + int nextFrameId = Time.frameCount + 1; + yield return new WaitUntil(() => Time.frameCount >= nextFrameId); + } + + bool res = server.ConnectedClients.Count == (server.IsHost ? 2 : 1); + + if (result != null) + { + result.Result = res; + } + else + { + Assert.True(res, "Client never connected to server"); + } + } + + public static IEnumerator GetNetworkObjectByRepresentation(ulong networkObjectId, NetworkManager representation, CoroutineResultWrapper result, bool failIfNull = true, int maxFrames = 64) + { + if (result == null) + { + throw new ArgumentNullException("Result cannot be null"); + } + + int startFrame = Time.frameCount; + + while (Time.frameCount - startFrame <= maxFrames && representation.SpawnManager.SpawnedObjects.All(x => x.Value.NetworkObjectId != networkObjectId)) + { + int nextFrameId = Time.frameCount + 1; + yield return new WaitUntil(() => Time.frameCount >= nextFrameId); + } + + result.Result = representation.SpawnManager.SpawnedObjects.First(x => x.Value.NetworkObjectId == networkObjectId).Value; + + if (failIfNull && result.Result == null) + { + Assert.Fail("NetworkObject could not be found"); + } + } + + public static IEnumerator GetNetworkObjectByRepresentation(Func predicate, NetworkManager representation, CoroutineResultWrapper result, bool failIfNull = true, int maxFrames = 64) + { + if (result == null) + { + throw new ArgumentNullException("Result cannot be null"); + } + + if (predicate == null) + { + throw new ArgumentNullException("Predicate cannot be null"); + } + + int startFrame = Time.frameCount; + + while (Time.frameCount - startFrame <= maxFrames && !representation.SpawnManager.SpawnedObjects.Any(x => predicate(x.Value))) + { + int nextFrameId = Time.frameCount + 1; + yield return new WaitUntil(() => Time.frameCount >= nextFrameId); + } + + result.Result = representation.SpawnManager.SpawnedObjects.FirstOrDefault(x => predicate(x.Value)).Value; + + if (failIfNull && result.Result == null) + { + Assert.Fail("NetworkObject could not be found"); + } + } + + public static IEnumerator WaitForCondition(Func predicate, CoroutineResultWrapper result = null, int maxFrames = 64) + { + if (predicate == null) + { + throw new ArgumentNullException("Predicate cannot be null"); + } + + int startFrame = Time.frameCount; + + while (Time.frameCount - startFrame <= maxFrames && !predicate()) + { + int nextFrameId = Time.frameCount + 1; + yield return new WaitUntil(() => Time.frameCount >= nextFrameId); + } + + bool res = predicate(); + + if (result != null) + { + result.Result = res; + } + else + { + Assert.True(res, "PREDICATE CONDITION"); + } + } + } +} diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs.meta new file mode 100644 index 0000000000..741fa2a175 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cd86b2a4d2ba44c5b4914380829c258f +timeCreated: 1620145246 \ No newline at end of file From e476147e0e34819faeb4423312c34a4a452ad7d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Mon, 10 May 2021 00:26:18 +0200 Subject: [PATCH 2/9] Fix standards --- .../Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs index 5147ab3f35..4e0bf2e673 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs @@ -18,7 +18,7 @@ public static bool Create(int clientCount, out NetworkManager server, out Networ for (int i = 0; i < clientCount; i++) { // Create gameObject - GameObject go = new GameObject("NetworkManager - Client - " + i); + var go = new GameObject("NetworkManager - Client - " + i); // Create networkManager component clients[i] = go.AddComponent(); @@ -35,7 +35,7 @@ public static bool Create(int clientCount, out NetworkManager server, out Networ { // Create gameObject - GameObject go = new GameObject("NetworkManager - Server"); + var go = new GameObject("NetworkManager - Server"); // Create networkManager component server = go.AddComponent(); From c8b478f1dcc51dd0a8513e3521c11aa10c5a6da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Mon, 10 May 2021 17:59:31 +0200 Subject: [PATCH 3/9] test: Added RPC test --- .../Tests/Runtime/MultiInstance/RPCTests.cs | 134 ++++++++++++++++++ .../Runtime/MultiInstance/RPCTests.cs.meta | 3 + 2 files changed, 137 insertions(+) create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs.meta diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs new file mode 100644 index 0000000000..f8572a4a2c --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections; +using System.Diagnostics; +using System.Linq; +using MLAPI.Messaging; +using NUnit.Framework; +using UnityEditor; +using UnityEngine; +using UnityEngine.TestTools; +using Debug = UnityEngine.Debug; + +namespace MLAPI.RuntimeTests +{ + public class RPCTests + { + public class RPCTestNetworkBehaviour : NetworkBehaviour + { + public event Action OnServer_RPC; + public event Action OnClient_RPC; + + [ServerRpc] + public void MyServerRpc() + { + OnServer_RPC(); + } + + [ClientRpc] + public void MyClientRpc() + { + OnClient_RPC(); + } + } + + [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 + GameObject 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; + } + + // Start the instances + if (!MultiInstanceHelpers.Start(true, 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.WaitForClientConnected(clients[0])); + + // Wait for connection on server side + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnectedToServer(server)); + + // 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)); + + // 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)); + + // Setup state + bool hasReceivedServerRPC = false; + bool hasReceivedClientRPCRemotely = false; + bool hasReceivedClientRPCLocally = false; + + clientClientPlayerResult.Result.GetComponent().OnClient_RPC += () => + { + Debug.Log("ClientRPC received on client object"); + hasReceivedClientRPCRemotely = true; + }; + + clientClientPlayerResult.Result.GetComponent().OnServer_RPC += () => + { + // The RPC invoked locally. (Weaver failure?) + Assert.Fail("ServerRPC invoked locally. Weaver failure?"); + }; + + serverClientPlayerResult.Result.GetComponent().OnServer_RPC += () => + { + Debug.Log("ServerRPC received on server object"); + hasReceivedServerRPC = true; + }; + + serverClientPlayerResult.Result.GetComponent().OnClient_RPC += () => + { + // The RPC invoked locally. (Weaver failure?) + Debug.Log("ClientRPC received on server object"); + hasReceivedClientRPCLocally = true; + }; + + // Send ServerRPC + clientClientPlayerResult.Result.GetComponent().MyServerRpc(); + + // Send ClientRPC + serverClientPlayerResult.Result.GetComponent().MyClientRpc(); + + // Wait for RPCs to be received + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForCondition(() => hasReceivedServerRPC && hasReceivedClientRPCLocally && hasReceivedClientRPCRemotely)); + + 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 hte client"); + } + } +} diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs.meta new file mode 100644 index 0000000000..ea8e4244f7 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c35d7e9c4eb641be8e4a2105d78fa117 +timeCreated: 1620145147 \ No newline at end of file From 0a981218dd92e402bcb68fb99cc660f35bc2c0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 21 May 2021 14:55:11 +0200 Subject: [PATCH 4/9] cleanup --- .../Tests/Runtime/MultiInstance/RPCTests.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs index f8572a4a2c..635ddbb8ac 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs @@ -128,7 +128,10 @@ 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 hte client"); + Assert.True(hasReceivedClientRPCRemotely, "ClientRPC was not remotely received on the client"); + + // Cleanup + MultiInstanceHelpers.Destroy(); } } } From 7090b89ae548077d99192873e78319c785346fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 21 May 2021 15:27:58 +0200 Subject: [PATCH 5/9] style --- .../Tests/Runtime/MultiInstance/RPCTests.cs | 2 +- .../Tests/Runtime/Transport/SIPTransport.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs index 635ddbb8ac..e08dc6ad41 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs @@ -50,7 +50,7 @@ public IEnumerator TestRPCs() */ // Create playerPrefab - GameObject playerPrefab = new GameObject("Player"); + var playerPrefab = new GameObject("Player"); NetworkObject networkObject = playerPrefab.AddComponent(); playerPrefab.AddComponent(); diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/Transport/SIPTransport.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/Transport/SIPTransport.cs index 6cbd492efc..0a759bc502 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/Transport/SIPTransport.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/Transport/SIPTransport.cs @@ -120,12 +120,12 @@ public override void Shutdown() Data = new ArraySegment() }); } - + if (m_LocalConnection != null && m_LocalConnection.ConnectionId == ServerClientId) { s_Server = null; } - + // TODO: Cleanup } From 70ad5df70b8cbbfe3c4100992639473309e1cf2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 21 May 2021 16:07:36 +0200 Subject: [PATCH 6/9] Use plural version --- .../Tests/Runtime/MultiInstance/RPCTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs index e08dc6ad41..30300b066f 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs @@ -74,7 +74,7 @@ public IEnumerator TestRPCs() // Wait for connection on client side - yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnected(clients[0])); + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients)); // Wait for connection on server side yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnectedToServer(server)); From a69dcf91a060a167e867e8866ae41e33676e0dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 21 May 2021 16:16:25 +0200 Subject: [PATCH 7/9] fix host --- .../Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs index a1d159504e..0a18b3cd3b 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/MultiInstanceHelpers.cs @@ -244,7 +244,7 @@ public static IEnumerator WaitForClientsConnected(NetworkManager[] clients, Coro /// The max frames to wait for public static IEnumerator WaitForClientConnectedToServer(NetworkManager server, CoroutineResultWrapper result = null, int maxFrames = 64) { - yield return WaitForClientsConnectedToServer(server, 1, result, maxFrames); + yield return WaitForClientsConnectedToServer(server, server.IsHost ? 2 : 1, result, maxFrames); } /// From 4cb908db770d8114c768040a1acc2e552a92211a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Wed, 26 May 2021 11:51:29 +0200 Subject: [PATCH 8/9] Set framerate --- .../Tests/Runtime/MultiInstance/RPCTests.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs index 30300b066f..c15373d1a0 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs @@ -34,6 +34,9 @@ public void MyClientRpc() [UnityTest] public IEnumerator TestRPCs() { + int targetFrameRate = Application.targetFrameRate; + Application.targetFrameRate = 120; + // Create multiple NetworkManager instances if (!MultiInstanceHelpers.Create(1, out NetworkManager server, out NetworkManager[] clients)) { @@ -130,6 +133,8 @@ public IEnumerator TestRPCs() Assert.True(hasReceivedClientRPCLocally, "ClientRPC was not locally received on the server"); Assert.True(hasReceivedClientRPCRemotely, "ClientRPC was not remotely received on the client"); + Application.targetFrameRate = targetFrameRate; + // Cleanup MultiInstanceHelpers.Destroy(); } From 0395e1d366402c8f4705f0549ec525acda1a5423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Wed, 26 May 2021 12:20:01 +0200 Subject: [PATCH 9/9] add comments --- .../Tests/Runtime/MultiInstance/RPCTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs index c15373d1a0..ddf24ce674 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs @@ -34,6 +34,7 @@ public void MyClientRpc() [UnityTest] public IEnumerator TestRPCs() { + // Set target frameRate to work around ubuntu timings int targetFrameRate = Application.targetFrameRate; Application.targetFrameRate = 120; @@ -133,6 +134,7 @@ public IEnumerator TestRPCs() Assert.True(hasReceivedClientRPCLocally, "ClientRPC was not locally received on the server"); Assert.True(hasReceivedClientRPCRemotely, "ClientRPC was not remotely received on the client"); + // Release frame rate Application.targetFrameRate = targetFrameRate; // Cleanup