public async Task when_subscribing_new_topics_then_subscriptions_are_created_and_ack_is_sent()
        {
            MqttConfiguration configuration = new MqttConfiguration {
                MaximumQualityOfService = MqttQualityOfService.AtLeastOnce
            };
            Mock <IMqttTopicEvaluator>          topicEvaluator      = new Mock <IMqttTopicEvaluator>();
            Mock <IRepository <ClientSession> > sessionRepository   = new Mock <IRepository <ClientSession> >();
            IPacketIdProvider             packetIdProvider          = Mock.Of <IPacketIdProvider>();
            IRepository <RetainedMessage> retainedMessageRepository = Mock.Of <IRepository <RetainedMessage> >();
            IPublishSenderFlow            senderFlow = Mock.Of <IPublishSenderFlow>();

            string        clientId = Guid.NewGuid().ToString();
            ClientSession session  = new ClientSession(clientId, clean: false);

            topicEvaluator.Setup(e => e.IsValidTopicFilter(It.IsAny <string>())).Returns(true);
            sessionRepository.Setup(r => r.Read(It.IsAny <string>())).Returns(session);

            MqttQualityOfService fooQoS          = MqttQualityOfService.AtLeastOnce;
            string               fooTopic        = "test/foo/1";
            Subscription         fooSubscription = new Subscription(fooTopic, fooQoS);
            MqttQualityOfService barQoS          = MqttQualityOfService.AtMostOnce;
            string               barTopic        = "test/bar/1";
            Subscription         barSubscription = new Subscription(barTopic, barQoS);

            ushort    packetId  = (ushort)new Random().Next(0, ushort.MaxValue);
            Subscribe subscribe = new Subscribe(packetId, fooSubscription, barSubscription);

            Mock <IMqttChannel <IPacket> > channel = new Mock <IMqttChannel <IPacket> >();

            IPacket response = default;

            channel.Setup(c => c.SendAsync(It.IsAny <IPacket>()))
            .Callback <IPacket>(p => response = p)
            .Returns(Task.Delay(0));

            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();

            connectionProvider
            .Setup(p => p.GetConnection(It.Is <string>(c => c == clientId)))
            .Returns(channel.Object);

            ServerSubscribeFlow flow = new ServerSubscribeFlow(topicEvaluator.Object, sessionRepository.Object,
                                                               retainedMessageRepository, packetIdProvider, senderFlow, configuration);

            await flow.ExecuteAsync(clientId, subscribe, channel.Object);

            sessionRepository.Verify(r => r.Update(It.Is <ClientSession>(s => s.Id == clientId && s.Subscriptions.Count == 2 &&
                                                                         s.Subscriptions.All(x => x.TopicFilter == fooTopic || x.TopicFilter == barTopic))));
            Assert.NotNull(response);

            SubscribeAck subscribeAck = response as SubscribeAck;

            Assert.NotNull(subscribeAck);
            packetId.Should().Be(subscribeAck.PacketId);
            2.Should().Be(subscribeAck.ReturnCodes.Count());
            Assert.True(subscribeAck.ReturnCodes.Any(c => c == SubscribeReturnCode.MaximumQoS0));
            Assert.True(subscribeAck.ReturnCodes.Any(c => c == SubscribeReturnCode.MaximumQoS1));
        }
예제 #2
0
 public ServerConnectFlow(IMqttAuthenticationProvider authenticationProvider,
                          IRepository <ClientSession> sessionRepository,
                          IRepository <ConnectionWill> willRepository,
                          IPublishSenderFlow senderFlow)
 {
     this.authenticationProvider = authenticationProvider;
     this.sessionRepository      = sessionRepository;
     this.willRepository         = willRepository;
     this.senderFlow             = senderFlow;
 }
예제 #3
0
 public ServerSubscribeFlow(IMqttTopicEvaluator topicEvaluator,
                            IRepository <ClientSession> sessionRepository,
                            IRepository <RetainedMessage> retainedRepository,
                            IPacketIdProvider packetIdProvider,
                            IPublishSenderFlow senderFlow,
                            MqttConfiguration configuration)
 {
     _topicEvaluator     = topicEvaluator;
     _sessionRepository  = sessionRepository;
     _retainedRepository = retainedRepository;
     _packetIdProvider   = packetIdProvider;
     _senderFlow         = senderFlow;
     _configuration      = configuration;
 }
예제 #4
0
 public ServerPublishReceiverFlow(IMqttTopicEvaluator topicEvaluator,
                                  IConnectionProvider connectionProvider,
                                  IPublishSenderFlow senderFlow,
                                  IRepository <RetainedMessage> retainedRepository,
                                  IRepository <ClientSession> sessionRepository,
                                  IRepository <ConnectionWill> willRepository,
                                  IPacketIdProvider packetIdProvider,
                                  ISubject <MqttUndeliveredMessage> undeliveredMessagesListener,
                                  MqttConfiguration configuration)
     : base(topicEvaluator, retainedRepository, sessionRepository, configuration)
 {
     _connectionProvider          = connectionProvider;
     _senderFlow                  = senderFlow;
     _willRepository              = willRepository;
     _packetIdProvider            = packetIdProvider;
     _undeliveredMessagesListener = undeliveredMessagesListener;
 }
 public ClientConnectFlow(IRepository <ClientSession> sessionRepository,
                          IPublishSenderFlow senderFlow)
 {
     _sessionRepository = sessionRepository;
     _senderFlow        = senderFlow;
 }