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