From 7dfb6fdc5242710e100c47f2f474752e1882018d Mon Sep 17 00:00:00 2001 From: Jan Eggers Date: Mon, 25 Jun 2018 14:51:46 +0200 Subject: [PATCH] fixed dup flag serialization and added roundtrip tests --- Source/MQTTnet/Packets/MqttPubAckPacket.cs | 2 +- .../Serializer/MqttPacketSerializer.cs | 2 +- .../MqttPacketSerializerTests.cs | 77 +++++++++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/Source/MQTTnet/Packets/MqttPubAckPacket.cs b/Source/MQTTnet/Packets/MqttPubAckPacket.cs index 3015f278..5811849b 100644 --- a/Source/MQTTnet/Packets/MqttPubAckPacket.cs +++ b/Source/MQTTnet/Packets/MqttPubAckPacket.cs @@ -4,7 +4,7 @@ { public override string ToString() { - return "PubAck"; + return $"PubAck [PacketIdentifier={PacketIdentifier}]"; } } } diff --git a/Source/MQTTnet/Serializer/MqttPacketSerializer.cs b/Source/MQTTnet/Serializer/MqttPacketSerializer.cs index 537513db..f1eb790a 100644 --- a/Source/MQTTnet/Serializer/MqttPacketSerializer.cs +++ b/Source/MQTTnet/Serializer/MqttPacketSerializer.cs @@ -190,7 +190,7 @@ namespace MQTTnet.Serializer var retain = (receivedMqttPacket.FixedHeader & 0x1) > 0; var qualityOfServiceLevel = (MqttQualityOfServiceLevel)(receivedMqttPacket.FixedHeader >> 1 & 0x3); - var dup = (receivedMqttPacket.FixedHeader & 0x3) > 0; + var dup = (receivedMqttPacket.FixedHeader & 0x8) > 0; var topic = receivedMqttPacket.Body.ReadStringWithLengthPrefix(); diff --git a/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs b/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs index 0a0fa2b0..61b69eb5 100644 --- a/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs @@ -199,6 +199,64 @@ namespace MQTTnet.Core.Tests DeserializeAndCompare(p, "Ow4ABUEvQi9DAHtIRUxMTw=="); } + [TestMethod] + public void DeserializeV311_MqttPublishPacket_Qos1() + { + var p = new MqttPublishPacket + { + QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, + }; + + var p2 = Roundtrip(p); + + Assert.AreEqual(p.QualityOfServiceLevel, p2.QualityOfServiceLevel); + Assert.AreEqual(p.Dup, p2.Dup); + } + + [TestMethod] + public void DeserializeV311_MqttPublishPacket_Qos2() + { + var p = new MqttPublishPacket + { + QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce, + PacketIdentifier = 1 + }; + + var p2 = Roundtrip(p); + + Assert.AreEqual(p.QualityOfServiceLevel, p2.QualityOfServiceLevel); + Assert.AreEqual(p.Dup, p2.Dup); + } + + [TestMethod] + public void DeserializeV311_MqttPublishPacket_Qos3() + { + var p = new MqttPublishPacket + { + QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce, + PacketIdentifier = 1 + }; + + var p2 = Roundtrip(p); + + Assert.AreEqual(p.QualityOfServiceLevel, p2.QualityOfServiceLevel); + Assert.AreEqual(p.Dup, p2.Dup); + } + + + [TestMethod] + public void DeserializeV311_MqttPublishPacket_DupFalse() + { + var p = new MqttPublishPacket + { + Dup = false, + }; + + var p2 = Roundtrip(p); + + Assert.AreEqual(p.Dup, p2.Dup); + } + [TestMethod] public void SerializeV311_MqttPubAckPacket() { @@ -430,6 +488,25 @@ namespace MQTTnet.Core.Tests } } + private static T Roundtrip(T packet, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311) + where T : MqttBasePacket + { + var serializer = new MqttPacketSerializer { ProtocolVersion = protocolVersion }; + + var buffer1 = serializer.Serialize(packet); + + using (var headerStream = new MemoryStream(Join(buffer1))) + { + var channel = new TestMqttChannel(headerStream); + var header = MqttPacketReader.ReadFixedHeaderAsync(channel, CancellationToken.None).GetAwaiter().GetResult(); + + using (var bodyStream = new MemoryStream(Join(buffer1), (int)headerStream.Position, header.RemainingLength)) + { + return (T)serializer.Deserialize(new ReceivedMqttPacket(header.Flags, new MqttPacketBodyReader(bodyStream.ToArray(), 0))); + } + } + } + private static byte[] Join(params ArraySegment[] chunks) { var buffer = new MemoryStream();