From fb6fe721aa042aab57ca4ebee443c892840d8ceb Mon Sep 17 00:00:00 2001 From: Ryan Karg Date: Fri, 23 Jun 2017 14:19:33 -0700 Subject: [PATCH 1/2] Adding tests on structured data element serialization. This fails with multiple elements because of a space between the elements that shouldn't be there --- .../SyslogRfc5424MessageSerializerTests.cs | 102 +++++++++++++----- 1 file changed, 73 insertions(+), 29 deletions(-) diff --git a/SyslogNet.Client.Tests/Serialization/SyslogRfc5424MessageSerializerTests.cs b/SyslogNet.Client.Tests/Serialization/SyslogRfc5424MessageSerializerTests.cs index 909f0f4..b8a3a87 100644 --- a/SyslogNet.Client.Tests/Serialization/SyslogRfc5424MessageSerializerTests.cs +++ b/SyslogNet.Client.Tests/Serialization/SyslogRfc5424MessageSerializerTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Text; using SyslogNet.Client.Serialization; using Xunit; @@ -93,35 +94,78 @@ public void CanFormatSyslogMessageWithMsgId(string msgId, string expectedMsgId) string serializedMsg = sut.Serialize(msg); Assert.Equal(String.Format("<11>1 - - - - {0} -", expectedMsgId), serializedMsg); - } - - [Theory] - [InlineData("The message", "The message")] - [InlineData("メッセージ", "メッセージ")] - public void CanFormatSyslogMessageWithUtf8Message(string message, string expectedMessage) - { - var msg = CreateMinimalSyslogMessage(Facility.UserLevelMessages, Severity.Error, message: message); - - string serializedMsg = sut.Serialize(msg); - - string messagePrefix = "<11>1 - - - - - - "; - Assert.True(serializedMsg.StartsWith(messagePrefix)); - - int messageIndex = 0; - var bom = new[] { (byte)239 /*EF*/, (byte)187 /*BB*/, (byte)191 /*BF*/ }; - - char[] bomChars = Encoding.UTF8.GetChars(bom); - foreach (char bomChar in bomChars) - { - char c = serializedMsg[messagePrefix.Length + messageIndex++]; - Assert.Equal(bomChar, c); - } - - string utf8MessagePart = serializedMsg.Substring(messagePrefix.Length + bomChars.Length); - Assert.Equal(expectedMessage, utf8MessagePart); - } - - private static SyslogMessage CreateMinimalSyslogMessage( + } + + [Theory] + [InlineData("The message", "The message")] + [InlineData("メッセージ", "メッセージ")] + public void CanFormatSyslogMessageWithUtf8Message(string message, string expectedMessage) + { + var msg = CreateMinimalSyslogMessage(Facility.UserLevelMessages, Severity.Error, message: message); + + string serializedMsg = sut.Serialize(msg); + + string messagePrefix = "<11>1 - - - - - - "; + Assert.True(serializedMsg.StartsWith(messagePrefix)); + + int messageIndex = 0; + var bom = new[] { (byte)239 /*EF*/, (byte)187 /*BB*/, (byte)191 /*BF*/ }; + + char[] bomChars = Encoding.UTF8.GetChars(bom); + foreach (char bomChar in bomChars) + { + char c = serializedMsg[messagePrefix.Length + messageIndex++]; + Assert.Equal(bomChar, c); + } + + string utf8MessagePart = serializedMsg.Substring(messagePrefix.Length + bomChars.Length); + Assert.Equal(expectedMessage, utf8MessagePart); + } + + [Fact] + public void CanFormatSyslogMessageWithSingleStructuredDataElement() + { + var sdi = "test@12345"; + var key = "key"; + var value = "value"; + + var structuredDataElements = new List + { + new StructuredDataElement(sdi, new Dictionary {{key, value}}) + }; + var msg = CreateMinimalSyslogMessage(Facility.UserLevelMessages, Severity.Error, structuredDataElements:structuredDataElements.ToArray()); + + string serializedMsg = sut.Serialize(msg); + + string messagePrefix = $"<11>1 - - - - - [{sdi} {key}=\"{value}\"]"; + Assert.True(serializedMsg.StartsWith(messagePrefix)); + } + + [Fact] + public void CanFormatSyslogMessageWithMultipleStructuredDataElement() + { + var sdi1 = "testA@12345"; + var key1 = "key"; + var value1 = "value"; + + var sdi2 = "testB@23456"; + var key2 = "key"; + var value2 = "value"; + + var structuredDataElements = new List + { + new StructuredDataElement(sdi1, new Dictionary {{key1, value1}}), + new StructuredDataElement(sdi2, new Dictionary {{key2, value2}}), + }; + var msg = CreateMinimalSyslogMessage(Facility.UserLevelMessages, Severity.Error, structuredDataElements: structuredDataElements.ToArray()); + + string serializedMsg = sut.Serialize(msg); + + string messagePrefix = $"<11>1 - - - - - [{sdi1} {key1}=\"{value1}\"][{sdi2} {key2}=\"{value2}\"]"; + Assert.True(serializedMsg.StartsWith(messagePrefix)); + } + + private static SyslogMessage CreateMinimalSyslogMessage( Facility facility, Severity severity, DateTimeOffset? dateTimeOffset = null, From 792b4b54aa947d5d75e39b947b89d232530e0c98 Mon Sep 17 00:00:00 2001 From: Ryan Karg Date: Fri, 23 Jun 2017 14:19:58 -0700 Subject: [PATCH 2/2] Removing erroneous space when serializing multiple structured data elements --- .../Serialization/SyslogRfc5424MessageSerializer.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/SyslogNet.Client/Serialization/SyslogRfc5424MessageSerializer.cs b/SyslogNet.Client/Serialization/SyslogRfc5424MessageSerializer.cs index 301b059..5e1937c 100644 --- a/SyslogNet.Client/Serialization/SyslogRfc5424MessageSerializer.cs +++ b/SyslogNet.Client/Serialization/SyslogRfc5424MessageSerializer.cs @@ -36,11 +36,13 @@ public void Serialize(SyslogMessage message, Stream stream) var structuredData = message.StructuredDataElements.ToList(); if (structuredData.Any()) { - // Structured data - foreach(StructuredDataElement sdElement in structuredData) + // Space + stream.WriteByte(32); + + // Structured data + foreach (StructuredDataElement sdElement in structuredData) { messageBuilder.Clear() - .Append(" ") .Append("[") .Append(sdElement.SdId.FormatSyslogSdnameField(asciiCharsBuffer));