From bf2a69f8fb1b32a1037f54aa4bf51c83b53f5593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Tue, 6 Apr 2021 11:08:29 +0200 Subject: [PATCH 1/7] refactor: InternalMessageHandler is no longer static --- .../Runtime/Core/NetworkManager.cs | 40 ++++++++++--------- .../Messaging/InternalMessageHandler.cs | 34 ++++++++-------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index a513d0b240..d191d29e27 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -94,6 +94,8 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr /// public NetworkSpawnManager SpawnManager { get; private set; } + internal readonly InternalMessageHandler MessageHandler = new InternalMessageHandler(); + /// /// Gets the networkId of the server /// @@ -1054,68 +1056,68 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, case NetworkConstants.CONNECTION_REQUEST: if (IsServer) { - InternalMessageHandler.HandleConnectionRequest(clientId, messageStream); + MessageHandler.HandleConnectionRequest(clientId, messageStream); } break; case NetworkConstants.CONNECTION_APPROVED: if (IsClient) { - InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime); + MessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime); } break; case NetworkConstants.ADD_OBJECT: if (IsClient) { - InternalMessageHandler.HandleAddObject(clientId, messageStream); + MessageHandler.HandleAddObject(clientId, messageStream); } break; case NetworkConstants.DESTROY_OBJECT: if (IsClient) { - InternalMessageHandler.HandleDestroyObject(clientId, messageStream); + MessageHandler.HandleDestroyObject(clientId, messageStream); } break; case NetworkConstants.SWITCH_SCENE: if (IsClient) { - InternalMessageHandler.HandleSwitchScene(clientId, messageStream); + MessageHandler.HandleSwitchScene(clientId, messageStream); } break; case NetworkConstants.CHANGE_OWNER: if (IsClient) { - InternalMessageHandler.HandleChangeOwner(clientId, messageStream); + MessageHandler.HandleChangeOwner(clientId, messageStream); } break; case NetworkConstants.ADD_OBJECTS: if (IsClient) { - InternalMessageHandler.HandleAddObjects(clientId, messageStream); + MessageHandler.HandleAddObjects(clientId, messageStream); } break; case NetworkConstants.DESTROY_OBJECTS: if (IsClient) { - InternalMessageHandler.HandleDestroyObjects(clientId, messageStream); + MessageHandler.HandleDestroyObjects(clientId, messageStream); } break; case NetworkConstants.TIME_SYNC: if (IsClient) { - InternalMessageHandler.HandleTimeSync(clientId, messageStream, receiveTime); + MessageHandler.HandleTimeSync(clientId, messageStream, receiveTime); } break; case NetworkConstants.NETWORK_VARIABLE_DELTA: - InternalMessageHandler.HandleNetworkVariableDelta(clientId, messageStream, BufferCallback, new PreBufferPreset() + MessageHandler.HandleNetworkVariableDelta(clientId, messageStream, BufferCallback, new PreBufferPreset() { AllowBuffer = allowBuffer, NetworkChannel = networkChannel, @@ -1126,7 +1128,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, }); break; case NetworkConstants.NETWORK_VARIABLE_UPDATE: - InternalMessageHandler.HandleNetworkVariableUpdate(clientId, messageStream, BufferCallback, new PreBufferPreset() + MessageHandler.HandleNetworkVariableUpdate(clientId, messageStream, BufferCallback, new PreBufferPreset() { AllowBuffer = allowBuffer, NetworkChannel = networkChannel, @@ -1137,22 +1139,22 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, }); break; case NetworkConstants.UNNAMED_MESSAGE: - InternalMessageHandler.HandleUnnamedMessage(clientId, messageStream); + MessageHandler.HandleUnnamedMessage(clientId, messageStream); break; case NetworkConstants.NAMED_MESSAGE: - InternalMessageHandler.HandleNamedMessage(clientId, messageStream); + MessageHandler.HandleNamedMessage(clientId, messageStream); break; case NetworkConstants.CLIENT_SWITCH_SCENE_COMPLETED: if (IsServer && NetworkConfig.EnableSceneManagement) { - InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream); + MessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream); } break; case NetworkConstants.SERVER_LOG: if (IsServer && NetworkConfig.EnableNetworkLogs) { - InternalMessageHandler.HandleNetworkLog(clientId, messageStream); + MessageHandler.HandleNetworkLog(clientId, messageStream); } break; @@ -1168,7 +1170,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, } else { - InternalMessageHandler.RpcReceiveQueueItem(clientId, messageStream, receiveTime, RpcQueueContainer.QueueItemType.ServerRpc); + MessageHandler.RpcReceiveQueueItem(clientId, messageStream, receiveTime, RpcQueueContainer.QueueItemType.ServerRpc); } } @@ -1186,7 +1188,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, } else { - InternalMessageHandler.RpcReceiveQueueItem(clientId, messageStream, receiveTime, RpcQueueContainer.QueueItemType.ClientRpc); + MessageHandler.RpcReceiveQueueItem(clientId, messageStream, receiveTime, RpcQueueContainer.QueueItemType.ClientRpc); } } @@ -1212,9 +1214,9 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, #endif } - private static void ReceiveCallback(NetworkBuffer messageBuffer, RpcQueueContainer.QueueItemType messageType, ulong clientId, float receiveTime) + private void ReceiveCallback(NetworkBuffer messageBuffer, RpcQueueContainer.QueueItemType messageType, ulong clientId, float receiveTime) { - InternalMessageHandler.RpcReceiveQueueItem(clientId, messageBuffer, receiveTime, messageType); + MessageHandler.RpcReceiveQueueItem(clientId, messageBuffer, receiveTime, messageType); } /// diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 99b9bcb49f..b44d5ab70f 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -17,7 +17,7 @@ namespace MLAPI.Messaging { - internal static class InternalMessageHandler + internal class InternalMessageHandler { #if DEVELOPMENT_BUILD || UNITY_EDITOR private static ProfilerMarker s_HandleConnectionRequest = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleConnectionRequest)}"); @@ -39,7 +39,7 @@ internal static class InternalMessageHandler private static ProfilerMarker s_RpcReceiveQueueItemClientRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(RpcReceiveQueueItem)}.{nameof(RpcQueueContainer.QueueItemType.ClientRpc)}"); #endif - internal static void HandleConnectionRequest(ulong clientId, Stream stream) + internal void HandleConnectionRequest(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleConnectionRequest.Begin(); @@ -79,7 +79,7 @@ internal static void HandleConnectionRequest(ulong clientId, Stream stream) #endif } - internal static void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime) + internal void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleConnectionApproved.Begin(); @@ -218,7 +218,7 @@ void OnSceneLoadComplete() #endif } - internal static void HandleAddObject(ulong clientId, Stream stream) + internal void HandleAddObject(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleAddObject.Begin(); @@ -294,7 +294,7 @@ internal static void HandleAddObject(ulong clientId, Stream stream) #endif } - internal static void HandleDestroyObject(ulong clientId, Stream stream) + internal void HandleDestroyObject(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleDestroyObject.Begin(); @@ -309,7 +309,7 @@ internal static void HandleDestroyObject(ulong clientId, Stream stream) #endif } - internal static void HandleSwitchScene(ulong clientId, Stream stream) + internal void HandleSwitchScene(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleSwitchScene.Begin(); @@ -330,7 +330,7 @@ internal static void HandleSwitchScene(ulong clientId, Stream stream) #endif } - internal static void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) + internal void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleClientSwitchSceneCompleted.Begin(); @@ -344,7 +344,7 @@ internal static void HandleClientSwitchSceneCompleted(ulong clientId, Stream str #endif } - internal static void HandleChangeOwner(ulong clientId, Stream stream) + internal void HandleChangeOwner(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleChangeOwner.Begin(); @@ -373,7 +373,7 @@ internal static void HandleChangeOwner(ulong clientId, Stream stream) #endif } - internal static void HandleAddObjects(ulong clientId, Stream stream) + internal void HandleAddObjects(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleAddObjects.Begin(); @@ -392,7 +392,7 @@ internal static void HandleAddObjects(ulong clientId, Stream stream) #endif } - internal static void HandleDestroyObjects(ulong clientId, Stream stream) + internal void HandleDestroyObjects(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleDestroyObjects.Begin(); @@ -411,7 +411,7 @@ internal static void HandleDestroyObjects(ulong clientId, Stream stream) #endif } - internal static void HandleTimeSync(ulong clientId, Stream stream, float receiveTime) + internal void HandleTimeSync(ulong clientId, Stream stream, float receiveTime) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleTimeSync.Begin(); @@ -426,7 +426,7 @@ internal static void HandleTimeSync(ulong clientId, Stream stream, float receive #endif } - internal static void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) + internal void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleNetworkVariableDelta.Begin(); @@ -484,7 +484,7 @@ internal static void HandleNetworkVariableDelta(ulong clientId, Stream stream, A #endif } - internal static void HandleNetworkVariableUpdate(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) + internal void HandleNetworkVariableUpdate(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleNetworkVariableUpdate.Begin(); @@ -548,7 +548,7 @@ internal static void HandleNetworkVariableUpdate(ulong clientId, Stream stream, /// /// /// - internal static void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, RpcQueueContainer.QueueItemType queueItemType) + internal void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, RpcQueueContainer.QueueItemType queueItemType) { if (NetworkManager.Singleton.IsServer && clientId == NetworkManager.Singleton.ServerClientId) { @@ -586,7 +586,7 @@ internal static void RpcReceiveQueueItem(ulong clientId, Stream stream, float re #endif } - internal static void HandleUnnamedMessage(ulong clientId, Stream stream) + internal void HandleUnnamedMessage(ulong clientId, Stream stream) { PerformanceDataManager.Increment(ProfilerConstants.UnnamedMessageReceived); ProfilerStatManager.UnnamedMessage.Record(); @@ -599,7 +599,7 @@ internal static void HandleUnnamedMessage(ulong clientId, Stream stream) #endif } - internal static void HandleNamedMessage(ulong clientId, Stream stream) + internal void HandleNamedMessage(ulong clientId, Stream stream) { PerformanceDataManager.Increment(ProfilerConstants.NamedMessageReceived); ProfilerStatManager.NamedMessage.Record(); @@ -617,7 +617,7 @@ internal static void HandleNamedMessage(ulong clientId, Stream stream) #endif } - internal static void HandleNetworkLog(ulong clientId, Stream stream) + internal void HandleNetworkLog(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleNetworkLog.Begin(); From 9cbc9fcc0766fe4e825e72fd2251c4d5d1b2295c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Tue, 6 Apr 2021 16:59:53 +0200 Subject: [PATCH 2/7] Merge --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 6cbd009184..3b8301d701 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -93,10 +93,11 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr /// Gets the SpawnManager for this NetworkManager /// public NetworkSpawnManager SpawnManager { get; private set; } - internal BufferManager BufferManager { get; private set; } + internal readonly InternalMessageHandler MessageHandler = new InternalMessageHandler(); + /// /// Gets the networkId of the server /// From e9e3f893ec43b7fc5c8d5015369d41b0432862c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Thu, 8 Apr 2021 23:07:19 +0200 Subject: [PATCH 3/7] Added tests --- .../Runtime/Core/NetworkManager.cs | 3 +- .../Messaging/IInternalMessageHandler.cs | 26 ++ .../Messaging/IInternalMessageHandler.cs.meta | 3 + .../Messaging/InternalMessageHandler.cs | 34 +- .../Editor/InternalMessageHandlerTests.cs | 387 ++++++++++++++++++ .../InternalMessageHandlerTests.cs.meta | 3 + 6 files changed, 438 insertions(+), 18 deletions(-) create mode 100644 com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs create mode 100644 com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs.meta create mode 100644 com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs create mode 100644 com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs.meta diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 3b8301d701..8f5c8d3416 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -96,7 +96,8 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr internal BufferManager BufferManager { get; private set; } - internal readonly InternalMessageHandler MessageHandler = new InternalMessageHandler(); + // Has to have setter for tests + internal IInternalMessageHandler MessageHandler {get; set;} = new InternalMessageHandler(); /// /// Gets the networkId of the server diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs new file mode 100644 index 0000000000..79ff9518f7 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs @@ -0,0 +1,26 @@ +using System; +using System.IO; +using MLAPI.Messaging.Buffering; + +namespace MLAPI.Messaging +{ + internal interface IInternalMessageHandler + { + void HandleConnectionRequest(ulong clientId, Stream stream); + void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime); + void HandleAddObject(ulong clientId, Stream stream); + void HandleDestroyObject(ulong clientId, Stream stream); + void HandleSwitchScene(ulong clientId, Stream stream); + void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream); + void HandleChangeOwner(ulong clientId, Stream stream); + void HandleAddObjects(ulong clientId, Stream stream); + void HandleDestroyObjects(ulong clientId, Stream stream); + void HandleTimeSync(ulong clientId, Stream stream, float receiveTime); + void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset); + void HandleNetworkVariableUpdate(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset); + void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, RpcQueueContainer.QueueItemType queueItemType); + void HandleUnnamedMessage(ulong clientId, Stream stream); + void HandleNamedMessage(ulong clientId, Stream stream); + void HandleNetworkLog(ulong clientId, Stream stream); + } +} diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs.meta b/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs.meta new file mode 100644 index 0000000000..2efca3c244 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 55d4eb01eae74f4bb603dc1d11897d48 +timeCreated: 1617912807 \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 18a1946cff..c998a0f4b6 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -17,7 +17,7 @@ namespace MLAPI.Messaging { - internal class InternalMessageHandler + internal class InternalMessageHandler : IInternalMessageHandler { #if DEVELOPMENT_BUILD || UNITY_EDITOR private static ProfilerMarker s_HandleConnectionRequest = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleConnectionRequest)}"); @@ -39,7 +39,7 @@ internal class InternalMessageHandler private static ProfilerMarker s_RpcReceiveQueueItemClientRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(RpcReceiveQueueItem)}.{nameof(RpcQueueContainer.QueueItemType.ClientRpc)}"); #endif - internal void HandleConnectionRequest(ulong clientId, Stream stream) + public void HandleConnectionRequest(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleConnectionRequest.Begin(); @@ -79,7 +79,7 @@ internal void HandleConnectionRequest(ulong clientId, Stream stream) #endif } - internal void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime) + public void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleConnectionApproved.Begin(); @@ -218,7 +218,7 @@ void OnSceneLoadComplete() #endif } - internal void HandleAddObject(ulong clientId, Stream stream) + public void HandleAddObject(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleAddObject.Begin(); @@ -294,7 +294,7 @@ internal void HandleAddObject(ulong clientId, Stream stream) #endif } - internal void HandleDestroyObject(ulong clientId, Stream stream) + public void HandleDestroyObject(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleDestroyObject.Begin(); @@ -309,7 +309,7 @@ internal void HandleDestroyObject(ulong clientId, Stream stream) #endif } - internal void HandleSwitchScene(ulong clientId, Stream stream) + public void HandleSwitchScene(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleSwitchScene.Begin(); @@ -330,7 +330,7 @@ internal void HandleSwitchScene(ulong clientId, Stream stream) #endif } - internal void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) + public void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleClientSwitchSceneCompleted.Begin(); @@ -344,7 +344,7 @@ internal void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) #endif } - internal void HandleChangeOwner(ulong clientId, Stream stream) + public void HandleChangeOwner(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleChangeOwner.Begin(); @@ -373,7 +373,7 @@ internal void HandleChangeOwner(ulong clientId, Stream stream) #endif } - internal void HandleAddObjects(ulong clientId, Stream stream) + public void HandleAddObjects(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleAddObjects.Begin(); @@ -392,7 +392,7 @@ internal void HandleAddObjects(ulong clientId, Stream stream) #endif } - internal void HandleDestroyObjects(ulong clientId, Stream stream) + public void HandleDestroyObjects(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleDestroyObjects.Begin(); @@ -411,7 +411,7 @@ internal void HandleDestroyObjects(ulong clientId, Stream stream) #endif } - internal void HandleTimeSync(ulong clientId, Stream stream, float receiveTime) + public void HandleTimeSync(ulong clientId, Stream stream, float receiveTime) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleTimeSync.Begin(); @@ -426,7 +426,7 @@ internal void HandleTimeSync(ulong clientId, Stream stream, float receiveTime) #endif } - internal void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) + public void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleNetworkVariableDelta.Begin(); @@ -484,7 +484,7 @@ internal void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) + public void HandleNetworkVariableUpdate(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleNetworkVariableUpdate.Begin(); @@ -548,7 +548,7 @@ internal void HandleNetworkVariableUpdate(ulong clientId, Stream stream, Action< /// /// /// - internal void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, RpcQueueContainer.QueueItemType queueItemType) + public void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, RpcQueueContainer.QueueItemType queueItemType) { if (NetworkManager.Singleton.IsServer && clientId == NetworkManager.Singleton.ServerClientId) { @@ -586,7 +586,7 @@ internal void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTi #endif } - internal void HandleUnnamedMessage(ulong clientId, Stream stream) + public void HandleUnnamedMessage(ulong clientId, Stream stream) { PerformanceDataManager.Increment(ProfilerConstants.UnnamedMessageReceived); ProfilerStatManager.UnnamedMessage.Record(); @@ -599,7 +599,7 @@ internal void HandleUnnamedMessage(ulong clientId, Stream stream) #endif } - internal void HandleNamedMessage(ulong clientId, Stream stream) + public void HandleNamedMessage(ulong clientId, Stream stream) { PerformanceDataManager.Increment(ProfilerConstants.NamedMessageReceived); ProfilerStatManager.NamedMessage.Record(); @@ -617,7 +617,7 @@ internal void HandleNamedMessage(ulong clientId, Stream stream) #endif } - internal void HandleNetworkLog(ulong clientId, Stream stream) + public void HandleNetworkLog(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleNetworkLog.Begin(); diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs new file mode 100644 index 0000000000..e5429f344d --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs @@ -0,0 +1,387 @@ +using System; +using System.Collections.Generic; +using System.IO; +using MLAPI.Configuration; +using MLAPI.Internal; +using MLAPI.Messaging; +using MLAPI.Messaging.Buffering; +using MLAPI.Serialization; +using MLAPI.Transports; +using MLAPI.Transports.Tasks; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestTools; +using Object = UnityEngine.Object; + +namespace MLAPI.EditorTests +{ + public class InternalMessageHandlerTests + { + [Test] + public void MessageHandlerReceivedMessageServerClient() + { + // Init + var gameObject = new GameObject(nameof(MessageHandlerReceivedMessageServerClient)); + var networkManager = gameObject.AddComponent(); + var transport = gameObject.AddComponent(); + + // MLAPI sets this in validate + networkManager.NetworkConfig = new NetworkConfig() + { + // Set the current scene to prevent unexpected log messages which would trigger a failure + RegisteredScenes = new List() {SceneManager.GetActiveScene().name} + }; + + // Set dummy transport that does nothing + networkManager.NetworkConfig.NetworkTransport = transport; + + // Replace the real message handler with a dummy one that just prints a result + networkManager.MessageHandler = new DummyMessageHandler(); + + using (var inputBuffer = new NetworkBuffer()) + { + // Start server since pre-message-handler passes IsServer & IsClient checks + networkManager.StartServer(); + + // Disable batching to make the RPCs come straight through + // This has to be done post start + networkManager.RpcQueueContainer.EnableBatchedRpcs(false); + + // Should cause log (server only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleConnectionRequest)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CONNECTION_REQUEST, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CONNECTION_APPROVED, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.ADD_OBJECT, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.DESTROY_OBJECT, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SWITCH_SCENE, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CHANGE_OWNER, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.ADD_OBJECTS, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.DESTROY_OBJECTS, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.TIME_SYNC, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server and client) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkVariableDelta)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NETWORK_VARIABLE_DELTA, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server and client) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkVariableUpdate)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NETWORK_VARIABLE_UPDATE, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server and client) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleUnnamedMessage)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.UNNAMED_MESSAGE, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server and client) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNamedMessage)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NAMED_MESSAGE, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleClientSwitchSceneCompleted)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CLIENT_SWITCH_SCENE_COMPLETED, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkLog)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SERVER_LOG, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.RpcReceiveQueueItem)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SERVER_RPC, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (client only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CLIENT_RPC, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Stop server to trigger full shutdown + networkManager.StopServer(); + + // Start client since pre-message-handler passes IsServer & IsClient checks + networkManager.StartClient(); + + // Disable batching to make the RPCs come straight through + // This has to be done post start (and post restart since the queue container is reset) + networkManager.RpcQueueContainer.EnableBatchedRpcs(false); + + // Should not cause log (server only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CONNECTION_REQUEST, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleConnectionApproved)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CONNECTION_APPROVED, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleAddObject)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.ADD_OBJECT, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleDestroyObject)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.DESTROY_OBJECT, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleSwitchScene)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SWITCH_SCENE, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleChangeOwner)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CHANGE_OWNER, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleAddObjects)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.ADD_OBJECTS, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleDestroyObjects)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.DESTROY_OBJECTS, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleTimeSync)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.TIME_SYNC, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server and client) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkVariableDelta)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NETWORK_VARIABLE_DELTA, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server and client) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNetworkVariableUpdate)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NETWORK_VARIABLE_UPDATE, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server and client) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleUnnamedMessage)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.UNNAMED_MESSAGE, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (server and client) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.HandleNamedMessage)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.NAMED_MESSAGE, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (server only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CLIENT_SWITCH_SCENE_COMPLETED, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (server only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SERVER_LOG, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should not cause log (server only) + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.SERVER_RPC, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Should cause log (client only) + LogAssert.Expect(LogType.Log, nameof(MessageHandlerReceivedMessageServerClient) + " " + nameof(DummyMessageHandler.RpcReceiveQueueItem)); + using (var messageStream = MessagePacker.WrapMessage(NetworkConstants.CLIENT_RPC, inputBuffer)) + { + networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0, true); + } + + // Full cleanup + networkManager.StopClient(); + } + + // Ensure no missmatches with expectations + LogAssert.NoUnexpectedReceived(); + + // Cleanup + Object.DestroyImmediate(gameObject); + } + } + + internal class DummyMessageHandler : IInternalMessageHandler + { + public void HandleConnectionRequest(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleConnectionRequest)); + + public void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime) => VerifyCalled(nameof(HandleConnectionApproved)); + + public void HandleAddObject(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleAddObject)); + + public void HandleDestroyObject(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleDestroyObject)); + + public void HandleSwitchScene(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleSwitchScene)); + + public void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleClientSwitchSceneCompleted)); + + public void HandleChangeOwner(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleChangeOwner)); + + public void HandleAddObjects(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleAddObjects)); + + public void HandleDestroyObjects(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleDestroyObjects)); + + public void HandleTimeSync(ulong clientId, Stream stream, float receiveTime) => VerifyCalled(nameof(HandleTimeSync)); + + public void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) => VerifyCalled(nameof(HandleNetworkVariableDelta)); + + public void HandleNetworkVariableUpdate(ulong clientId, Stream stream, Action bufferCallback, PreBufferPreset bufferPreset) => VerifyCalled(nameof(HandleNetworkVariableUpdate)); + + public void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, RpcQueueContainer.QueueItemType queueItemType) => VerifyCalled(nameof(RpcReceiveQueueItem)); + + public void HandleUnnamedMessage(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleUnnamedMessage)); + + public void HandleNamedMessage(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleNamedMessage)); + + public void HandleNetworkLog(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleNetworkLog)); + + private void VerifyCalled(string method) + { + Debug.Log(nameof(InternalMessageHandlerTests.MessageHandlerReceivedMessageServerClient) + " " + method); + } + } + + // Should probably have one of these for more files? In the future we could use the SIPTransport? + internal class DummyTransport : NetworkTransport + { + public override ulong ServerClientId { get; } = 0; + public override void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) + { + } + + public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) + { + clientId = 0; + networkChannel = NetworkChannel.Internal; + payload = new ArraySegment(); + receiveTime = 0; + return NetworkEvent.Nothing; + } + + public override SocketTasks StartClient() + { + return SocketTask.Done.AsTasks(); + } + + public override SocketTasks StartServer() + { + return SocketTask.Done.AsTasks(); + + } + + public override void DisconnectRemoteClient(ulong clientId) + { + } + + public override void DisconnectLocalClient() + { + } + + public override ulong GetCurrentRtt(ulong clientId) + { + return 0; + } + + public override void Shutdown() + { + } + + public override void Init() + { + } + } +} diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs.meta b/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs.meta new file mode 100644 index 0000000000..b455436403 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 976ca592c7fa4bcb854203dfbadc0ad9 +timeCreated: 1617913395 \ No newline at end of file From de31f8157e50bea5c8bbb791c5196262ac3c07d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Thu, 8 Apr 2021 23:09:29 +0200 Subject: [PATCH 4/7] Minor style fix --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 8f5c8d3416..58a611c0f7 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -97,7 +97,7 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr internal BufferManager BufferManager { get; private set; } // Has to have setter for tests - internal IInternalMessageHandler MessageHandler {get; set;} = new InternalMessageHandler(); + internal IInternalMessageHandler MessageHandler { get; set; } = new InternalMessageHandler(); /// /// Gets the networkId of the server From 12c4dbde81938eed35ff99096d3e0e60d8b9bd1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Fri, 9 Apr 2021 19:03:24 +0200 Subject: [PATCH 5/7] renamed test file --- ...geHandlerTests.cs => NetworkManagerMessageHandlerTests.cs} | 4 ++-- ...ests.cs.meta => NetworkManagerMessageHandlerTests.cs.meta} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename com.unity.multiplayer.mlapi/Tests/Editor/{InternalMessageHandlerTests.cs => NetworkManagerMessageHandlerTests.cs} (99%) rename com.unity.multiplayer.mlapi/Tests/Editor/{InternalMessageHandlerTests.cs.meta => NetworkManagerMessageHandlerTests.cs.meta} (100%) diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs similarity index 99% rename from com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs rename to com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs index e5429f344d..0d0ddeefa4 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs @@ -16,7 +16,7 @@ namespace MLAPI.EditorTests { - public class InternalMessageHandlerTests + public class NetworkManagerMessageHandlerTests { [Test] public void MessageHandlerReceivedMessageServerClient() @@ -331,7 +331,7 @@ internal class DummyMessageHandler : IInternalMessageHandler private void VerifyCalled(string method) { - Debug.Log(nameof(InternalMessageHandlerTests.MessageHandlerReceivedMessageServerClient) + " " + method); + Debug.Log(nameof(NetworkManagerMessageHandlerTests.MessageHandlerReceivedMessageServerClient) + " " + method); } } diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs.meta b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs.meta similarity index 100% rename from com.unity.multiplayer.mlapi/Tests/Editor/InternalMessageHandlerTests.cs.meta rename to com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs.meta From 12054c52aa2c64b41bc91548fa3f897021faa1f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Mon, 12 Apr 2021 10:31:59 +0200 Subject: [PATCH 6/7] Added NetworkManager field --- .../Runtime/Core/NetworkManager.cs | 10 +- .../Messaging/IInternalMessageHandler.cs | 1 + .../Messaging/InternalMessageHandler.cs | 98 ++++++++++--------- .../NetworkManagerMessageHandlerTests.cs | 2 + 4 files changed, 65 insertions(+), 46 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index f5966da6dd..3aa2390d4f 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -21,6 +21,7 @@ using MLAPI.Transports.Tasks; using MLAPI.Messaging.Buffering; using Unity.Profiling; +using UnityEditor.VersionControl; namespace MLAPI { @@ -96,7 +97,7 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr internal BufferManager BufferManager { get; private set; } // Has to have setter for tests - internal IInternalMessageHandler MessageHandler { get; set; } = new InternalMessageHandler(); + internal IInternalMessageHandler MessageHandler { get; set; } /// /// Gets the networkId of the server @@ -293,6 +294,8 @@ private void Init(bool server) BufferManager = new BufferManager(); + MessageHandler = new InternalMessageHandler(this); + NetworkSceneManager.RegisteredSceneNames.Clear(); NetworkSceneManager.SceneIndexToString.Clear(); NetworkSceneManager.SceneNameToIndex.Clear(); @@ -677,6 +680,11 @@ public void Shutdown() SpawnManager = null; } + if (MessageHandler != null) + { + MessageHandler = null; + } + //The Transport is set during Init time, thus it is possible for the Transport to be null NetworkConfig?.NetworkTransport?.Shutdown(); } diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs index 79ff9518f7..7438683a66 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs @@ -6,6 +6,7 @@ namespace MLAPI.Messaging { internal interface IInternalMessageHandler { + NetworkManager NetworkManager { get; } void HandleConnectionRequest(ulong clientId, Stream stream); void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime); void HandleAddObject(ulong clientId, Stream stream); diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 587907edcf..cf12031671 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -39,12 +39,20 @@ internal class InternalMessageHandler : IInternalMessageHandler private static ProfilerMarker s_RpcReceiveQueueItemClientRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(RpcReceiveQueueItem)}.{nameof(RpcQueueContainer.QueueItemType.ClientRpc)}"); #endif + public NetworkManager NetworkManager => m_NetworkManager; + private NetworkManager m_NetworkManager; + + public InternalMessageHandler(NetworkManager networkManager) + { + m_NetworkManager = networkManager; + } + public void HandleConnectionRequest(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleConnectionRequest.Begin(); #endif - if (NetworkManager.Singleton.PendingClients.TryGetValue(clientId, out PendingClient client)) + if (NetworkManager.PendingClients.TryGetValue(clientId, out PendingClient client)) { // Set to pending approval to prevent future connection requests from being approved client.ConnectionState = PendingClient.State.PendingApproval; @@ -53,27 +61,27 @@ public void HandleConnectionRequest(ulong clientId, Stream stream) using (var reader = PooledNetworkReader.Get(stream)) { ulong configHash = reader.ReadUInt64Packed(); - if (!NetworkManager.Singleton.NetworkConfig.CompareConfig(configHash)) + if (!NetworkManager.NetworkConfig.CompareConfig(configHash)) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) { NetworkLog.LogWarning($"{nameof(NetworkConfig)} mismatch. The configuration between the server and client does not match"); } - NetworkManager.Singleton.DisconnectClient(clientId); + NetworkManager.DisconnectClient(clientId); return; } - if (NetworkManager.Singleton.NetworkConfig.ConnectionApproval) + if (NetworkManager.NetworkConfig.ConnectionApproval) { byte[] connectionBuffer = reader.ReadByteArray(); - NetworkManager.Singleton.InvokeConnectionApproval(connectionBuffer, clientId, + NetworkManager.InvokeConnectionApproval(connectionBuffer, clientId, (createPlayerObject, playerPrefabHash, approved, position, rotation) => - NetworkManager.Singleton.HandleApproval(clientId, createPlayerObject, playerPrefabHash, approved, position, rotation)); + NetworkManager.HandleApproval(clientId, createPlayerObject, playerPrefabHash, approved, position, rotation)); } else { - NetworkManager.Singleton.HandleApproval(clientId, NetworkManager.Singleton.NetworkConfig.CreatePlayerPrefab, null, true, null, null); + NetworkManager.HandleApproval(clientId, NetworkManager.NetworkConfig.CreatePlayerPrefab, null, true, null, null); } } #if DEVELOPMENT_BUILD || UNITY_EDITOR @@ -88,36 +96,36 @@ public void HandleConnectionApproved(ulong clientId, Stream stream, float receiv #endif using (var reader = PooledNetworkReader.Get(stream)) { - NetworkManager.Singleton.LocalClientId = reader.ReadUInt64Packed(); + NetworkManager.LocalClientId = reader.ReadUInt64Packed(); uint sceneIndex = 0; var sceneSwitchProgressGuid = new Guid(); - if (NetworkManager.Singleton.NetworkConfig.EnableSceneManagement) + if (NetworkManager.NetworkConfig.EnableSceneManagement) { sceneIndex = reader.ReadUInt32Packed(); sceneSwitchProgressGuid = new Guid(reader.ReadByteArray()); } - bool sceneSwitch = NetworkManager.Singleton.NetworkConfig.EnableSceneManagement && NetworkSceneManager.HasSceneMismatch(sceneIndex); + bool sceneSwitch = NetworkManager.NetworkConfig.EnableSceneManagement && NetworkSceneManager.HasSceneMismatch(sceneIndex); float netTime = reader.ReadSinglePacked(); - NetworkManager.Singleton.UpdateNetworkTime(clientId, netTime, receiveTime, true); + NetworkManager.UpdateNetworkTime(clientId, netTime, receiveTime, true); - NetworkManager.Singleton.ConnectedClients.Add(NetworkManager.Singleton.LocalClientId, new NetworkClient { ClientId = NetworkManager.Singleton.LocalClientId }); + NetworkManager.ConnectedClients.Add(NetworkManager.LocalClientId, new NetworkClient { ClientId = NetworkManager.LocalClientId }); void DelayedSpawnAction(Stream continuationStream) { using (var continuationReader = PooledNetworkReader.Get(continuationStream)) { - if (!NetworkManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkManager.Singleton.NetworkConfig.UsePrefabSync) + if (!NetworkManager.NetworkConfig.EnableSceneManagement || NetworkManager.NetworkConfig.UsePrefabSync) { - NetworkManager.Singleton.SpawnManager.DestroySceneObjects(); + NetworkManager.SpawnManager.DestroySceneObjects(); } else { - NetworkManager.Singleton.SpawnManager.ClientCollectSoftSyncSceneObjectSweep(null); + NetworkManager.SpawnManager.ClientCollectSoftSyncSceneObjectSweep(null); } uint objectCount = continuationReader.ReadUInt32Packed(); @@ -138,7 +146,7 @@ void DelayedSpawnAction(Stream continuationStream) ulong instanceId; bool softSync; - if (!NetworkManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkManager.Singleton.NetworkConfig.UsePrefabSync) + if (!NetworkManager.NetworkConfig.EnableSceneManagement || NetworkManager.NetworkConfig.UsePrefabSync) { softSync = false; instanceId = 0; @@ -168,10 +176,10 @@ void DelayedSpawnAction(Stream continuationStream) rot = Quaternion.Euler(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked()); } - var networkObject = NetworkManager.Singleton.SpawnManager.CreateLocalNetworkObject(softSync, instanceId, prefabHash, ownerId, parentNetworkId, pos, rot); - NetworkManager.Singleton.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, softSync, isPlayerObject, ownerId, continuationStream, false, 0, true, false); + var networkObject = NetworkManager.SpawnManager.CreateLocalNetworkObject(softSync, instanceId, prefabHash, ownerId, parentNetworkId, pos, rot); + NetworkManager.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, softSync, isPlayerObject, ownerId, continuationStream, false, 0, true, false); - Queue bufferQueue = NetworkManager.Singleton.BufferManager.ConsumeBuffersForNetworkId(networkId); + Queue bufferQueue = NetworkManager.BufferManager.ConsumeBuffersForNetworkId(networkId); // Apply buffered messages if (bufferQueue != null) @@ -179,15 +187,15 @@ void DelayedSpawnAction(Stream continuationStream) while (bufferQueue.Count > 0) { BufferManager.BufferedMessage message = bufferQueue.Dequeue(); - NetworkManager.Singleton.HandleIncomingData(message.SenderClientId, message.NetworkChannel, new ArraySegment(message.NetworkBuffer.GetBuffer(), (int)message.NetworkBuffer.Position, (int)message.NetworkBuffer.Length), message.ReceiveTime, false); + NetworkManager.HandleIncomingData(message.SenderClientId, message.NetworkChannel, new ArraySegment(message.NetworkBuffer.GetBuffer(), (int)message.NetworkBuffer.Position, (int)message.NetworkBuffer.Length), message.ReceiveTime, false); BufferManager.RecycleConsumedBufferedMessage(message); } } } - NetworkManager.Singleton.SpawnManager.CleanDiffedSceneObjects(); - NetworkManager.Singleton.IsConnectedClient = true; - NetworkManager.Singleton.InvokeOnClientConnectedCallback(NetworkManager.Singleton.LocalClientId); + NetworkManager.SpawnManager.CleanDiffedSceneObjects(); + NetworkManager.IsConnectedClient = true; + NetworkManager.InvokeOnClientConnectedCallback(NetworkManager.LocalClientId); } } @@ -242,7 +250,7 @@ public void HandleAddObject(ulong clientId, Stream stream) ulong instanceId; bool softSync; - if (!NetworkManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkManager.Singleton.NetworkConfig.UsePrefabSync) + if (!NetworkManager.NetworkConfig.EnableSceneManagement || NetworkManager.NetworkConfig.UsePrefabSync) { softSync = false; instanceId = 0; @@ -275,10 +283,10 @@ public void HandleAddObject(ulong clientId, Stream stream) bool hasPayload = reader.ReadBool(); int payLoadLength = hasPayload ? reader.ReadInt32Packed() : 0; - var networkObject = NetworkManager.Singleton.SpawnManager.CreateLocalNetworkObject(softSync, instanceId, prefabHash, ownerClientId, parentNetworkId, pos, rot); - NetworkManager.Singleton.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, softSync, isPlayerObject, ownerClientId, stream, hasPayload, payLoadLength, true, false); + var networkObject = NetworkManager.SpawnManager.CreateLocalNetworkObject(softSync, instanceId, prefabHash, ownerClientId, parentNetworkId, pos, rot); + NetworkManager.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, softSync, isPlayerObject, ownerClientId, stream, hasPayload, payLoadLength, true, false); - Queue bufferQueue = NetworkManager.Singleton.BufferManager.ConsumeBuffersForNetworkId(networkId); + Queue bufferQueue = NetworkManager.BufferManager.ConsumeBuffersForNetworkId(networkId); // Apply buffered messages if (bufferQueue != null) @@ -286,7 +294,7 @@ public void HandleAddObject(ulong clientId, Stream stream) while (bufferQueue.Count > 0) { BufferManager.BufferedMessage message = bufferQueue.Dequeue(); - NetworkManager.Singleton.HandleIncomingData(message.SenderClientId, message.NetworkChannel, new ArraySegment(message.NetworkBuffer.GetBuffer(), (int)message.NetworkBuffer.Position, (int)message.NetworkBuffer.Length), message.ReceiveTime, false); + NetworkManager.HandleIncomingData(message.SenderClientId, message.NetworkChannel, new ArraySegment(message.NetworkBuffer.GetBuffer(), (int)message.NetworkBuffer.Position, (int)message.NetworkBuffer.Length), message.ReceiveTime, false); BufferManager.RecycleConsumedBufferedMessage(message); } } @@ -304,7 +312,7 @@ public void HandleDestroyObject(ulong clientId, Stream stream) using (var reader = PooledNetworkReader.Get(stream)) { ulong networkId = reader.ReadUInt64Packed(); - NetworkManager.Singleton.SpawnManager.OnDestroyObject(networkId, true); + NetworkManager.SpawnManager.OnDestroyObject(networkId, true); } #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleDestroyObject.End(); @@ -356,19 +364,19 @@ public void HandleChangeOwner(ulong clientId, Stream stream) ulong networkId = reader.ReadUInt64Packed(); ulong ownerClientId = reader.ReadUInt64Packed(); - if (NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkId].OwnerClientId == NetworkManager.Singleton.LocalClientId) + if (NetworkManager.SpawnManager.SpawnedObjects[networkId].OwnerClientId == NetworkManager.LocalClientId) { //We are current owner. - NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkId].InvokeBehaviourOnLostOwnership(); + NetworkManager.SpawnManager.SpawnedObjects[networkId].InvokeBehaviourOnLostOwnership(); } - if (ownerClientId == NetworkManager.Singleton.LocalClientId) + if (ownerClientId == NetworkManager.LocalClientId) { //We are new owner. - NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkId].InvokeBehaviourOnGainedOwnership(); + NetworkManager.SpawnManager.SpawnedObjects[networkId].InvokeBehaviourOnGainedOwnership(); } - NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkId].OwnerClientId = ownerClientId; + NetworkManager.SpawnManager.SpawnedObjects[networkId].OwnerClientId = ownerClientId; } #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleChangeOwner.End(); @@ -421,7 +429,7 @@ public void HandleTimeSync(ulong clientId, Stream stream, float receiveTime) using (var reader = PooledNetworkReader.Get(stream)) { float netTime = reader.ReadSinglePacked(); - NetworkManager.Singleton.UpdateNetworkTime(clientId, netTime, receiveTime); + NetworkManager.UpdateNetworkTime(clientId, netTime, receiveTime); } #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleTimeSync.End(); @@ -433,7 +441,7 @@ public void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action public void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime, RpcQueueContainer.QueueItemType queueItemType) { - if (NetworkManager.Singleton.IsServer && clientId == NetworkManager.Singleton.ServerClientId) + if (NetworkManager.IsServer && clientId == NetworkManager.ServerClientId) { return; } @@ -572,7 +580,7 @@ public void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime } #endif - var rpcQueueContainer = NetworkManager.Singleton.RpcQueueContainer; + var rpcQueueContainer = NetworkManager.RpcQueueContainer; rpcQueueContainer.AddQueueItemToInboundFrame(queueItemType, receiveTime, clientId, (NetworkBuffer)stream); #if DEVELOPMENT_BUILD || UNITY_EDITOR diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs index 0d0ddeefa4..1e4e273922 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs @@ -297,6 +297,8 @@ public void MessageHandlerReceivedMessageServerClient() internal class DummyMessageHandler : IInternalMessageHandler { + public NetworkManager NetworkManager { get; } + public void HandleConnectionRequest(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleConnectionRequest)); public void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime) => VerifyCalled(nameof(HandleConnectionApproved)); From f9b27f2b84a18ce2d434a7b4691afc8601bfbf75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Mon, 12 Apr 2021 19:51:25 +0200 Subject: [PATCH 7/7] Fix assignment when overriden --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs | 6 +++++- .../Tests/Editor/NetworkManagerMessageHandlerTests.cs | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 3aa2390d4f..7a7cec61a7 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -294,7 +294,11 @@ private void Init(bool server) BufferManager = new BufferManager(); - MessageHandler = new InternalMessageHandler(this); + if (MessageHandler == null) + { + // Only create this if it's not already set (like in test cases) + MessageHandler = new InternalMessageHandler(this); + } NetworkSceneManager.RegisteredSceneNames.Clear(); NetworkSceneManager.SceneIndexToString.Clear(); diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs index 1e4e273922..d5c1870909 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs @@ -161,6 +161,9 @@ public void MessageHandlerReceivedMessageServerClient() // Stop server to trigger full shutdown networkManager.StopServer(); + // Replace the real message handler with a dummy one that just prints a result + networkManager.MessageHandler = new DummyMessageHandler(); + // Start client since pre-message-handler passes IsServer & IsClient checks networkManager.StartClient();