internal class UdpConnectionTestHarness : UdpConnection
{
public List<MessageReader> BytesSent = new List<MessageReader>();
+ public ushort ReliableReceiveLast => this.reliableReceiveLast;
+
public override void Connect(byte[] bytes = null, int timeout = 5000)
{
[TestClass]
public class UdpReliabilityTests
{
+ [TestMethod]
+ public void TestReliableWrapOffByOne()
+ {
+ List<MessageReader> messagesReceived = new List<MessageReader>();
+
+ UdpConnectionTestHarness dut = new UdpConnectionTestHarness();
+ dut.DataReceived += evt =>
+ {
+ messagesReceived.Add(evt.Message);
+ };
+
+ MessageWriter data = MessageWriter.Get(SendOption.Reliable);
+
+ Assert.AreEqual(ushort.MaxValue, dut.ReliableReceiveLast);
+
+ SetReliableId(data, 10);
+ dut.Test_Receive(data);
+
+ // This message may not be received if there is an off-by-one error when marking missed pkts up to 10.
+ SetReliableId(data, 9);
+ dut.Test_Receive(data);
+
+ // Both messages should be received.
+ Assert.AreEqual(2, messagesReceived.Count);
+ messagesReceived.Clear();
+
+ Assert.AreEqual(2, dut.BytesSent.Count);
+ dut.BytesSent.Clear();
+ }
+
[TestMethod]
public void TestThatAllMessagesAreReceived()
{
/// <summary>
/// The packet id that was received last.
/// </summary>
- private volatile ushort reliableReceiveLast = ushort.MaxValue;
+ protected volatile ushort reliableReceiveLast = ushort.MaxValue;
private object PingLock = new object();
else
{
int cnt = (ushort.MaxValue - reliableReceiveLast) + id;
- for (ushort i = 1; i < cnt; ++i)
+ for (ushort i = 1; i <= cnt; ++i)
{
reliableDataPacketsMissing.Add((ushort)(i + reliableReceiveLast));
}