Exemplo n.º 1
0
        public void PerformanceTest()
        {
            var iterationCount = 3;
            var buffer         = new byte[1024 * 1024 * 1024];
            var gcHandle       = GCHandle.Alloc(buffer, GCHandleType.Pinned);

            try
            {
                var distinctMessages = new[]
                {
                    new string('a', 42),
                    new string('b', 256),
                    new string('c', 512),
                    new string('d', 1024 + 512),
                };

                var messages     = new List <string>();
                var messageCount = 0;
                var dataLength   = 0;
                while (dataLength < buffer.Length - 4096)
                {
                    var message = distinctMessages[messageCount % distinctMessages.Length];
                    messages.Add(message);
                    dataLength += message.Length + sizeof(int);
                }

                var length   = WriteLengthPrefixedMessages(buffer, messages.ToArray());
                var segments = CreateBuffers((byte *)gcHandle.AddrOfPinnedObject(), (RIO_BUF *)gcHandle.AddrOfPinnedObject(), length, 1024);

                Console.WriteLine($"{iterationCount} x {messages.Count:N0} messages");

                var releaser           = new TestReleaser();
                var framer             = new MessageFramer(releaser);
                var framedMessageCount = 0;

                GC.Collect();
                var sw = Stopwatch.StartNew();

                for (var iterations = 0; iterations < iterationCount; iterations++)
                {
                    foreach (var segment in segments)
                    {
                        List <BufferSegment> frame;
                        while (framer.TryFrameNextMessage(segment, out frame))
                        {
                            framedMessageCount++;
                        }
                    }
                }

                sw.Stop();
                var fps = framedMessageCount / sw.Elapsed.TotalSeconds;
                Console.WriteLine($"{framedMessageCount:N0} frames in {sw.Elapsed.TotalMilliseconds:N0} ms ({fps:N0} fps)");
            }
            finally
            {
                gcHandle.Free();
            }
        }
        public async Task Should_use_non_transparent_framing(FramingType framingType, byte[] expectedSuffix)
        {
            var framer = new MessageFramer(framingType);

            using (var ms = new MemoryStream())
            {
                await framer.WriteFrame(this.message, ms);

                var data = ms.ToArray();
                data.EndsWith(expectedSuffix).ShouldBeTrue();
            }
        }
Exemplo n.º 3
0
        public void should_frame_single_message_5()
        {
            // Arrange
            var    framer        = new MessageFramer(1024);
            string framedMessage = null;

            framer.MessageFramed += message => framedMessage = Encoding.ASCII.GetString(message);
            var expectedMessage = "oui";

            // Act
            framer.SubmitBytes(BitConverter.GetBytes(expectedMessage.Length).Concat(Encoding.ASCII.GetBytes(expectedMessage).Take(6)).ToArray());
            framer.SubmitBytes(Encoding.ASCII.GetBytes(expectedMessage).Skip(6).ToArray());

            // Assert
            Assert.AreEqual(expectedMessage, framedMessage);
        }
Exemplo n.º 4
0
        public void should_frame_single_message()
        {
            // Arrange
            var    framer        = new MessageFramer(1024);
            string framedMessage = null;

            framer.MessageFramed += message => framedMessage = Encoding.ASCII.GetString(message);

            var expectedMessage = "oui";
            var payLoad         = BitConverter.GetBytes(expectedMessage.Length).Concat(Encoding.ASCII.GetBytes(expectedMessage)).ToArray();

            // Act
            framer.SubmitBytes(new Span <byte>(payLoad));

            // Assert
            Assert.AreEqual(expectedMessage, framedMessage);
        }
Exemplo n.º 5
0
        public void should_frame(string messageData, int bufferLength, string releasedBufferData)
        {
            // Arrange
            var releaser = new TestReleaser();
            var framer   = new MessageFramer(releaser);

            var expectedLastReleasedSegmentIds = releasedBufferData.Split('|').Select(x => x == "-" ? -1 : int.Parse(x)).ToArray();
            var expectedFramedMessages         = messageData.Split('|');
            var length   = WriteLengthPrefixedMessages(_underlyingBuffer, expectedFramedMessages);
            var segments = CreateBuffers((byte *)_bufferHandle.AddrOfPinnedObject(), (RIO_BUF *)_segmentbufferHandle.AddrOfPinnedObject(), length, bufferLength);

            var framedMessages         = new List <string>();
            var lastReleasedSegmentIds = new List <int>();

            // Act
            foreach (var segment in segments)
            {
                List <BufferSegment> frame;
                while (framer.TryFrameNextMessage(segment, out frame))
                {
                    var message = CreateMessage(frame);

                    framedMessages.Add(message);
                    lastReleasedSegmentIds.Add(releaser.LastReleasedSegmentId);
                }

                lastReleasedSegmentIds.Add(releaser.LastReleasedSegmentId);
            }

            // Assert
            Assert.AreEqual(expectedFramedMessages.Length, framedMessages.Count);
            for (var j = 0; j < expectedFramedMessages.Length; j++)
            {
                Assert.AreEqual(expectedFramedMessages[j], framedMessages[j]);
            }

            Assert.AreEqual(expectedLastReleasedSegmentIds.Length, lastReleasedSegmentIds.Count);
            for (var j = 0; j < expectedLastReleasedSegmentIds.Length; j++)
            {
                Assert.AreEqual(expectedLastReleasedSegmentIds[j], lastReleasedSegmentIds[j]);
            }
        }
Exemplo n.º 6
0
        public void should_frame_multiple_messages()
        {
            // Arrange
            var framer           = new MessageFramer(1024);
            var receivedMessages = new List <string>();

            framer.MessageFramed += message => receivedMessages.Add(Encoding.ASCII.GetString(message));

            var firstMessage  = "oui";
            var secondMessage = "no";
            var payLoad       = BitConverter.GetBytes(firstMessage.Length)
                                .Concat(Encoding.ASCII.GetBytes(firstMessage))
                                .Concat(BitConverter.GetBytes(secondMessage.Length))
                                .Concat(Encoding.ASCII.GetBytes(secondMessage))
                                .ToArray();

            // Act
            framer.SubmitBytes(new Span <byte>(payLoad));

            // Assert
            CollectionAssert.AreEquivalent(receivedMessages, new [] { firstMessage, secondMessage });
        }
        public async Task Should_use_transparent_framing()
        {
            var framer = new MessageFramer(FramingType.OCTET_COUNTING);

            using (var ms = new MemoryStream())
            {
                await framer.WriteFrame(this.message, ms);

                var data   = ms.ToArray();
                var prefix = data.TakeWhile(b => b != SPACE).ToArray();
                var msgLen = Encoding.UTF8.GetString(prefix).ToInt();

                // The length of the whole frame should be:
                // - The length of the prefix containing the syslog message length
                // - The separating space character
                // - The length of the syslog message, as specified by the prefix
                data.Length.ShouldBe(prefix.Length + 1 + msgLen);

                var framedMessage = Encoding.UTF8.GetString(data);
                framedMessage.ShouldBe($"{msgLen} {this.message}");
            }
        }