|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- using System;
- using System.IO;
- using System.Text;
- using System.Threading;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using MQTTnet.Adapter;
- using MQTTnet.Internal;
- using MQTTnet.Packets;
- using MQTTnet.Protocol;
- using MQTTnet.Serializer;
-
- namespace MQTTnet.Core.Tests
- {
- [TestClass]
- public class MqttPacketSerializerTests
- {
- [TestMethod]
- public void SerializeV310_MqttConnectPacket()
- {
- var p = new MqttConnectPacket
- {
- ClientId = "XYZ",
- Password = "PASS",
- Username = "USER",
- KeepAlivePeriod = 123,
- CleanSession = true
- };
-
- SerializeAndCompare(p, "EB0ABk1RSXNkcAPCAHsAA1hZWgAEVVNFUgAEUEFTUw==", MqttProtocolVersion.V310);
- }
-
- [TestMethod]
- public void SerializeV311_MqttConnectPacket()
- {
- var p = new MqttConnectPacket
- {
- ClientId = "XYZ",
- Password = "PASS",
- Username = "USER",
- KeepAlivePeriod = 123,
- CleanSession = true
- };
-
- SerializeAndCompare(p, "EBsABE1RVFQEwgB7AANYWVoABFVTRVIABFBBU1M=");
- }
-
- [TestMethod]
- public void SerializeV311_MqttConnectPacketWithWillMessage()
- {
- var p = new MqttConnectPacket
- {
- ClientId = "XYZ",
- Password = "PASS",
- Username = "USER",
- KeepAlivePeriod = 123,
- CleanSession = true,
- WillMessage = new MqttApplicationMessage
- {
- Topic = "My/last/will",
- Payload = Encoding.UTF8.GetBytes("Good byte."),
- QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
- Retain = true
- }
- };
-
- SerializeAndCompare(p, "EDUABE1RVFQE7gB7AANYWVoADE15L2xhc3Qvd2lsbAAKR29vZCBieXRlLgAEVVNFUgAEUEFTUw==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttConnectPacket()
- {
- var p = new MqttConnectPacket
- {
- ClientId = "XYZ",
- Password = "PASS",
- Username = "USER",
- KeepAlivePeriod = 123,
- CleanSession = true
- };
-
- DeserializeAndCompare(p, "EBsABE1RVFQEwgB7AANYWVoABFVTRVIABFBBU1M=");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttConnectPacketWithWillMessage()
- {
- var p = new MqttConnectPacket
- {
- ClientId = "XYZ",
- Password = "PASS",
- Username = "USER",
- KeepAlivePeriod = 123,
- CleanSession = true,
- WillMessage = new MqttApplicationMessage
- {
- Topic = "My/last/will",
- Payload = Encoding.UTF8.GetBytes("Good byte."),
- QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
- Retain = true
- }
- };
-
- DeserializeAndCompare(p, "EDUABE1RVFQE7gB7AANYWVoADE15L2xhc3Qvd2lsbAAKR29vZCBieXRlLgAEVVNFUgAEUEFTUw==");
- }
-
- [TestMethod]
- public void SerializeV311_MqttConnAckPacket()
- {
- var p = new MqttConnAckPacket
- {
- IsSessionPresent = true,
- ConnectReturnCode = MqttConnectReturnCode.ConnectionRefusedNotAuthorized
- };
-
- SerializeAndCompare(p, "IAIBBQ==");
- }
-
- [TestMethod]
- public void SerializeV310_MqttConnAckPacket()
- {
- var p = new MqttConnAckPacket
- {
- ConnectReturnCode = MqttConnectReturnCode.ConnectionRefusedNotAuthorized
- };
-
- SerializeAndCompare(p, "IAIABQ==", MqttProtocolVersion.V310);
- }
-
- [TestMethod]
- public void DeserializeV311_MqttConnAckPacket()
- {
- var p = new MqttConnAckPacket
- {
- IsSessionPresent = true,
- ConnectReturnCode = MqttConnectReturnCode.ConnectionRefusedNotAuthorized
- };
-
- DeserializeAndCompare(p, "IAIBBQ==");
- }
-
- [TestMethod]
- public void DeserializeV310_MqttConnAckPacket()
- {
- var p = new MqttConnAckPacket
- {
- ConnectReturnCode = MqttConnectReturnCode.ConnectionRefusedNotAuthorized
- };
-
- DeserializeAndCompare(p, "IAIABQ==", MqttProtocolVersion.V310);
- }
-
- [TestMethod]
- public void SerializeV311_MqttDisconnectPacket()
- {
- SerializeAndCompare(new MqttDisconnectPacket(), "4AA=");
- }
-
- [TestMethod]
- public void SerializeV311_MqttPingReqPacket()
- {
- SerializeAndCompare(new MqttPingReqPacket(), "wAA=");
- }
-
- [TestMethod]
- public void SerializeV311_MqttPingRespPacket()
- {
- SerializeAndCompare(new MqttPingRespPacket(), "0AA=");
- }
-
- [TestMethod]
- public void SerializeV311_MqttPublishPacket()
- {
- var p = new MqttPublishPacket
- {
- PacketIdentifier = 123,
- Dup = true,
- Retain = true,
- Payload = Encoding.ASCII.GetBytes("HELLO"),
- QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
- Topic = "A/B/C"
- };
-
- SerializeAndCompare(p, "Ow4ABUEvQi9DAHtIRUxMTw==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttPublishPacket()
- {
- var p = new MqttPublishPacket
- {
- PacketIdentifier = 123,
- Dup = true,
- Retain = true,
- Payload = Encoding.ASCII.GetBytes("HELLO"),
- QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
- Topic = "A/B/C"
- };
-
- 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()
- {
- var p = new MqttPubAckPacket
- {
- PacketIdentifier = 123
- };
-
- SerializeAndCompare(p, "QAIAew==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttPubAckPacket()
- {
- var p = new MqttPubAckPacket
- {
- PacketIdentifier = 123
- };
-
- DeserializeAndCompare(p, "QAIAew==");
- }
-
- [TestMethod]
- public void SerializeV311_MqttPubRecPacket()
- {
- var p = new MqttPubRecPacket
- {
- PacketIdentifier = 123
- };
-
- SerializeAndCompare(p, "UAIAew==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttPubRecPacket()
- {
- var p = new MqttPubRecPacket
- {
- PacketIdentifier = 123
- };
-
- DeserializeAndCompare(p, "UAIAew==");
- }
-
- [TestMethod]
- public void SerializeV311_MqttPubRelPacket()
- {
- var p = new MqttPubRelPacket
- {
- PacketIdentifier = 123
- };
-
- SerializeAndCompare(p, "YgIAew==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttPubRelPacket()
- {
- var p = new MqttPubRelPacket
- {
- PacketIdentifier = 123
- };
-
- DeserializeAndCompare(p, "YgIAew==");
- }
-
- [TestMethod]
- public void SerializeV311_MqttPubCompPacket()
- {
- var p = new MqttPubCompPacket
- {
- PacketIdentifier = 123
- };
-
- SerializeAndCompare(p, "cAIAew==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttPubCompPacket()
- {
- var p = new MqttPubCompPacket
- {
- PacketIdentifier = 123
- };
-
- DeserializeAndCompare(p, "cAIAew==");
- }
-
- [TestMethod]
- public void SerializeV311_MqttSubscribePacket()
- {
- var p = new MqttSubscribePacket
- {
- PacketIdentifier = 123
- };
-
- p.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce));
- p.TopicFilters.Add(new TopicFilter("1/2/3", MqttQualityOfServiceLevel.AtLeastOnce));
- p.TopicFilters.Add(new TopicFilter("x/y/z", MqttQualityOfServiceLevel.AtMostOnce));
-
- SerializeAndCompare(p, "ghoAewAFQS9CL0MCAAUxLzIvMwEABXgveS96AA==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttSubscribePacket()
- {
- var p = new MqttSubscribePacket
- {
- PacketIdentifier = 123
- };
-
- p.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce));
- p.TopicFilters.Add(new TopicFilter("1/2/3", MqttQualityOfServiceLevel.AtLeastOnce));
- p.TopicFilters.Add(new TopicFilter("x/y/z", MqttQualityOfServiceLevel.AtMostOnce));
-
- DeserializeAndCompare(p, "ghoAewAFQS9CL0MCAAUxLzIvMwEABXgveS96AA==");
- }
-
- [TestMethod]
- public void SerializeV311_MqttSubAckPacket()
- {
- var p = new MqttSubAckPacket
- {
- PacketIdentifier = 123
- };
-
- p.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS0);
- p.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS1);
- p.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS2);
- p.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.Failure);
-
- SerializeAndCompare(p, "kAYAewABAoA=");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttSubAckPacket()
- {
- var p = new MqttSubAckPacket
- {
- PacketIdentifier = 123
- };
-
- p.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS0);
- p.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS1);
- p.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS2);
- p.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.Failure);
-
- DeserializeAndCompare(p, "kAYAewABAoA=");
- }
-
- [TestMethod]
- public void SerializeV311_MqttUnsubscribePacket()
- {
- var p = new MqttUnsubscribePacket
- {
- PacketIdentifier = 123
- };
-
- p.TopicFilters.Add("A/B/C");
- p.TopicFilters.Add("1/2/3");
- p.TopicFilters.Add("x/y/z");
-
- SerializeAndCompare(p, "ohcAewAFQS9CL0MABTEvMi8zAAV4L3kveg==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttUnsubscribePacket()
- {
- var p = new MqttUnsubscribePacket
- {
- PacketIdentifier = 123
- };
-
- p.TopicFilters.Add("A/B/C");
- p.TopicFilters.Add("1/2/3");
- p.TopicFilters.Add("x/y/z");
-
- DeserializeAndCompare(p, "ohcAewAFQS9CL0MABTEvMi8zAAV4L3kveg==");
- }
-
- [TestMethod]
- public void SerializeV311_MqttUnsubAckPacket()
- {
- var p = new MqttUnsubAckPacket
- {
- PacketIdentifier = 123
- };
-
- SerializeAndCompare(p, "sAIAew==");
- }
-
- [TestMethod]
- public void DeserializeV311_MqttUnsubAckPacket()
- {
- var p = new MqttUnsubAckPacket
- {
- PacketIdentifier = 123
- };
-
- DeserializeAndCompare(p, "sAIAew==");
- }
-
- private static void SerializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311)
- {
- var serializer = new MqttPacketSerializer { ProtocolVersion = protocolVersion };
- var data = serializer.Serialize(packet);
-
- Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(data)));
- }
-
- private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311)
- {
- var serializer = new MqttPacketSerializer { ProtocolVersion = protocolVersion };
-
- var buffer1 = serializer.Serialize(packet);
-
- using (var headerStream = new MemoryStream(Join(buffer1)))
- {
- var channel = new TestMqttChannel(headerStream);
- var fixedHeader = new byte[2];
- var singleByteBuffer = new byte[1];
- var header = MqttPacketReader.ReadFixedHeaderAsync(channel, fixedHeader, singleByteBuffer, CancellationToken.None).GetAwaiter().GetResult();
-
- using (var bodyStream = new MemoryStream(Join(buffer1), (int)headerStream.Position, header.RemainingLength))
- {
- var deserializedPacket = serializer.Deserialize(new ReceivedMqttPacket(header.Flags, new MqttPacketBodyReader(bodyStream.ToArray(), 0)));
- var buffer2 = serializer.Serialize(deserializedPacket);
-
- Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(buffer2)));
- }
- }
- }
-
- private static T Roundtrip<T>(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 fixedHeader = new byte[2];
- var singleByteBuffer = new byte[1];
-
- var header = MqttPacketReader.ReadFixedHeaderAsync(channel, fixedHeader, singleByteBuffer, 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<byte>[] chunks)
- {
- var buffer = new MemoryStream();
- foreach (var chunk in chunks)
- {
- buffer.Write(chunk.Array, chunk.Offset, chunk.Count);
- }
-
- return buffer.ToArray();
- }
- }
- }
|