polygone/Library/PackageCache/com.unity.multiplayer.mlapi@3e3aef6aa0/Tests/Editor/RpcBatcherTests.cs
2021-08-02 05:44:37 -04:00

129 lines
No EOL
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using MLAPI.Messaging;
using MLAPI.Serialization;
using MLAPI.Transports;
using NUnit.Framework;
namespace MLAPI.EditorTests
{
public class RpcBatcherTests
{
[Test]
public void SendWithThreshold()
{
const int k_BatchThreshold = 256;
const int k_QueueItemCount = 128;
var sendBatcher = new RpcBatcher();
var sendStreamQueue = new Queue<NetworkBuffer>();
for (int i = 0; i < k_QueueItemCount; ++i)
{
var randomData = Encoding.ASCII.GetBytes(Guid.NewGuid().ToString());
var queueItem = new RpcFrameQueueItem
{
NetworkId = 123,
ClientNetworkIds = new ulong[] { 123 },
NetworkChannel = NetworkChannel.ChannelUnused + 123,
QueueItemType = i % 2 == 0 ? RpcQueueContainer.QueueItemType.ServerRpc : RpcQueueContainer.QueueItemType.ClientRpc,
MessageData = new ArraySegment<byte>(randomData, 0, randomData.Length)
};
sendBatcher.QueueItem(queueItem);
sendBatcher.SendItems(k_BatchThreshold,
(networkId, sendStream) =>
{
var queueStream = new NetworkBuffer();
sendStream.Buffer.CopyTo(queueStream);
sendStreamQueue.Enqueue(queueStream);
});
}
// batch the rest
sendBatcher.SendItems( /* thresholdBytes = */ 0,
(networkId, sendStream) =>
{
var queueStream = new NetworkBuffer();
sendStream.Buffer.CopyTo(queueStream);
sendStreamQueue.Enqueue(queueStream);
});
var recvBatcher = new RpcBatcher();
var recvItemCounter = 0;
foreach (var recvStream in sendStreamQueue)
{
recvStream.Position = 0;
// todo: revisit
// The following line is sub-optimal
// The stream returned by SendItems() includes:
// - 8 bits for the MLAPI message types.
// ReceiveItems expects those to have been stripped by the receive code.
// In order to replicate this behaviour, we'll read 8 bits before calling ReceiveItems()
recvStream.ReadByte();
recvBatcher.ReceiveItems(recvStream, (stream, type, id, time) => ++recvItemCounter, default, default, default);
}
Assert.AreEqual(k_QueueItemCount, recvItemCounter);
}
[Test]
public void SendWithoutThreshold()
{
const int k_BatchThreshold = 0;
const int k_QueueItemCount = 128;
var sendBatcher = new RpcBatcher();
var sendStreamQueue = new Queue<NetworkBuffer>();
for (int i = 0; i < k_QueueItemCount; ++i)
{
var randomData = Encoding.ASCII.GetBytes(Guid.NewGuid().ToString());
var queueItem = new RpcFrameQueueItem
{
NetworkId = 123,
ClientNetworkIds = new ulong[] { 123 },
NetworkChannel = NetworkChannel.ChannelUnused + 123,
QueueItemType = i % 2 == 0 ? RpcQueueContainer.QueueItemType.ServerRpc : RpcQueueContainer.QueueItemType.ClientRpc,
MessageData = new ArraySegment<byte>(randomData, 0, randomData.Length)
};
sendBatcher.QueueItem(queueItem);
sendBatcher.SendItems(k_BatchThreshold,
(networkId, sendStream) =>
{
var queueStream = new NetworkBuffer();
sendStream.Buffer.CopyTo(queueStream);
sendStreamQueue.Enqueue(queueStream);
});
}
// batch the rest
sendBatcher.SendItems( /* thresholdBytes = */ 0,
(networkId, sendStream) =>
{
var queueStream = new NetworkBuffer();
sendStream.Buffer.CopyTo(queueStream);
sendStreamQueue.Enqueue(queueStream);
});
var recvBatcher = new RpcBatcher();
var recvItemCounter = 0;
foreach (var recvStream in sendStreamQueue)
{
recvStream.Position = 0;
// todo: revisit
// The following line is sub-optimal
// The stream returned by SendItems() includes:
// - 8 bits for the MLAPI message types.
// ReceiveItems expects those to have been stripped by the receive code.
// In order to replicate this behaviour, we'll read 8 bits before calling ReceiveItems()
recvStream.ReadByte();
recvBatcher.ReceiveItems(recvStream, (stream, type, id, time) => ++recvItemCounter, default, default, default);
}
Assert.AreEqual(k_QueueItemCount, recvItemCounter);
}
}
}