Example #1
0
        public void Test()
        {
            var logger       = new TestLogger();
            var capacity     = 4;
            var jitterBuffer = new PacketJitterBuffer(logger, capacity);

            //
            // Simple test: add packets in order.
            //

            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 1,
            });;
            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 2,
            });
            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 3,
            });

            Assert.Equal(3, jitterBuffer.Count);

            ReplicationPacket packet = default;

            Assert.False(jitterBuffer.TryRead(FrameIndex.Zero, ref packet));
            Assert.True(jitterBuffer.TryRead(FrameIndex.Zero + 1, ref packet));
            Assert.Equal(1, packet.FrameNumber);
            Assert.True(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));
            Assert.Equal(2, packet.FrameNumber);
            Assert.True(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));
            Assert.Equal(3, packet.FrameNumber);
            Assert.False(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));

            //
            // Test: Add packets out of order
            //

            jitterBuffer.Clear(FrameIndex.Zero);

            // Reverse order
            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 3,
            });;
            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 2,
            });
            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 1,
            });

            Assert.Equal(3, jitterBuffer.Count);

            Assert.False(jitterBuffer.TryRead(FrameIndex.Zero, ref packet));
            Assert.True(jitterBuffer.TryRead(FrameIndex.Zero + 1, ref packet));
            Assert.Equal(1, packet.FrameNumber);
            Assert.True(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));
            Assert.Equal(2, packet.FrameNumber);
            Assert.True(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));
            Assert.Equal(3, packet.FrameNumber);
            Assert.False(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));

            //
            // Test: Add packets out of order with an interleaved read.
            //

            jitterBuffer.Clear(FrameIndex.Zero);

            // Reverse order
            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 4,
            });;
            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 3,
            });
            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 1,
            });

            Assert.Equal(3, jitterBuffer.Count);

            Assert.False(jitterBuffer.TryRead(FrameIndex.Zero, ref packet));
            Assert.True(jitterBuffer.TryRead(FrameIndex.Zero + 1, ref packet));
            Assert.Equal(1, packet.FrameNumber);

            jitterBuffer.AddPacket(new ReplicationPacket
            {
                FrameNumber = 2,
            });

            Assert.True(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));
            Assert.Equal(2, packet.FrameNumber);
            Assert.True(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));
            Assert.Equal(3, packet.FrameNumber);
            Assert.True(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));
            Assert.Equal(4, packet.FrameNumber);
            Assert.False(jitterBuffer.TryRead(new FrameIndex(packet.FrameNumber) + 1, ref packet));
        }