Пример #1
0
        public async Task CheckHealthAsync_Cancellation_CanPropagate()
        {
            // Arrange
            var insideCheck = new TaskCompletionSource <object>();

            var service = CreateHealthChecksService(b =>
            {
                b.AddAsyncCheck("cancels", async ct =>
                {
                    insideCheck.SetResult(null);

                    await Task.Delay(10000, ct);
                    return(HealthCheckResult.Failed());
                });
            });

            var cancel = new CancellationTokenSource();
            var task   = service.CheckHealthAsync(cancel.Token);

            // After this returns we know the check has started
            await insideCheck.Task;

            cancel.Cancel();

            // Act & Assert
            await Assert.ThrowsAsync <TaskCanceledException>(async() => await task);
        }
Пример #2
0
        public async Task CheckAsync_RunsAllChecksAndAggregatesResultsAsync()
        {
            const string DataKey          = "Foo";
            const string DataValue        = "Bar";
            const string DegradedMessage  = "I'm not feeling so good";
            const string UnhealthyMessage = "Halp!";
            const string HealthyMessage   = "Everything is A-OK";
            var          exception        = new Exception("Things are pretty bad!");

            // Arrange
            var data = new Dictionary <string, object>()
            {
                { DataKey, DataValue }
            };

            var service = CreateHealthChecksService(b =>
            {
                b.AddAsyncCheck("HealthyCheck", _ => Task.FromResult(HealthCheckResult.Passed(HealthyMessage, data)));
                b.AddAsyncCheck("DegradedCheck", _ => Task.FromResult(HealthCheckResult.Failed(DegradedMessage)), failureStatus: HealthStatus.Degraded);
                b.AddAsyncCheck("UnhealthyCheck", _ => Task.FromResult(HealthCheckResult.Failed(UnhealthyMessage, exception)));
            });

            // Act
            var results = await service.CheckHealthAsync();

            // Assert
            Assert.Collection(results.Entries,
                              actual =>
            {
                Assert.Equal("HealthyCheck", actual.Key);
                Assert.Equal(HealthyMessage, actual.Value.Description);
                Assert.Equal(HealthStatus.Healthy, actual.Value.Status);
                Assert.Null(actual.Value.Exception);
                Assert.Collection(actual.Value.Data, item =>
                {
                    Assert.Equal(DataKey, item.Key);
                    Assert.Equal(DataValue, item.Value);
                });
            },
                              actual =>
            {
                Assert.Equal("DegradedCheck", actual.Key);
                Assert.Equal(DegradedMessage, actual.Value.Description);
                Assert.Equal(HealthStatus.Degraded, actual.Value.Status);
                Assert.Null(actual.Value.Exception);
                Assert.Empty(actual.Value.Data);
            },
                              actual =>
            {
                Assert.Equal("UnhealthyCheck", actual.Key);
                Assert.Equal(UnhealthyMessage, actual.Value.Description);
                Assert.Equal(HealthStatus.Unhealthy, actual.Value.Status);
                Assert.Same(exception, actual.Value.Exception);
                Assert.Empty(actual.Value.Data);
            });
        }
Пример #3
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var options   = _options.Get(context.Registration.Name);
            var testQuery = options.CustomTestQuery ?? DefaultTestQuery;

            if (await testQuery(_dbContext, cancellationToken))
            {
                return(HealthCheckResult.Passed());
            }

            return(HealthCheckResult.Failed());
        }