public void ReleasedMessageAtQos2RemovesMessageFromStorage() { Func <MqttMessage, bool> pubCallback = null; Func <MqttMessage, bool> pubRelCallback = null; short msgId = 1; var mock = new Mock <IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny <Func <MqttMessage, bool> >())) .Callback((MqttMessageType mt, Func <MqttMessage, bool> cb) => pubCallback = cb); mock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishRelease, It.IsAny <Func <MqttMessage, bool> >())) .Callback((MqttMessageType mt, Func <MqttMessage, bool> cb) => pubRelCallback = cb); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); // fake a publish from a remote party and verify we sent a received back. pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.ExactlyOnce) .PublishData(new byte[] { 0, 1, 2 })); var rcvdMsgs = GetReceivedMessages(pm); Assert.True(rcvdMsgs.ContainsKey(msgId)); // fake the publish release message from remote party and verify that a publishcomplete is sent. pubRelCallback(new MqttPublishReleaseMessage().WithMessageIdentifier(msgId)); Assert.False(rcvdMsgs.ContainsKey(msgId)); }
/// <summary> /// Gets the received messages inside a publishing manager. /// </summary> /// <param name="pubMgr"></param> /// <returns></returns> private Dictionary <int, MqttPublishMessage> GetReceivedMessages(Nmqtt.PublishingManager pubMgr) { // we need to crack open the publishing manager and access some privates FieldInfo fi = typeof(Nmqtt.PublishingManager).GetField("receivedMessages", ReflectionBindingConstants.NonPublicField); return((Dictionary <int, MqttPublishMessage>)fi.GetValue(pubMgr)); }
/// <summary> /// Performs a synchronous connect to the message broker with an optional username and password /// for the purposes of authentication. /// </summary> /// <param name="username">Optionally the username to authenticate as.</param> /// <param name="password">Optionally the password to authenticate with.</param> public ConnectionState Connect(string username = null, string password = null) { Log.Debug(m => m("Initiating connection to broker '{0}', port '{1}' using Client Identifier '{2}'", server, port, clientIdentifier)); if (username != null) { Log.Info(m => m("Authenticating with username '{0}' and password '{0}'", username, password)); if (username.Trim().Length > Constants.RecommendedMaxUsernamePasswordLength) { Log.Warn(m => m("Username length ({0}) exceeds the max recommended in the MQTT spec. ", username.Trim().Length)); } if (password != null && password.Trim().Length > Constants.RecommendedMaxUsernamePasswordLength) { Log.Warn(m => m("Password length ({0}) exceeds the max recommended in the MQTT spec. ", password.Trim().Length)); } } var connectMessage = GetConnectMessage(username, password); connectionHandler = new SynchronousMqttConnectionHandler(); // TODO: Get Get timeout from config or ctor or elsewhere. keepAlive = new MqttConnectionKeepAlive(connectionHandler, 30); publishingManager = new PublishingManager(connectionHandler); subscriptionsManager = new SubscriptionsManager(connectionHandler, publishingManager); messageLogger = new MessageLogger(connectionHandler); return(connectionHandler.Connect(this.server, this.port, connectMessage)); }
public void CtorRegistersForPublisCompletehMessages() { var chMock = new Mock<IMqttConnectionHandler>(); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishComplete, It.IsAny<Func<MqttMessage, bool>>())); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage pubMsg) => { return true; }); chMock.VerifyAll(); }
public void CtorRegistersForPublishReleaseMessages() { var chMock = new Mock <IMqttConnectionHandler>(); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishRelease, It.IsAny <Func <MqttMessage, bool> >())); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage pubMsg) => { return(true); }); chMock.VerifyAll(); }
public void PublishQos1Or2SavesMessageInStorage() { var chMock = new Mock <IMqttConnectionHandler>(); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage pubMsg) => { return(true); }); int msgId = pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.AtLeastOnce, "test"); var msgs = GetPublishedMessages(pm); Assert.True(msgs.ContainsKey(msgId)); }
public void PublishSendsPublishMessageThroughConnectionHandler() { var chMock = new Mock <IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny <MqttPublishMessage>())); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage pubMsg) => { return(true); }); pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); }
/// <summary> /// Performs a synchronous connect to the message broker. /// </summary> public ConnectionState Connect() { MqttConnectMessage connectMessage = GetConnectMessage(); connectionHandler = new SynchronousMqttConnectionHandler(); // TODO: Get Get timeout from config or ctor or elsewhere. keepAlive = new MqttConnectionKeepAlive(connectionHandler, 30); subscriptionsManager = new SubscriptionsManager(connectionHandler); messageLogger = new MessageLogger(connectionHandler); publishingManager = new PublishingManager(connectionHandler, HandlePublishMessage); return(connectionHandler.Connect(this.server, this.port, connectMessage)); }
public void ConsequtivePublishOnSameTopicGetsNextMessageId() { var chMock = new Mock<IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny<MqttPublishMessage>())); // publish and save the first id var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); int firstMsgId = pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); int secondMsgId = pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); Assert.Equal<int>(firstMsgId + 1, secondMsgId); }
public void ConsequtivePublishOnSameTopicGetsNextMessageId() { var chMock = new Mock <IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny <MqttPublishMessage>())); // publish and save the first id var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); int firstMsgId = pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); int secondMsgId = pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); Assert.Equal <int>(firstMsgId + 1, secondMsgId); }
public void PublishReturnIdMatchesPublishedMessageId() { MqttPublishMessage pubMsg = null; var chMock = new Mock <IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny <MqttPublishMessage>())) .Callback((MqttMessage msg) => pubMsg = (MqttPublishMessage)msg); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); int retId = pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); // check the message message ids match Assert.Equal <int>(pubMsg.VariableHeader.MessageIdentifier, retId); }
public void PublishSendsPublishMessageWithCorrectTopic() { MqttPublishMessage pubMsg = null; var chMock = new Mock <IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny <MqttPublishMessage>())) .Callback((MqttMessage msg) => pubMsg = (MqttPublishMessage)msg); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); // check the message topic was correct Assert.Equal <string>("A/Topic", pubMsg.VariableHeader.TopicName); }
public void AcknowledgedQos1MessageRemovedFromStorage() { Func<MqttMessage, bool> ackCallback = null; var chMock = new Mock<IMqttConnectionHandler>(); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishAck, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType msgtype, Func<MqttMessage, bool> cb) => { ackCallback = cb; }); // send the message, verify we've stored it ok. var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage pubMsg) => { return true; }); var msgId = pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.AtLeastOnce, "test"); var msgs = GetPublishedMessages(pm); Assert.True(msgs.ContainsKey(msgId)); // now fake an acknowledgement of the message, and ensure it's been removed from storage. ackCallback(new MqttPublishAckMessage().WithMessageIdentifier(msgId)); Assert.False(msgs.ContainsKey(msgId)); }
public void PublishSendsPublishMessageCorrectPayload() { MqttPublishMessage pubMsg = null; var chMock = new Mock <IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny <MqttPublishMessage>())) .Callback((MqttMessage msg) => pubMsg = (MqttPublishMessage)msg); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); // check the message payload was correct Assert.Equal <string>("test", Encoding.ASCII.GetString(pubMsg.Payload.Message.ToArray <byte>())); }
public void AcknowledgedQos1MessageRemovedFromStorage() { Func <MqttMessage, bool> ackCallback = null; var chMock = new Mock <IMqttConnectionHandler>(); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishAck, It.IsAny <Func <MqttMessage, bool> >())) .Callback((MqttMessageType msgtype, Func <MqttMessage, bool> cb) => { ackCallback = cb; }); // send the message, verify we've stored it ok. var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage pubMsg) => { return(true); }); var msgId = pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.AtLeastOnce, "test"); var msgs = GetPublishedMessages(pm); Assert.True(msgs.ContainsKey(msgId)); // now fake an acknowledgement of the message, and ensure it's been removed from storage. ackCallback(new MqttPublishAckMessage().WithMessageIdentifier(msgId)); Assert.False(msgs.ContainsKey(msgId)); }
public void ReceivedMessageAtQos2SendsPublishReceived() { Func <MqttMessage, bool> pubCallback = null; short msgId = 1; var mock = new Mock <IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny <Func <MqttMessage, bool> >())) .Callback((MqttMessageType mt, Func <MqttMessage, bool> cb) => pubCallback = cb); mock.Setup(x => x.SendMessage(It.IsAny <MqttPublishReceivedMessage>())); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.ExactlyOnce) .PublishData(new byte[] { 0, 1, 2 })); mock.VerifyAll(); }
public void ReceivedMessageAtQos0DoesNotRespondToRemoteParty() { Func <MqttMessage, bool> pubCallback = null; short msgId = 1; var mock = new Mock <IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny <Func <MqttMessage, bool> >())) .Callback((MqttMessageType mt, Func <MqttMessage, bool> cb) => pubCallback = cb); mock.Setup(x => x.SendMessage(It.IsAny <MqttMessage>())); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.AtMostOnce) .PublishData(new byte[] { 0, 1, 2 })); // verify nothing was sent by the pub mgr mock.Verify(x => x.SendMessage(It.IsAny <MqttMessage>()), Times.Never()); }
public void ReceivedMessageAtQos1DoesNotStoreMessage() { Func <MqttMessage, bool> pubCallback = null; short msgId = 1; var mock = new Mock <IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny <Func <MqttMessage, bool> >())) .Callback((MqttMessageType mt, Func <MqttMessage, bool> cb) => pubCallback = cb); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.AtLeastOnce) .PublishData(new byte[] { 0, 1, 2 })); var rcvdMsgs = GetReceivedMessages(pm); Assert.False(rcvdMsgs.ContainsKey(msgId)); }
public void ReleasedQos2MessageRemovedFromStorage() { Func <MqttMessage, bool> rcvdCallback = null; Func <MqttMessage, bool> compCallback = null; var chMock = new Mock <IMqttConnectionHandler>(); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishReceived, It.IsAny <Func <MqttMessage, bool> >())) .Callback((MqttMessageType msgtype, Func <MqttMessage, bool> cb) => { rcvdCallback = cb; }); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishRelease, It.IsAny <Func <MqttMessage, bool> >())); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishComplete, It.IsAny <Func <MqttMessage, bool> >())) .Callback((MqttMessageType msgtype, Func <MqttMessage, bool> cb) => { compCallback = cb; }); chMock.Setup(x => x.SendMessage(It.IsAny <MqttPublishMessage>())); chMock.Setup(x => x.SendMessage(It.IsAny <MqttPublishReleaseMessage>())); // send the message, verify we've stored it ok. var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return(true); }); var msgId = pm.Publish <AsciiPublishDataConverter>("A/Topic", MqttQos.ExactlyOnce, "test"); var msgs = GetPublishedMessages(pm); Assert.True(msgs.ContainsKey(msgId)); // verify the pub msg has send a publish message. chMock.Verify(x => x.SendMessage(It.IsAny <MqttPublishMessage>())); // fake a response from the other party saying Received, this should initiate a Release to the other party rcvdCallback(new MqttPublishReceivedMessage().WithMessageIdentifier(msgId)); Assert.True(msgs.ContainsKey(msgId)); // verify the pub msg has sent a publish release message. chMock.Verify(x => x.SendMessage(It.IsAny <MqttPublishReleaseMessage>())); // fake a response from the other party saying "Complete", this should remove our copy of the message locally. compCallback(new MqttPublishCompleteMessage().WithMessageIdentifier(msgId)); Assert.False(msgs.ContainsKey(msgId)); }
public void PublishSendsPublishMessageCorrectPayload() { MqttPublishMessage pubMsg = null; var chMock = new Mock<IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny<MqttPublishMessage>())) .Callback((MqttMessage msg) => pubMsg = (MqttPublishMessage)msg); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); // check the message payload was correct Assert.Equal<string>("test", Encoding.ASCII.GetString(pubMsg.Payload.Message.ToArray<byte>())); }
public void PublishSendsPublishMessageThroughConnectionHandler() { var chMock = new Mock<IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny<MqttPublishMessage>())); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage pubMsg) => { return true; }); pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); }
public void PublishSendsPublishMessageWithCorrectTopic() { MqttPublishMessage pubMsg = null; var chMock = new Mock<IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny<MqttPublishMessage>())) .Callback((MqttMessage msg) => pubMsg = (MqttPublishMessage)msg); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); // check the message topic was correct Assert.Equal<string>("A/Topic", pubMsg.VariableHeader.TopicName); }
public void PublishReturnIdMatchesPublishedMessageId() { MqttPublishMessage pubMsg = null; var chMock = new Mock<IMqttConnectionHandler>(); chMock.Setup(x => x.SendMessage(It.IsAny<MqttPublishMessage>())) .Callback((MqttMessage msg) => pubMsg = (MqttPublishMessage)msg); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); int retId = pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.AtMostOnce, "test"); chMock.VerifyAll(); // check the message message ids match Assert.Equal<int>(pubMsg.VariableHeader.MessageIdentifier, retId); }
public void ReceivedPublishMessageAtQos2StoresMessage() { Func<MqttMessage, bool> pubCallback = null; Func<MqttMessage, bool> pubRelCallback = null; short msgId = 1; var mock = new Mock<IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType mt, Func<MqttMessage, bool> cb) => pubCallback = cb); mock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishRelease, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType mt, Func<MqttMessage, bool> cb) => pubRelCallback = cb); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); // fake a publish from a remote party and verify we sent a received back. pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.ExactlyOnce) .PublishData(new byte[] { 0, 1, 2 })); var rcvdMsgs = GetReceivedMessages(pm); Assert.True(rcvdMsgs.ContainsKey(msgId)); }
public void PublishQos1Or2SavesMessageInStorage() { var chMock = new Mock<IMqttConnectionHandler>(); var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage pubMsg) => { return true; }); int msgId = pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.AtLeastOnce, "test"); var msgs = GetPublishedMessages(pm); Assert.True(msgs.ContainsKey(msgId)); }
public void ReceivedMessageAtQos1DoesNotStoreMessage() { Func<MqttMessage, bool> pubCallback = null; short msgId = 1; var mock = new Mock<IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType mt, Func<MqttMessage, bool> cb) => pubCallback = cb); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.AtLeastOnce) .PublishData(new byte[] { 0, 1, 2 })); var rcvdMsgs = GetReceivedMessages(pm); Assert.False(rcvdMsgs.ContainsKey(msgId)); }
public void ReleasedMessageAtQos2SendsPublishComplete() { Func<MqttMessage, bool> pubCallback = null; Func<MqttMessage, bool> pubRelCallback = null; short msgId = 1; var mock = new Mock<IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType mt, Func<MqttMessage, bool> cb) => pubCallback = cb); mock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishReceived, It.IsAny<Func<MqttMessage, bool>>())); mock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishRelease, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType mt, Func<MqttMessage, bool> cb) => pubRelCallback = cb); mock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishComplete, It.IsAny<Func<MqttMessage, bool>>())); mock.Setup(x => x.SendMessage(It.IsAny<MqttPublishReceivedMessage>())); mock.Setup(x => x.SendMessage(It.IsAny<MqttPublishCompleteMessage>())); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); // fake a publish from a remote party and verify we sent a received back. pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.ExactlyOnce) .PublishData(new byte[] { 0, 1, 2 })); mock.Verify(x => x.SendMessage(It.IsAny<MqttPublishReceivedMessage>())); // fake the publish release message from remote party and verify that a publishcomplete is sent. pubRelCallback(new MqttPublishReleaseMessage().WithMessageIdentifier(msgId)); mock.Verify(x => x.SendMessage(It.IsAny<MqttPublishCompleteMessage>())); }
public void ReleasedQos2MessageRemovedFromStorage() { Func<MqttMessage, bool> rcvdCallback = null; Func<MqttMessage, bool> compCallback = null; var chMock = new Mock<IMqttConnectionHandler>(); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishReceived, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType msgtype, Func<MqttMessage, bool> cb) => { rcvdCallback = cb; }); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishRelease, It.IsAny<Func<MqttMessage, bool>>())); chMock.Setup(x => x.RegisterForMessage(MqttMessageType.PublishComplete, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType msgtype, Func<MqttMessage, bool> cb) => { compCallback = cb; }); chMock.Setup(x => x.SendMessage(It.IsAny<MqttPublishMessage>())); chMock.Setup(x => x.SendMessage(It.IsAny<MqttPublishReleaseMessage>())); // send the message, verify we've stored it ok. var pm = new Nmqtt.PublishingManager(chMock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); var msgId = pm.Publish<AsciiPublishDataConverter>("A/Topic", MqttQos.ExactlyOnce, "test"); var msgs = GetPublishedMessages(pm); Assert.True(msgs.ContainsKey(msgId)); // verify the pub msg has send a publish message. chMock.Verify(x => x.SendMessage(It.IsAny<MqttPublishMessage>())); // fake a response from the other party saying Received, this should initiate a Release to the other party rcvdCallback(new MqttPublishReceivedMessage().WithMessageIdentifier(msgId)); Assert.True(msgs.ContainsKey(msgId)); // verify the pub msg has sent a publish release message. chMock.Verify(x => x.SendMessage(It.IsAny<MqttPublishReleaseMessage>())); // fake a response from the other party saying "Complete", this should remove our copy of the message locally. compCallback(new MqttPublishCompleteMessage().WithMessageIdentifier(msgId)); Assert.False(msgs.ContainsKey(msgId)); }
public void ReceivedMessageAtQos0DoesNotRespondToRemoteParty() { Func<MqttMessage, bool> pubCallback = null; short msgId = 1; var mock = new Mock<IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType mt, Func<MqttMessage, bool> cb) => pubCallback = cb); mock.Setup(x => x.SendMessage(It.IsAny<MqttMessage>())); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.AtMostOnce) .PublishData(new byte[] { 0, 1, 2 })); // verify nothing was sent by the pub mgr mock.Verify(x => x.SendMessage(It.IsAny<MqttMessage>()), Times.Never()); }
public void ReceivedMessageAtQos2SendsPublishReceived() { Func<MqttMessage, bool> pubCallback = null; short msgId = 1; var mock = new Mock<IMqttConnectionHandler>(); mock.Setup(x => x.RegisterForMessage(MqttMessageType.Publish, It.IsAny<Func<MqttMessage, bool>>())) .Callback((MqttMessageType mt, Func<MqttMessage, bool> cb) => pubCallback = cb); mock.Setup(x => x.SendMessage(It.IsAny<MqttPublishReceivedMessage>())); var pm = new Nmqtt.PublishingManager(mock.Object, (MqttPublishMessage dummyPubMsg) => { return true; }); pubCallback(new MqttPublishMessage() .WithMessageIdentifier(msgId) .ToTopic("A/Topic") .WithQos(MqttQos.ExactlyOnce) .PublishData(new byte[] { 0, 1, 2 })); mock.VerifyAll(); }