From 03c61ad82c1970b3bb61a5ad9d31147402e7f226 Mon Sep 17 00:00:00 2001 From: JanEggers Date: Mon, 15 Apr 2019 15:37:15 +0200 Subject: [PATCH] fixed tests and added testcase for user property serialization --- .../SpanBasedMqttPacketBodyReader.cs | 5 ++ .../SpanBasedMqttPacketWriter.cs | 9 ++- .../Formatter/MqttPacketFormatterAdapter.cs | 22 ++++---- Source/MQTTnet/Formatter/MqttPacketWriter.cs | 1 + .../MqttPacketSerializer_Tests.cs | 56 ++++++++++--------- 5 files changed, 51 insertions(+), 42 deletions(-) diff --git a/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketBodyReader.cs b/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketBodyReader.cs index dbfbb0fe..2b118f7b 100644 --- a/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketBodyReader.cs +++ b/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketBodyReader.cs @@ -51,6 +51,11 @@ namespace MQTTnet.AspNetCore public unsafe string ReadStringWithLengthPrefix() { var buffer = ReadSegmentWithLengthPrefix(); + if (buffer.Length == 0) + { + return string.Empty; + } + fixed (byte* bytes = &buffer.GetPinnableReference()) { var result = Encoding.UTF8.GetString(bytes, buffer.Length); diff --git a/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketWriter.cs b/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketWriter.cs index 7ad6e005..27e13c49 100644 --- a/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketWriter.cs +++ b/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketWriter.cs @@ -60,12 +60,11 @@ namespace MQTTnet.AspNetCore public void Write(IMqttPacketWriter propertyWriter) { - if (propertyWriter is SpanBasedMqttPacketWriter writer) - { - GrowIfNeeded(1); - } + if (propertyWriter == null) throw new ArgumentNullException(nameof(propertyWriter)); - throw new InvalidOperationException($"{nameof(propertyWriter)} must be of type {typeof(SpanBasedMqttPacketWriter).Name}"); + GrowIfNeeded(propertyWriter.Length); + Write(propertyWriter.GetBuffer(), 0, propertyWriter.Length); + Commit(propertyWriter.Length); } public void Write(byte[] payload, int start, int length) diff --git a/Source/MQTTnet/Formatter/MqttPacketFormatterAdapter.cs b/Source/MQTTnet/Formatter/MqttPacketFormatterAdapter.cs index 0b44228f..723b6b8c 100644 --- a/Source/MQTTnet/Formatter/MqttPacketFormatterAdapter.cs +++ b/Source/MQTTnet/Formatter/MqttPacketFormatterAdapter.cs @@ -89,28 +89,30 @@ namespace MQTTnet.Formatter } ProtocolVersion = protocolVersion; + _formatter = GetMqttPacketFormatter(protocolVersion, Writer); + } + public static IMqttPacketFormatter GetMqttPacketFormatter(MqttProtocolVersion protocolVersion, IMqttPacketWriter writer) + { + if (protocolVersion == MqttProtocolVersion.Unknown) + { + throw new InvalidOperationException("MQTT protocol version is invalid."); + } + switch (protocolVersion) { case MqttProtocolVersion.V500: { - _formatter = new MqttV500PacketFormatter(Writer); - break; + return new MqttV500PacketFormatter(writer); } - case MqttProtocolVersion.V311: { - _formatter = new MqttV311PacketFormatter(Writer); - break; + return new MqttV311PacketFormatter(writer); } - case MqttProtocolVersion.V310: { - - _formatter = new MqttV310PacketFormatter(Writer); - break; + return new MqttV310PacketFormatter(writer); } - default: { throw new NotSupportedException(); diff --git a/Source/MQTTnet/Formatter/MqttPacketWriter.cs b/Source/MQTTnet/Formatter/MqttPacketWriter.cs index d11cc544..eb7253e0 100644 --- a/Source/MQTTnet/Formatter/MqttPacketWriter.cs +++ b/Source/MQTTnet/Formatter/MqttPacketWriter.cs @@ -154,6 +154,7 @@ namespace MQTTnet.Formatter } Write(writer._buffer, 0, writer.Length); + return; } throw new InvalidOperationException($"{nameof(propertyWriter)} must be of type {typeof(MqttPacketWriter).Name}"); diff --git a/Tests/MQTTnet.Core.Tests/MqttPacketSerializer_Tests.cs b/Tests/MQTTnet.Core.Tests/MqttPacketSerializer_Tests.cs index e4dd1359..429a2312 100644 --- a/Tests/MQTTnet.Core.Tests/MqttPacketSerializer_Tests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttPacketSerializer_Tests.cs @@ -231,6 +231,32 @@ namespace MQTTnet.Tests SerializeAndCompare(p, "Ow4ABUEvQi9DAHtIRUxMTw=="); } + [TestMethod] + public void SerializeV500_MqttPublishPacket() + { + var prop = new MqttPublishPacketProperties(); + + prop.ResponseTopic = "/Response"; + + prop.UserProperties.Add(new MqttUserProperty("Foo", "Bar")); + + var p = new MqttPublishPacket + { + PacketIdentifier = 123, + Dup = true, + Retain = true, + Payload = Encoding.ASCII.GetBytes("HELLO"), + QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce, + Topic = "A/B/C", + Properties = prop + }; + + var deserialized = Roundtrip(p, MqttProtocolVersion.V500); + + Assert.AreEqual(prop.ResponseTopic, deserialized.Properties.ResponseTopic); + Assert.IsTrue(deserialized.Properties.UserProperties.Any(x => x.Name == "Foo")); + } + [TestMethod] public void DeserializeV311_MqttPublishPacket() { @@ -542,19 +568,7 @@ namespace MQTTnet.Tests { var writer = WriterFactory(); - IMqttPacketFormatter serializer; - if (protocolVersion == MqttProtocolVersion.V311) - { - serializer = new MqttV311PacketFormatter(writer); - } - else if (protocolVersion == MqttProtocolVersion.V310) - { - serializer = new MqttV310PacketFormatter(writer); - } - else - { - throw new NotSupportedException(); - } + var serializer = MqttPacketFormatterAdapter.GetMqttPacketFormatter(protocolVersion, writer); var buffer1 = serializer.Encode(packet); @@ -580,20 +594,8 @@ namespace MQTTnet.Tests { var writer = WriterFactory(); - IMqttPacketFormatter serializer; - if (protocolVersion == MqttProtocolVersion.V311) - { - serializer = new MqttV311PacketFormatter(writer); - } - else if (protocolVersion == MqttProtocolVersion.V310) - { - serializer = new MqttV310PacketFormatter(writer); - } - else - { - throw new NotSupportedException(); - } - + var serializer = MqttPacketFormatterAdapter.GetMqttPacketFormatter(protocolVersion, writer); + var buffer1 = serializer.Encode(packet); using (var headerStream = new MemoryStream(Join(buffer1)))