diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 435f7347c0..aac6634178 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,6 +97,9 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr internal BufferManager BufferManager { get; private set; } + // Has to have setter for tests + internal IInternalMessageHandler MessageHandler { get; set; } + /// /// Gets the networkId of the server /// @@ -296,6 +300,12 @@ private void Init(bool server) BufferManager = new BufferManager(); + 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(); NetworkSceneManager.SceneNameToIndex.Clear(); @@ -685,6 +695,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(); } @@ -1035,68 +1050,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, @@ -1107,7 +1122,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, @@ -1118,15 +1133,15 @@ 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); } else if (!NetworkConfig.EnableSceneManagement) { @@ -1137,7 +1152,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, case NetworkConstants.SERVER_LOG: if (IsServer && NetworkConfig.EnableNetworkLogs) { - InternalMessageHandler.HandleNetworkLog(clientId, messageStream); + MessageHandler.HandleNetworkLog(clientId, messageStream); } break; @@ -1153,7 +1168,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); } } @@ -1171,7 +1186,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); } } @@ -1197,9 +1212,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/IInternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs new file mode 100644 index 0000000000..7438683a66 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/IInternalMessageHandler.cs @@ -0,0 +1,27 @@ +using System; +using System.IO; +using MLAPI.Messaging.Buffering; + +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); + 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 bb28fcfda2..1f9d6001b4 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 : IInternalMessageHandler { #if DEVELOPMENT_BUILD || UNITY_EDITOR private static ProfilerMarker s_HandleConnectionRequest = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleConnectionRequest)}"); @@ -39,12 +39,20 @@ 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) + 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 @@ internal static 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 @@ -81,44 +89,43 @@ internal static void HandleConnectionRequest(ulong clientId, Stream stream) #endif } - internal static 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(); #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.SpawnManager.DestroySceneObjects(); + NetworkManager.SpawnManager.DestroySceneObjects(); } else { - NetworkManager.Singleton.SpawnManager.ClientCollectSoftSyncSceneObjectSweep(null); + NetworkManager.SpawnManager.ClientCollectSoftSyncSceneObjectSweep(null); } var objectCount = continuationReader.ReadUInt32Packed(); @@ -149,7 +156,7 @@ void DelayedSpawnAction(Stream continuationStream) var networkObject = NetworkManager.Singleton.SpawnManager.CreateLocalNetworkObject(softSync, prefabHash, ownerId, parentNetworkId, pos, rot); NetworkManager.Singleton.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) @@ -157,15 +164,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); } } @@ -198,7 +205,7 @@ void OnSceneLoadComplete() #endif } - internal static void HandleAddObject(ulong clientId, Stream stream) + public void HandleAddObject(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleAddObject.Begin(); @@ -233,7 +240,7 @@ internal static void HandleAddObject(ulong clientId, Stream stream) var networkObject = NetworkManager.Singleton.SpawnManager.CreateLocalNetworkObject(softSync, prefabHash, ownerClientId, parentNetworkId, pos, rot); NetworkManager.Singleton.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) @@ -241,7 +248,7 @@ internal static 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); } } @@ -251,7 +258,7 @@ internal static void HandleAddObject(ulong clientId, Stream stream) #endif } - internal static void HandleDestroyObject(ulong clientId, Stream stream) + public void HandleDestroyObject(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleDestroyObject.Begin(); @@ -259,14 +266,14 @@ internal static 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(); #endif } - internal static void HandleSwitchScene(ulong clientId, Stream stream) + public void HandleSwitchScene(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleSwitchScene.Begin(); @@ -287,7 +294,7 @@ internal static void HandleSwitchScene(ulong clientId, Stream stream) #endif } - internal static void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) + public void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleClientSwitchSceneCompleted.Begin(); @@ -301,7 +308,7 @@ internal static void HandleClientSwitchSceneCompleted(ulong clientId, Stream str #endif } - internal static void HandleChangeOwner(ulong clientId, Stream stream) + public void HandleChangeOwner(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleChangeOwner.Begin(); @@ -311,26 +318,26 @@ internal static 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(); #endif } - internal static void HandleAddObjects(ulong clientId, Stream stream) + public void HandleAddObjects(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleAddObjects.Begin(); @@ -349,7 +356,7 @@ internal static void HandleAddObjects(ulong clientId, Stream stream) #endif } - internal static void HandleDestroyObjects(ulong clientId, Stream stream) + public void HandleDestroyObjects(ulong clientId, Stream stream) { #if DEVELOPMENT_BUILD || UNITY_EDITOR s_HandleDestroyObjects.Begin(); @@ -368,7 +375,7 @@ internal static void HandleDestroyObjects(ulong clientId, Stream stream) #endif } - internal static 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(); @@ -376,19 +383,19 @@ internal static void HandleTimeSync(ulong clientId, Stream stream, float receive 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(); #endif } - internal static 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(); #endif - if (!NetworkManager.Singleton.NetworkConfig.EnableNetworkVariable) + if (!NetworkManager.NetworkConfig.EnableNetworkVariable) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) { @@ -403,9 +410,9 @@ internal static void HandleNetworkVariableDelta(ulong clientId, Stream stream, A ulong networkObjectId = reader.ReadUInt64Packed(); ushort networkBehaviourIndex = reader.ReadUInt16Packed(); - if (NetworkManager.Singleton.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId)) + if (NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId)) { - NetworkBehaviour instance = NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkObjectId].GetNetworkBehaviourAtOrderIndex(networkBehaviourIndex); + NetworkBehaviour instance = NetworkManager.SpawnManager.SpawnedObjects[networkObjectId].GetNetworkBehaviourAtOrderIndex(networkBehaviourIndex); if (instance == null) { @@ -419,7 +426,7 @@ internal static void HandleNetworkVariableDelta(ulong clientId, Stream stream, A NetworkBehaviour.HandleNetworkVariableDeltas(instance.NetworkVariableFields, stream, clientId, instance); } } - else if (NetworkManager.Singleton.IsServer || !NetworkManager.Singleton.NetworkConfig.EnableMessageBuffering) + else if (NetworkManager.IsServer || !NetworkManager.NetworkConfig.EnableMessageBuffering) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) { @@ -441,12 +448,12 @@ internal static void HandleNetworkVariableDelta(ulong clientId, Stream stream, A #endif } - internal static void HandleNetworkVariableUpdate(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(); #endif - if (!NetworkManager.Singleton.NetworkConfig.EnableNetworkVariable) + if (!NetworkManager.NetworkConfig.EnableNetworkVariable) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) { @@ -461,9 +468,9 @@ internal static void HandleNetworkVariableUpdate(ulong clientId, Stream stream, ulong networkObjectId = reader.ReadUInt64Packed(); ushort networkBehaviourIndex = reader.ReadUInt16Packed(); - if (NetworkManager.Singleton.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId)) + if (NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId)) { - var networkBehaviour = NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkObjectId].GetNetworkBehaviourAtOrderIndex(networkBehaviourIndex); + var networkBehaviour = NetworkManager.SpawnManager.SpawnedObjects[networkObjectId].GetNetworkBehaviourAtOrderIndex(networkBehaviourIndex); if (networkBehaviour == null) { @@ -477,7 +484,7 @@ internal static void HandleNetworkVariableUpdate(ulong clientId, Stream stream, NetworkBehaviour.HandleNetworkVariableUpdate(networkBehaviour.NetworkVariableFields, stream, clientId, networkBehaviour); } } - else if (NetworkManager.Singleton.IsServer || !NetworkManager.Singleton.NetworkConfig.EnableMessageBuffering) + else if (NetworkManager.IsServer || !NetworkManager.NetworkConfig.EnableMessageBuffering) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) { @@ -505,9 +512,9 @@ internal static void HandleNetworkVariableUpdate(ulong clientId, Stream stream, /// /// /// - internal static 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) + if (NetworkManager.IsServer && clientId == NetworkManager.ServerClientId) { return; } @@ -527,7 +534,7 @@ internal static void RpcReceiveQueueItem(ulong clientId, Stream stream, float re } #endif - var rpcQueueContainer = NetworkManager.Singleton.RpcQueueContainer; + var rpcQueueContainer = NetworkManager.RpcQueueContainer; rpcQueueContainer.AddQueueItemToInboundFrame(queueItemType, receiveTime, clientId, (NetworkBuffer)stream); #if DEVELOPMENT_BUILD || UNITY_EDITOR @@ -543,7 +550,7 @@ internal static void RpcReceiveQueueItem(ulong clientId, Stream stream, float re #endif } - internal static void HandleUnnamedMessage(ulong clientId, Stream stream) + public void HandleUnnamedMessage(ulong clientId, Stream stream) { PerformanceDataManager.Increment(ProfilerConstants.UnnamedMessageReceived); ProfilerStatManager.UnnamedMessage.Record(); @@ -556,7 +563,7 @@ internal static void HandleUnnamedMessage(ulong clientId, Stream stream) #endif } - internal static void HandleNamedMessage(ulong clientId, Stream stream) + public void HandleNamedMessage(ulong clientId, Stream stream) { PerformanceDataManager.Increment(ProfilerConstants.NamedMessageReceived); ProfilerStatManager.NamedMessage.Record(); @@ -574,7 +581,7 @@ internal static void HandleNamedMessage(ulong clientId, Stream stream) #endif } - internal static 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/NetworkManagerMessageHandlerTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs new file mode 100644 index 0000000000..d5c1870909 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs @@ -0,0 +1,392 @@ +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 NetworkManagerMessageHandlerTests + { + [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(); + + // 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(); + + // 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 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)); + + 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(NetworkManagerMessageHandlerTests.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/NetworkManagerMessageHandlerTests.cs.meta b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs.meta new file mode 100644 index 0000000000..b455436403 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Editor/NetworkManagerMessageHandlerTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 976ca592c7fa4bcb854203dfbadc0ad9 +timeCreated: 1617913395 \ No newline at end of file