示例#1
0
        public void TestSimpleMessage()
        {
            Configuration.SocketConfig config = new Configuration.SocketConfig()
            {
                MinimumMTU = 1050
            };

            MemoryManager memoryManager = new MemoryManager(config);

            Connection clientsConnectionToServer = Connection.Stub(config, memoryManager);
            Connection serversConnectionToClient = Connection.Stub(config, memoryManager);

            ReliableSequencedChannel clientChannel = new ReliableSequencedChannel(0, clientsConnectionToServer, config, memoryManager);
            ReliableSequencedChannel serverChannel = new ReliableSequencedChannel(0, serversConnectionToClient, config, memoryManager);

            byte[] message = BufferHelper.GetRandomBuffer(1024, 0);

            HeapMemory          messageMemory = ((HeapMemory)clientChannel.CreateOutgoingMessage(new ArraySegment <byte>(message, 0, 1024), out _, out bool dealloc).Pointers[0]);
            ArraySegment <byte>?payload       = serverChannel.HandleIncomingMessagePoll(new ArraySegment <byte>(messageMemory.Buffer, (int)messageMemory.VirtualOffset + 2, (int)messageMemory.VirtualCount - 2), out _, out bool hasMore);

            Assert.NotNull(payload);
            Assert.False(hasMore);

            Assert.That(BufferHelper.ValidateBufferSizeAndIdentity(payload.Value, 0, 1024));
        }
示例#2
0
        public void TestOutOfOrder()
        {
            Configuration.SocketConfig config = new Configuration.SocketConfig()
            {
                MinimumMTU = 1050
            };

            MemoryManager memoryManager = new MemoryManager(config);

            Connection clientsConnectionToServer = Connection.Stub(config, memoryManager);
            Connection serversConnectionToClient = Connection.Stub(config, memoryManager);

            ReliableSequencedChannel clientChannel = new ReliableSequencedChannel(0, clientsConnectionToServer, config, memoryManager);
            ReliableSequencedChannel serverChannel = new ReliableSequencedChannel(0, serversConnectionToClient, config, memoryManager);

            // Create 3 payloads
            byte[] message1 = BufferHelper.GetRandomBuffer(1024, 0);
            byte[] message2 = BufferHelper.GetRandomBuffer(1024, 1);
            byte[] message3 = BufferHelper.GetRandomBuffer(1024, 2);

            // Sequence all payloads as outgoing
            HeapMemory message1Memory = ((HeapMemory)clientChannel.CreateOutgoingMessage(new ArraySegment <byte>(message1, 0, 1024), out _, out bool dealloc).Pointers[0]);
            HeapMemory message2Memory = ((HeapMemory)clientChannel.CreateOutgoingMessage(new ArraySegment <byte>(message2, 0, 1024), out _, out dealloc).Pointers[0]);
            HeapMemory message3Memory = ((HeapMemory)clientChannel.CreateOutgoingMessage(new ArraySegment <byte>(message3, 0, 1024), out _, out dealloc).Pointers[0]);

            // Consume 1st payload
            ArraySegment <byte>?payload1 = serverChannel.HandleIncomingMessagePoll(new ArraySegment <byte>(message1Memory.Buffer, (int)message1Memory.VirtualOffset + 2, (int)message1Memory.VirtualCount - 2), out _, out bool hasMore1);
            // Consume 3rd payload
            ArraySegment <byte>?payload3 = serverChannel.HandleIncomingMessagePoll(new ArraySegment <byte>(message3Memory.Buffer, (int)message3Memory.VirtualOffset + 2, (int)message3Memory.VirtualCount - 2), out _, out bool hasMore3);
            // Consume 2nd payload
            ArraySegment <byte>?payload2 = serverChannel.HandleIncomingMessagePoll(new ArraySegment <byte>(message2Memory.Buffer, (int)message2Memory.VirtualOffset + 2, (int)message2Memory.VirtualCount - 2), out _, out bool hasMore2);

            HeapMemory pollMemory = serverChannel.HandlePoll();

            {
                Assert.NotNull(payload1);
                Assert.False(hasMore1);
                Assert.That(BufferHelper.ValidateBufferSizeAndIdentity(payload1.Value, 0, 1024));
            }

            {
                Assert.Null(payload3);
                Assert.False(hasMore3);
            }

            {
                Assert.NotNull(payload2);
                Assert.True(hasMore2);
                Assert.That(BufferHelper.ValidateBufferSizeAndIdentity(payload2.Value, 1, 1024));
            }

            {
                // Check for the third packet
                Assert.NotNull(pollMemory);
                Assert.That(BufferHelper.ValidateBufferSizeAndIdentity(pollMemory, 2, 1024));
            }
        }
示例#3
0
        public void TestReliableSequencedChannelReceiveOutOfSequence()
        {
            ReliableSequencedChannel sender   = new ReliableSequencedChannel(0);
            ReliableSequencedChannel receiver = new ReliableSequencedChannel(0);

            RemotePeer      firstPeer;
            ChanneledPacket firstPacket;
            {
                // Create first packet with sequence 1
                firstPeer = new RemotePeer();// (new IPEndPoint(IPAddress.Any, 5670));
                ulong sessionId = (ulong)0;
                firstPeer.ChallengeResult = sessionId;
                byte[] payload = new byte[0];
                firstPacket = sender.CreateOutgoingMessage(payload, 0, payload.Length);
            }
            {
                Random random = new Random(0);
                foreach (int i in Enumerable.Range(1, 100).OrderBy(x => random.Next()))
                {
                    RemotePeer fakePeer  = new RemotePeer(); // (new IPEndPoint(IPAddress.Any, 5670));
                    ulong      sessionId = (ulong)i;
                    fakePeer.ChallengeResult = sessionId;
                    byte[] payload = new byte[random.Next(0, 1024)];
                    random.NextBytes(payload);
                    ChanneledPacket         sent      = sender.CreateOutgoingMessage(payload, 0, payload.Length);
                    byte[]                  buffer    = new byte[5000];
                    int                     oSize     = sent.Write(buffer, fakePeer);
                    ReliableSequencedPacket incPacket = (ReliableSequencedPacket)receiver.HandleIncomingMessagePoll(buffer, oSize, out bool hasMore);
                    Assert.IsNull(incPacket);
                }
            }

            {
                byte[] buffer = new byte[5000];
                int    oSize  = firstPacket.Write(buffer, firstPeer);
                ReliableSequencedPacket incPacket = (ReliableSequencedPacket)receiver.HandleIncomingMessagePoll(buffer, oSize, out bool hasMore);

                Assert.NotNull(incPacket);
                Assert.IsTrue(incPacket.Payload.Length == 0);
                Assert.IsTrue(hasMore);
            }

            {
                Random random = new Random(0);
                foreach (int i in Enumerable.Range(1, 100).OrderBy(x => random.Next()))
                {
                    ulong  sessionId = (ulong)i;
                    byte[] payload   = new byte[random.Next(0, 1024)];
                    random.NextBytes(payload);
                    ReliableSequencedPacket incPacket = (ReliableSequencedPacket)receiver.HandlePoll();
                    Assert.NotNull(incPacket);
                    CollectionAssert.AreEqual(incPacket.Payload, payload);
                }
            }
        }
示例#4
0
        public void TestReliableSequencedChannelReceiveInSequence()
        {
            ReliableSequencedChannel sender   = new ReliableSequencedChannel(0);
            ReliableSequencedChannel receiver = new ReliableSequencedChannel(0);

            Random random = new Random(0);

            for (int i = 0; i < 100000; i++)
            {
                RemotePeer fakePeer  = new RemotePeer();// new IPEndPoint(IPAddress.Any, 5670));
                ulong      sessionId = RandomUtils.GetULong(false);
                fakePeer.ChallengeResult = sessionId;
                int    payLength = random.Next(0, 1024);
                byte[] payload   = new byte[payLength];
                random.NextBytes(payload);
                ChanneledPacket         sent      = sender.CreateOutgoingMessage(payload, 0, payload.Length);
                byte[]                  buffer    = new byte[5000];
                int                     oSize     = sent.Write(buffer, fakePeer);
                ReliableSequencedPacket incPacket = (ReliableSequencedPacket)receiver.HandleIncomingMessagePoll(buffer, oSize, out bool hasMore);
                Assert.IsNotNull(incPacket, "it:" + i);
                Assert.AreEqual(payLength, incPacket.Payload.Length);
                CollectionAssert.AreEqual(payload, incPacket.Payload);
            }
        }