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(); } }
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); }
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); }
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]); } }
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}"); } }