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); }
internal MqttConnectedClient(IMqttChannel <IPacket> packetChannel, IProtocolFlowProvider flowProvider, IRepositoryProvider repositoryProvider, IPacketIdProvider packetIdProvider, MqttConfiguration configuration) : base(packetChannel, flowProvider, repositoryProvider, packetIdProvider, configuration) { }
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()); }
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; }
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); }