public async Task ExecuteAsync_WithDefaultApplication_BehavesAsExpected()
        {
            using var mqttConsumerService = CreateMqttConsumerService(s =>
            {
                s.Host = "mqtt.local";
                s.Port = 1884;
            });

            var testApplication = MqttApplicationHelper.CreateHandlesAllRequests();

            Assert.Collection(
                testApplication.TopicFilters,
                i => Assert.Equal("#", i.Topic));

            MockMqttApplicationProvider
            .SetupGet(x => x.Current)
            .Returns(testApplication);

            MockManagedMqttClient
            .Setup(c => c.StartAsync(MockManagedMqttClientOptions.Object))
            .Returns(Task.CompletedTask)
            .Verifiable();

            MockManagedMqttClient
            .Setup(c => c.SubscribeAsync(testApplication.TopicFilters))
            .Returns(Task.CompletedTask)
            .Verifiable();

            await mqttConsumerService.StartAsync(CancellationToken.None);

            Assert.Collection(
                Logger.LogEntries,
                l => { Assert.Equal("Connecting to MQTT broker at mqtt.local:1884...", l.Message); });

            MockManagedMqttClient.VerifyAll();

            MockManagedMqttClient
            .Setup(c => c.StopAsync())
            .Returns(Task.CompletedTask)
            .Verifiable();

            await mqttConsumerService.StopAsync(CancellationToken.None);

            MockMqttApplicationProvider.VerifyAll();
            MockManagedMqttClient.VerifyAll();

            Assert.Collection(
                Logger.LogEntries,
                l => { Assert.Equal("Connecting to MQTT broker at mqtt.local:1884...", l.Message); },
                l => { Assert.Equal("Shutting down MQTT broker connection...", l.Message); });
        }
        public async Task ExecuteAsync_WithOnlineMessageAndDefaultApplication_BehavesAsExpected()
        {
            using var mqttConsumerService = CreateMqttConsumerService(s =>
            {
                s.Host          = "mqtt.local";
                s.Port          = 1884;
                s.OnlineMessage = new MqttMessageSettings
                {
                    Topic   = "test/availability",
                    Payload = "online",
                    QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce,
                    Retain = true
                };
            });

            var testApplication = MqttApplicationHelper.CreateHandlesAllRequests();

            Assert.Collection(
                testApplication.TopicFilters,
                i => Assert.Equal("#", i.Topic));

            MockMqttApplicationProvider
            .SetupGet(x => x.Current)
            .Returns(testApplication);

            MockManagedMqttClient
            .Setup(c => c.StartAsync(MockManagedMqttClientOptions.Object))
            .Returns(Task.CompletedTask)
            .Verifiable();

            MockManagedMqttClient
            .Setup(c => c.SubscribeAsync(testApplication.TopicFilters))
            .Returns(Task.CompletedTask)
            .Verifiable();

            MockManagedMqttClient
            .Setup(
                c => c.PublishAsync(
                    It.Is <MqttApplicationMessage>(
                        m =>
                        m.Topic.Equals("test/availability") &&
                        m.Payload.SequenceEqual(Encoding.UTF8.GetBytes("online")) &&
                        m.QualityOfServiceLevel == MqttQualityOfServiceLevel.ExactlyOnce &&
                        m.Retain),
                    It.Is <CancellationToken>(ct => !ct.IsCancellationRequested)
                    ))
            .ReturnsAsync(new MqttClientPublishResult())
            .Verifiable();

            await mqttConsumerService.StartAsync(CancellationToken.None);

            Assert.Collection(
                Logger.LogEntries,
                l => { Assert.Equal("Connecting to MQTT broker at mqtt.local:1884...", l.Message); },
                l => { Assert.Equal("Sending online message to test/availability", l.Message); });

            MockManagedMqttClient.VerifyAll();

            MockManagedMqttClient
            .Setup(c => c.StopAsync())
            .Returns(Task.CompletedTask)
            .Verifiable();

            await mqttConsumerService.StopAsync(CancellationToken.None);

            MockMqttApplicationProvider.VerifyAll();
            MockManagedMqttClient.VerifyAll();

            Assert.Collection(
                Logger.LogEntries,
                l => { Assert.Equal("Connecting to MQTT broker at mqtt.local:1884...", l.Message); },
                l => { Assert.Equal("Sending online message to test/availability", l.Message); },
                l => { Assert.Equal("Shutting down MQTT broker connection...", l.Message); });
        }