DisconnectAsync_CalledFromMultipleSenders_ClientDisconnectedWhenAllSendersDisconnect()
        {
            var sender1          = new object();
            var sender2          = new object();
            var mqttClientConfig = new MqttClientConfig();

            var mqttClient = Substitute.For <IMqttClient>();

            mqttClient.ConnectAsync(Arg.Any <IMqttClientOptions>(), Arg.Any <CancellationToken>())
            .ReturnsForAnyArgs(_ => Task.FromResult(new MqttClientAuthenticateResult()));

            var clientWrapper = new MqttClientWrapper(
                mqttClient,
                mqttClientConfig,
                Substitute.For <IBrokerCallbacksInvoker>(),
                Substitute.For <ISilverbackLogger>());

            await clientWrapper.ConnectAsync(sender1);

            await clientWrapper.ConnectAsync(sender2);

            mqttClient.IsConnected.Returns(true);

            await clientWrapper.DisconnectAsync(sender1);

            await mqttClient.Received(0).DisconnectAsync(
                Arg.Any <MqttClientDisconnectOptions>(),
                Arg.Any <CancellationToken>());

            await clientWrapper.DisconnectAsync(sender2);

            await mqttClient.Received(1).DisconnectAsync(
                Arg.Any <MqttClientDisconnectOptions>(),
                Arg.Any <CancellationToken>());
        }
        public InboundMessagesHandler(MqttClientWrapper mqttClient, ICommandBus commandBus,
                                      ICommandsFactory commandsFactory, IOutboundEventBus outboundEventBus)
        {
            mqttClient.OnMqttMessageReceived += (_, args) =>
            {
                try
                {
                    var decodedMessage = DecodeMqttMessage(args);
                    var command        = commandsFactory.Create(decodedMessage.Name, decodedMessage.Payload);
                    var errors         = command.Validate();
                    if (errors.Length > 0)
                    {
                        outboundEventBus.Send(new CommandResultEvent(command.CorrelationId, StatusCode.ValidationError,
                                                                     command.GetType().Name, errors.SerializeToString()));
                        return;
                    }

                    commandBus.Send(command);
                }
                catch (Exception e)
                {
                    outboundEventBus.Send(new ErrorEvent(
                                              $"Exception during handling inbound message: {e.Message}", ErrorLevel.Warning));
                }
            };
        }
Example #3
0
        public async Task ConnectAsync_CalledFromMultipleSenders_ClientConnectedOnce()
        {
            var sender1          = new object();
            var sender2          = new object();
            var mqttClientConfig = new MqttClientConfig();

            var mqttClient = Substitute.For <IMqttClient>();

            mqttClient.ConnectAsync(Arg.Any <IMqttClientOptions>(), Arg.Any <CancellationToken>())
            .ReturnsForAnyArgs(_ => Task.FromResult(new MqttClientAuthenticateResult()));

            var clientWrapper = new MqttClientWrapper(
                mqttClient,
                mqttClientConfig,
                Substitute.For <IBrokerCallbacksInvoker>(),
                Substitute.For <ISilverbackLogger>());

            var task1 = clientWrapper.ConnectAsync(sender1);
            var task2 = clientWrapper.ConnectAsync(sender2);

            task2.Should().BeSameAs(task1);

            await task1;

            await mqttClient.Received(1).ConnectAsync(
                Arg.Any <IMqttClientOptions>(),
                Arg.Any <CancellationToken>());

            await mqttClient.Received(1).ConnectAsync(
                mqttClientConfig.GetMqttClientOptions(),
                Arg.Any <CancellationToken>());
        }
Example #4
0
 public static void LogConnectionLost(
     this ISilverbackLogger logger,
     MqttClientWrapper client) =>
 ConnectionLost(
     logger.InnerLogger,
     client.ClientConfig.ClientId,
     null);
Example #5
0
 public static void LogConnectRetryError(
     this ISilverbackLogger logger,
     MqttClientWrapper client,
     Exception exception) =>
 ConnectRetryError(
     logger.InnerLogger,
     client.ClientConfig.ClientId,
     exception);
        public async Task DisconnectAsync_CalledWhenNotConnected_ClientDisconnectNotCalled()
        {
            var mqttClient = Substitute.For <IMqttClient>();

            mqttClient.ConnectAsync(Arg.Any <IMqttClientOptions>(), Arg.Any <CancellationToken>())
            .ReturnsForAnyArgs(_ => Task.FromResult(new MqttClientAuthenticateResult()));
            mqttClient.IsConnected.Returns(false);

            var clientWrapper = new MqttClientWrapper(
                mqttClient,
                new MqttClientConfig(),
                Substitute.For <IBrokerCallbacksInvoker>(),
                Substitute.For <ISilverbackLogger>());

            await clientWrapper.DisconnectAsync(new object());

            await mqttClient.Received(0).DisconnectAsync(
                Arg.Any <MqttClientDisconnectOptions>(),
                Arg.Any <CancellationToken>());
        }
 public MqttOutboundEventBus(MqttClientWrapper mqttClient)
 {
     _mqttClient = mqttClient;
 }