public void when_connect_received_then_client_id_is_added()
        {
            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();
            IProtocolFlowProvider      flowProvider       = Mock.Of <IProtocolFlowProvider>();
            IRepositoryProvider        repositoryProvider = Mock.Of <IRepositoryProvider>();
            MqttConfiguration          configuration      = new MqttConfiguration {
                WaitTimeoutSecs = 10
            };
            Subject <IPacket> receiver = new Subject <IPacket>();
            Mock <IMqttChannel <IPacket> > packetChannel = new Mock <IMqttChannel <IPacket> >();

            packetChannel.Setup(c => c.ReceiverStream).Returns(receiver);
            packetChannel.Setup(c => c.SenderStream).Returns(new Subject <IPacket>());

            ServerPacketListener listener = new ServerPacketListener(packetChannel.Object, connectionProvider.Object, flowProvider, configuration);

            listener.Listen();

            string  clientId = Guid.NewGuid().ToString();
            Connect connect  = new Connect(clientId, cleanSession: true, MqttProtocol.SupportedLevel);

            receiver.OnNext(connect);

            connectionProvider.Verify(m => m.AddConnection(It.Is <string>(s => s == clientId), It.Is <IMqttChannel <IPacket> >(c => c == packetChannel.Object)));
        }
        public void when_connect_is_received_then_does_not_time_out()
        {
            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();
            IProtocolFlowProvider      flowProvider       = Mock.Of <IProtocolFlowProvider>();
            IRepositoryProvider        repositoryProvider = Mock.Of <IRepositoryProvider>();
            int waitingTimeout = 1;
            MqttConfiguration configuration = new MqttConfiguration {
                WaitTimeoutSecs = waitingTimeout
            };
            Subject <IPacket> receiver = new Subject <IPacket>();
            Mock <IMqttChannel <IPacket> > packetChannel = new Mock <IMqttChannel <IPacket> >();

            packetChannel.Setup(c => c.ReceiverStream).Returns(receiver);
            packetChannel.Setup(c => c.SenderStream).Returns(new Subject <IPacket>());

            ServerPacketListener listener = new ServerPacketListener(packetChannel.Object, connectionProvider.Object, flowProvider, configuration);

            listener.Listen();

            bool timeoutOccured = false;

            listener.PacketStream.Subscribe(_ => { }, ex =>
            {
                timeoutOccured = true;
            });

            string  clientId = Guid.NewGuid().ToString();
            Connect connect  = new Connect(clientId, cleanSession: true, MqttProtocol.SupportedLevel);

            receiver.OnNext(connect);

            Assert.False(timeoutOccured);
        }
        public void when_first_packet_is_not_connect_then_fails()
        {
            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();
            IProtocolFlowProvider      flowProvider       = Mock.Of <IProtocolFlowProvider>();
            IRepositoryProvider        repositoryProvider = Mock.Of <IRepositoryProvider>();
            MqttConfiguration          configuration      = new MqttConfiguration {
                WaitTimeoutSecs = 10
            };
            Subject <IPacket> receiver = new Subject <IPacket>();
            Mock <IMqttChannel <IPacket> > packetChannel = new Mock <IMqttChannel <IPacket> >();

            packetChannel.Setup(c => c.ReceiverStream).Returns(receiver);
            packetChannel.Setup(c => c.SenderStream).Returns(new Subject <IPacket>());

            ServerPacketListener listener = new ServerPacketListener(packetChannel.Object, connectionProvider.Object, flowProvider, configuration);

            listener.Listen();

            bool errorOccured = false;

            listener.PacketStream.Subscribe(_ => { }, ex =>
            {
                errorOccured = true;
            });

            receiver.OnNext(new PingRequest());

            Assert.True(errorOccured);
        }
        public void when_no_connect_is_received_then_times_out()
        {
            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();
            IProtocolFlowProvider      flowProvider       = Mock.Of <IProtocolFlowProvider>();
            IRepositoryProvider        repositoryProvider = Mock.Of <IRepositoryProvider>();
            int waitingTimeout = 1;
            MqttConfiguration configuration = new MqttConfiguration {
                WaitTimeoutSecs = waitingTimeout
            };
            Subject <IPacket> receiver = new Subject <IPacket>();
            Mock <IMqttChannel <IPacket> > packetChannel = new Mock <IMqttChannel <IPacket> >();

            packetChannel.Setup(c => c.ReceiverStream).Returns(receiver);
            packetChannel.Setup(c => c.SenderStream).Returns(new Subject <IPacket>());

            ServerPacketListener listener = new ServerPacketListener(packetChannel.Object, connectionProvider.Object, flowProvider, configuration);

            listener.Listen();

            ManualResetEventSlim timeoutSignal = new ManualResetEventSlim(initialState: false);

            listener.PacketStream.Subscribe(_ => { }, ex =>
            {
                timeoutSignal.Set();
            });

            bool timeoutOccurred = timeoutSignal.Wait((waitingTimeout + 1) * 1000);

            Assert.True(timeoutOccurred);
        }
Esempio n. 5
0
 internal MqttConnectedClient(IMqttChannel <IPacket> packetChannel,
                              IProtocolFlowProvider flowProvider,
                              IRepositoryProvider repositoryProvider,
                              IPacketIdProvider packetIdProvider,
                              MqttConfiguration configuration)
     : base(packetChannel, flowProvider, repositoryProvider, packetIdProvider, configuration)
 {
 }
Esempio n. 6
0
 public ClientPacketListener(IMqttChannel <IPacket> channel,
                             IProtocolFlowProvider flowProvider,
                             MqttConfiguration configuration)
 {
     this.channel       = channel;
     this.flowProvider  = flowProvider;
     this.configuration = configuration;
     packets            = new ReplaySubject <IPacket> (window: TimeSpan.FromSeconds(configuration.WaitTimeoutSecs));
     flowRunner         = TaskRunner.Get();
 }
        public async Task when_receiver_error_then_closes_connection()
        {
            Subject <IMqttChannel <byte[]> > sockets         = new Subject <IMqttChannel <byte[]> >();
            Mock <IMqttChannelListener>      channelProvider = new Mock <IMqttChannelListener>();

            channelProvider
            .Setup(p => p.GetChannelStream())
            .Returns(sockets);

            MqttConfiguration configuration = Mock.Of <MqttConfiguration>(c => c.WaitTimeoutSecs == 60);

            Subject <IPacket> packets = new Subject <IPacket>();

            Mock <IMqttChannel <IPacket> > packetChannel = new Mock <IMqttChannel <IPacket> >();
            Mock <IPacketChannelFactory>   factory       = new Mock <IPacketChannelFactory>();

            packetChannel
            .Setup(c => c.IsConnected)
            .Returns(true);
            packetChannel
            .Setup(c => c.SenderStream)
            .Returns(new Subject <IPacket>());
            packetChannel
            .Setup(c => c.ReceiverStream)
            .Returns(packets);

            factory.Setup(x => x.Create(It.IsAny <IMqttChannel <byte[]> >()))
            .Returns(packetChannel.Object);

            IProtocolFlowProvider      flowProvider       = Mock.Of <IProtocolFlowProvider>();
            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();

            MqttServerImpl   server              = new MqttServerImpl(channelProvider.Object, factory.Object, flowProvider, connectionProvider.Object, Mock.Of <ISubject <MqttUndeliveredMessage> >(), configuration);
            Subject <byte[]> receiver            = new Subject <byte[]>();
            Mock <IMqttChannel <byte[]> > socket = new Mock <IMqttChannel <byte[]> >();

            socket.Setup(x => x.ReceiverStream).Returns(receiver);

            server.Start();

            sockets.OnNext(socket.Object);

            try
            {
                packets.OnError(new Exception("Protocol exception"));
            }
            catch (Exception)
            {
            }

            await Task.Delay(TimeSpan.FromMilliseconds(1000));

            packetChannel.Verify(x => x.Dispose());
        }
Esempio n. 8
0
 public ServerPacketListener(IMqttChannel <IPacket> channel,
                             IConnectionProvider connectionProvider,
                             IProtocolFlowProvider flowProvider,
                             MqttConfiguration configuration)
 {
     _channel            = channel;
     _connectionProvider = connectionProvider;
     _flowProvider       = flowProvider;
     _configuration      = configuration;
     _packets            = new ReplaySubject <IPacket>(window: TimeSpan.FromSeconds(configuration.WaitTimeoutSecs));
     _flowRunner         = TaskRunner.Get();
 }
 internal MqttClientImpl(IPacketChannelFactory channelFactory,
                         IProtocolFlowProvider flowProvider,
                         IRepositoryProvider repositoryProvider,
                         IPacketIdProvider packetIdProvider,
                         MqttConfiguration configuration)
 {
     receiver              = new Subject <MqttApplicationMessage>();
     this.channelFactory   = channelFactory;
     this.flowProvider     = flowProvider;
     sessionRepository     = repositoryProvider.GetRepository <ClientSession>();
     this.packetIdProvider = packetIdProvider;
     this.configuration    = configuration;
     clientSender          = TaskRunner.Get();
 }
 internal MqttServerImpl(IMqttChannelListener binaryChannelListener,
                         IPacketChannelFactory channelFactory,
                         IProtocolFlowProvider flowProvider,
                         IConnectionProvider connectionProvider,
                         ISubject <MqttUndeliveredMessage> undeliveredMessagesListener,
                         MqttConfiguration configuration)
 {
     _privateStreamListener       = new Subject <PrivateStream>();
     _binaryChannelListeners      = new[] { new PrivateChannelListener(_privateStreamListener, configuration), binaryChannelListener };
     _channelFactory              = channelFactory;
     _flowProvider                = flowProvider;
     _connectionProvider          = new NotifyingConnectionProvider(this, connectionProvider);
     _undeliveredMessagesListener = undeliveredMessagesListener;
     _configuration               = configuration;
 }
Esempio n. 11
0
        internal MqttClientImpl(IMqttChannel <IPacket> packetChannel,
                                IProtocolFlowProvider flowProvider,
                                IRepositoryProvider repositoryProvider,
                                IPacketIdProvider packetIdProvider,
                                MqttConfiguration configuration)
        {
            receiver = new ReplaySubject <MqttApplicationMessage> (window: TimeSpan.FromSeconds(configuration.WaitTimeoutSecs));
            sender   = new ReplaySubject <IPacket> (window: TimeSpan.FromSeconds(configuration.WaitTimeoutSecs));

            this.packetChannel    = packetChannel;
            this.flowProvider     = flowProvider;
            sessionRepository     = repositoryProvider.GetRepository <ClientSession> ();
            this.packetIdProvider = packetIdProvider;
            this.configuration    = configuration;
            clientSender          = TaskRunner.Get();
            packetListener        = new ClientPacketListener(packetChannel, flowProvider, configuration);

            packetListener.Listen();
            ObservePackets();
        }
        public void when_server_closed_then_pending_connection_is_closed()
        {
            Subject <IMqttChannel <byte[]> > sockets         = new Subject <IMqttChannel <byte[]> >();
            Mock <IMqttChannelListener>      channelProvider = new Mock <IMqttChannelListener>();

            channelProvider
            .Setup(p => p.GetChannelStream())
            .Returns(sockets);

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

            packetChannel
            .Setup(c => c.IsConnected)
            .Returns(true);
            packetChannel
            .Setup(c => c.SenderStream)
            .Returns(new Subject <IPacket>());
            packetChannel
            .Setup(c => c.ReceiverStream)
            .Returns(new Subject <IPacket>());

            IProtocolFlowProvider      flowProvider       = Mock.Of <IProtocolFlowProvider>();
            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();

            MqttConfiguration configuration = Mock.Of <MqttConfiguration>(c => c.WaitTimeoutSecs == 60);

            MqttServerImpl server = new MqttServerImpl(channelProvider.Object, Mock.Of <IPacketChannelFactory>(x => x.Create(It.IsAny <IMqttChannel <byte[]> >()) == packetChannel.Object),
                                                       flowProvider, connectionProvider.Object, Mock.Of <ISubject <MqttUndeliveredMessage> >(), configuration);

            server.Start();

            Mock <IMqttChannel <byte[]> > socket = new Mock <IMqttChannel <byte[]> >();

            sockets.OnNext(socket.Object);

            server.Stop();

            packetChannel.Verify(x => x.Dispose());
        }
        public void when_connection_established_then_active_connections_increases()
        {
            Subject <IMqttChannel <byte[]> > sockets         = new Subject <IMqttChannel <byte[]> >();
            Mock <IMqttChannelListener>      channelProvider = new Mock <IMqttChannelListener>();

            channelProvider
            .Setup(p => p.GetChannelStream())
            .Returns(sockets);

            MqttConfiguration configuration = Mock.Of <MqttConfiguration>(c => c.WaitTimeoutSecs == 60);

            Subject <IPacket> packets = new Subject <IPacket>();
            Mock <IMqttChannel <IPacket> > packetChannel = new Mock <IMqttChannel <IPacket> >();
            IPacketChannelFactory          factory       = Mock.Of <IPacketChannelFactory>(x => x.Create(It.IsAny <IMqttChannel <byte[]> >()) == packetChannel.Object);

            packetChannel
            .Setup(c => c.IsConnected)
            .Returns(true);
            packetChannel
            .Setup(c => c.SenderStream)
            .Returns(new Subject <IPacket>());
            packetChannel
            .Setup(c => c.ReceiverStream)
            .Returns(packets);

            IProtocolFlowProvider      flowProvider       = Mock.Of <IProtocolFlowProvider>();
            Mock <IConnectionProvider> connectionProvider = new Mock <IConnectionProvider>();

            MqttServerImpl server = new MqttServerImpl(channelProvider.Object, factory, flowProvider, connectionProvider.Object, Mock.Of <ISubject <MqttUndeliveredMessage> >(), configuration);

            server.Start();

            sockets.OnNext(Mock.Of <IMqttChannel <byte[]> >(x => x.ReceiverStream == new Subject <byte[]>()));
            sockets.OnNext(Mock.Of <IMqttChannel <byte[]> >(x => x.ReceiverStream == new Subject <byte[]>()));
            sockets.OnNext(Mock.Of <IMqttChannel <byte[]> >(x => x.ReceiverStream == new Subject <byte[]>()));

            3.Should().Be(server.ActiveConnections);
        }