public async Task get_latest_get_single_information_for_specified_liveness()
        {
            var notifier = new MemoryNotifier();

            var tokenSource = new CancellationTokenSource();

            var livenessConfiguration = new LivenessConfigurationBuilder()
                                        .With("http://someserver-3/health", "Liveness")
                                        .Build();

            var context = new LivenessContextBuilder()
                          .WithLiveness(livenessConfiguration)
                          .WithRandomDatabaseName()
                          .Build();

            var runnerBuilder = new LivenessRunnerBuilder()
                                .WithHttpStatusCode(HttpStatusCode.OK)
                                .WithHealthyMessageContent()
                                .WithLivenessDb(context)
                                .WithNotifier(notifier);

            var runner = runnerBuilder.Build();

            await runner.Run(tokenSource.Token);

            await runner.Run(tokenSource.Token);

            var execution = context.LivenessExecutions
                            .ToList();

            execution.Count().Should().Be(1);

            execution.Where(h => h.LivenessName == "Liveness")
            .Single()?.IsHealthy.Should().BeTrue();
        }
        public async Task save_execution_if_is_new()
        {
            var notifier = new MemoryNotifier();

            var tokenSource = new CancellationTokenSource();

            var livenessConfiguration = new LivenessConfigurationBuilder()
                                        .With("http://someserver-2/health", "Liveness")
                                        .Build();

            var context = new LivenessContextBuilder()
                          .WithLiveness(livenessConfiguration)
                          .WithRandomDatabaseName()
                          .Build();

            var runnerBuilder = new LivenessRunnerBuilder()
                                .WithHttpStatusCode(HttpStatusCode.ServiceUnavailable)
                                .WithDegradedMessageContent()
                                .WithLivenessDb(context)
                                .WithNotifier(notifier);

            var runner = runnerBuilder.Build();

            await runner.Run(tokenSource.Token);

            var execution = context.LivenessExecutions
                            .ToList();

            execution.Count().Should().Be(1);

            execution.Where(h => h.LivenessName == "Liveness")
            .Single()?.IsHealthy.Should().BeFalse();
        }
        public async Task notify_failures_if_liveness_is_down()
        {
            var notifier = new MemoryNotifier();

            var tokenSource = new CancellationTokenSource();

            var livenessConfiguration = new LivenessConfigurationBuilder()
                                        .With("http://someserver-1/health", "Failing Liveness")
                                        .Build();

            var context = new LivenessContextBuilder()
                          .WithLiveness(livenessConfiguration)
                          .WithRandomDatabaseName()
                          .Build();

            var runnerBuilder = new LivenessRunnerBuilder()
                                .WithHttpStatusCode(HttpStatusCode.ServiceUnavailable)
                                .WithDegradedMessageContent()
                                .WithLivenessDb(context)
                                .WithMinimumElapsedSecondsOnNotifications(0)
                                .WithNotifier(notifier);

            var runner = runnerBuilder.Build();

            await runner.Run(tokenSource.Token);

            notifier.ContainsFailureNotificationFor(livenessConfiguration.LivenessName)
            .Should().BeTrue();
        }
        public async Task get_all_livenes_configuration()
        {
            var notifier     = new MemoryNotifier();
            var livenessName = "livenessName";
            var tokenSource  = new CancellationTokenSource();


            var livenessConfiguration = new LivenessConfigurationBuilder()
                                        .With("http://someserver-6/health", livenessName)
                                        .Build();

            var context = new LivenessContextBuilder()
                          .WithLiveness(livenessConfiguration)
                          .WithRandomDatabaseName()
                          .Build();

            var runnerBuilder = new LivenessRunnerBuilder()
                                .WithHttpStatusCode(HttpStatusCode.OK)
                                .WithHealthyMessageContent()
                                .WithLivenessDb(context)
                                .WithNotifier(notifier);

            var runner = runnerBuilder.Build();

            await runner.Run(tokenSource.Token);

            var liveness = await runner.GetConfiguredLiveness(CancellationToken.None);

            liveness.Count.Should().Be(1);

            liveness.Single()
            .LivenessName.Should().Be(livenessName);
        }
        public async Task save_execution_history_update_onStateFrom_if_execution_exist_and_the_status_is_not_the_same()
        {
            var notifier = new MemoryNotifier();

            var tokenSource = new CancellationTokenSource();

            var livenessConfiguration = new LivenessConfigurationBuilder()
                                        .With("http://someserver-5/health", "Liveness")
                                        .Build();

            var context = new LivenessContextBuilder()
                          .WithLiveness(livenessConfiguration)
                          .WithRandomDatabaseName()
                          .Build();

            var runnerBuilderOk = new LivenessRunnerBuilder()
                                  .WithHttpStatusCode(HttpStatusCode.OK)
                                  .WithHealthyMessageContent()
                                  .WithLivenessDb(context)
                                  .WithNotifier(notifier);

            var runnerBuilderUnavailable = new LivenessRunnerBuilder()
                                           .WithHttpStatusCode(HttpStatusCode.ServiceUnavailable)
                                           .WithDegradedMessageContent()
                                           .WithLivenessDb(context)
                                           .WithNotifier(notifier);

            var runnerOk = runnerBuilderOk.Build();

            await runnerOk.Run(tokenSource.Token);

            var execution1 = context.LivenessExecutions
                             .Single();

            var status1     = execution1.Status;
            var onStateFrom = execution1.OnStateFrom;

            var runnerServiceUnavailable = runnerBuilderUnavailable.Build();

            await runnerServiceUnavailable.Run(tokenSource.Token);

            var execution2 = context.LivenessExecutions
                             .Single();

            status1.Should().NotBe(execution2.Status);
            onStateFrom.Should().NotBe(execution2.OnStateFrom);
        }
        public async Task save_execution_history_update_lastExecuted_if_execution_exist_and_the_status_is_the_same()
        {
            var notifier = new MemoryNotifier();

            var tokenSource = new CancellationTokenSource();

            var livenessConfiguration = new LivenessConfigurationBuilder()
                                        .With("http://someserver-4/health", "Liveness")
                                        .Build();

            var context = new LivenessContextBuilder()
                          .WithLiveness(livenessConfiguration)
                          .WithRandomDatabaseName()
                          .Build();

            var runnerBuilder = new LivenessRunnerBuilder()
                                .WithHttpStatusCode(HttpStatusCode.OK)
                                .WithHealthyMessageContent()
                                .WithLivenessDb(context)
                                .WithNotifier(notifier);

            var runner = runnerBuilder.Build();

            await runner.Run(tokenSource.Token);

            var execution1 = context.LivenessExecutions
                             .Single();

            await runner.Run(tokenSource.Token);

            var execution2 = context.LivenessExecutions
                             .Single();

            execution1.Id.Should().Be(execution2.Id);
            execution1.LivenessName.Should().Be(execution2.LivenessName);
            execution1.LivenessUri.Should().Be(execution2.LivenessUri);
            execution1.OnStateFrom.Should().Be(execution2.OnStateFrom);
            execution1.Status.Should().Be(execution2.Status);
        }