示例#1
0
        protected override async Task ProcessPublishAsync(Publish publish, string clientId)
        {
            if (publish.Retain)
            {
                var existingRetainedMessage = retainedRepository.Get(r => r.Topic == publish.Topic);

                if (existingRetainedMessage != null)
                {
                    retainedRepository.Delete(existingRetainedMessage);
                }

                if (publish.Payload.Length > 0)
                {
                    var retainedMessage = new RetainedMessage {
                        Topic            = publish.Topic,
                        QualityOfService = publish.QualityOfService,
                        Payload          = publish.Payload
                    };

                    retainedRepository.Create(retainedMessage);
                }
            }

            await DispatchAsync(publish, clientId)
            .ConfigureAwait(continueOnCapturedContext: false);
        }
示例#2
0
        public async Task when_sending_publish_with_retain_then_retain_message_is_replaced()
        {
            var clientId = Guid.NewGuid().ToString();

            var configuration      = Mock.Of <MqttConfiguration> ();
            var topicEvaluator     = new Mock <IMqttTopicEvaluator> ();
            var connectionProvider = new Mock <IConnectionProvider> ();
            var publishSenderFlow  = new Mock <IPublishSenderFlow> ();
            var retainedRepository = new Mock <IRepository <RetainedMessage> > ();
            var sessionRepository  = new Mock <IRepository <ClientSession> > ();
            var willRepository     = new Mock <IRepository <ConnectionWill> >();

            sessionRepository.Setup(r => r.Get(It.IsAny <Expression <Func <ClientSession, bool> > > ()))
            .Returns(new ClientSession {
                ClientId        = clientId,
                PendingMessages = new List <PendingMessage> {
                    new PendingMessage()
                }
            });

            var packetIdProvider            = Mock.Of <IPacketIdProvider> ();
            var undeliveredMessagesListener = new Subject <MqttUndeliveredMessage> ();

            var topic = "foo/bar";

            var sessions = new List <ClientSession> {
                new ClientSession {
                    ClientId = Guid.NewGuid().ToString(), Clean = false
                }
            };

            var existingRetainedMessage = new RetainedMessage();

            retainedRepository.Setup(r => r.Get(It.IsAny <Expression <Func <RetainedMessage, bool> > >())).Returns(existingRetainedMessage);
            sessionRepository.Setup(r => r.GetAll(It.IsAny <Expression <Func <ClientSession, bool> > > ())).Returns(sessions.AsQueryable());

            var qos     = MqttQualityOfService.AtMostOnce;
            var payload = "Publish Flow Test";
            var publish = new Publish(topic, qos, retain: true, duplicated: false);

            publish.Payload = Encoding.UTF8.GetBytes(payload);

            var receiver = new Subject <IPacket> ();
            var channel  = new Mock <IMqttChannel <IPacket> > ();

            channel.Setup(c => c.ReceiverStream).Returns(receiver);

            var flow = new ServerPublishReceiverFlow(topicEvaluator.Object, connectionProvider.Object, publishSenderFlow.Object,
                                                     retainedRepository.Object, sessionRepository.Object, willRepository.Object, packetIdProvider, undeliveredMessagesListener, configuration);

            await flow.ExecuteAsync(clientId, publish, channel.Object)
            .ConfigureAwait(continueOnCapturedContext: false);

            retainedRepository.Verify(r => r.Delete(It.Is <RetainedMessage> (m => m == existingRetainedMessage)));
            retainedRepository.Verify(r => r.Create(It.Is <RetainedMessage> (m => m.Topic == topic && m.QualityOfService == qos && m.Payload.ToList().SequenceEqual(publish.Payload))));
            channel.Verify(c => c.SendAsync(It.IsAny <IPacket> ()), Times.Never);
        }
示例#3
0
        protected override async Task ProcessPublishAsync(Publish publish, string clientId)
        {
            if (publish.Retain)
            {
                RetainedMessage existingRetainedMessage = retainedRepository.Read(publish.Topic);

                if (existingRetainedMessage != null)
                {
                    retainedRepository.Delete(existingRetainedMessage.Id);
                }

                if (publish.Payload != null && publish.Payload.Length > 0)
                {
                    RetainedMessage retainedMessage = new RetainedMessage(publish.Topic,
                                                                          publish.QualityOfService,
                                                                          publish.Payload);

                    retainedRepository.Create(retainedMessage);
                }
            }

            await DispatchAsync(publish, clientId);
        }