public async Task CheckHealthAsync_HeaderValueIsEmpty_ReturnsHealthy() { string contentText = nameof(CheckHealthAsync_WhenExpectedStatus_ReturnsHealthy); HttpStatusCode status = HttpStatusCode.Found; KeyValuePair <string, object>[] reportData = Array.Empty <KeyValuePair <string, object> >(); HttpResponseMessage response = new HttpResponseMessage(status) { Content = new StringContent(contentText) }; HttpHealthCheckParameters parameters = HttpHealthCheckParametersTests.Create( headers: new Dictionary <string, IEnumerable <string> > { { "testheader", new List <string>() } }, expectedStatus: status, reportData: reportData); (MockClient _, HealthCheckResult result) = await RunHealthCheckAsync(parameters, response); Assert.AreEqual(HealthStatus.Healthy, result.Status, FormattableString.Invariant($"Should return {HealthStatus.Healthy} for expected status")); Assert.AreEqual(string.Empty, result.Description, "Content should not be in the description for healthy check"); CollectionAssert.AreEquivalent(reportData, result.Data.ToArray(), "Result should propagate reportData"); }
public async Task CheckHealthAsync_WithAdditionalCheck_ReturnsOverridenResult() { string contentText = nameof(CheckHealthAsync_WithAdditionalCheck_ReturnsOverridenResult); KeyValuePair <string, object>[] reportData = new KeyValuePair <string, object> [0]; HttpResponseMessage expectedResponse = new HttpResponseMessage(HttpStatusCode.Ambiguous) { Content = new StringContent(contentText) }; HttpResponseMessage?actualResponce = null; HealthCheckResult initialResult = default; HealthCheckResult expectedResult = HealthCheckResult.Healthy("Some description", new Dictionary <string, object>()); HttpHealthCheckParameters parameters = HttpHealthCheckParametersTests.Create( expectedStatus: HttpStatusCode.BadRequest, additionalCheck: (response, result) => { actualResponce = response; initialResult = result; return(expectedResult); }, reportData: reportData); (MockClient _, HealthCheckResult result) = await RunHealthCheckAsync(parameters, expectedResponse); Assert.AreEqual(expectedResult, result, "Should return overridden result"); Assert.AreEqual(expectedResponse, actualResponce, "Should provide proper HttpResponse to function"); Assert.AreEqual(HealthStatus.Unhealthy, initialResult.Status, "Provided result should have proper status"); Assert.AreEqual(contentText, initialResult.Description, "Provided result should have proper description"); CollectionAssert.AreEquivalent(reportData, result.Data.ToArray(), "Provided result should have proper data"); }
public async Task CheckHealthAsync_HeaderKeyIsWhiteSpace_ReturnsUnhealthy() { string contentText = nameof(CheckHealthAsync_WhenExpectedStatus_ReturnsHealthy); HttpStatusCode status = HttpStatusCode.Found; KeyValuePair <string, object>[] reportData = Array.Empty <KeyValuePair <string, object> >(); HttpResponseMessage response = new HttpResponseMessage(status) { Content = new StringContent(contentText) }; HttpHealthCheckParameters parameters = HttpHealthCheckParametersTests.Create( headers: new Dictionary <string, IEnumerable <string> > { { string.Empty, new List <string> { "value" } } }, expectedStatus: status, reportData: reportData); (MockClient _, HealthCheckResult result) = await RunHealthCheckAsync(parameters, response); Assert.AreEqual(HealthStatus.Unhealthy, result.Status, FormattableString.Invariant($"Should return {HealthStatus.Unhealthy} for expected status")); }
private async Task <(MockClient, HealthCheckResult)> RunHealthCheckAsync(HttpHealthCheckParameters parameters, HttpResponseMessage response) { Accessor <ServiceContext> accessor = new Accessor <ServiceContext>(); Mock <IHttpClientFactory> factoryMock = new Mock <IHttpClientFactory>(); MockClient clientMock = new MockClient(response); factoryMock.Setup(f => f.CreateClient(HttpEndpointHealthCheck.HttpClientLogicalName)) .Returns(clientMock); HttpEndpointHealthCheck healthCheck = new HttpEndpointHealthCheck( parameters, factoryMock.Object, accessor, new NullLogger <HttpEndpointHealthCheck>(), new SimpleScopeProvider()); HealthCheckContext checkContext = HealthCheckContextHelper.CreateCheckContext(); HealthCheckResult uninitializedResult = await healthCheck.CheckHealthAsync(checkContext); Assert.AreEqual(HealthStatus.Degraded, uninitializedResult.Status, FormattableString.Invariant($"Should return {HealthStatus.Degraded} if accessor not set")); Mock <ICodePackageActivationContext> mock = new Mock <ICodePackageActivationContext>(); mock.Setup(c => c.GetEndpoint(parameters.EndpointName)).Returns(new System.Fabric.Description.EndpointResourceDescription()); ServiceContext context = MockStatelessServiceContextFactory.Create(mock.Object, "", new Uri("http://localhost"), Guid.Empty, 0); (accessor as IAccessorSetter <ServiceContext>).SetValue(context); HealthCheckResult result = await healthCheck.CheckHealthAsync(checkContext); return(clientMock, result); }
public void Constructor_SetsProperties() { string endpoitName = nameof(Constructor_SetsProperties); Uri path = new Uri("path", UriKind.Relative); HttpMethod method = HttpMethod.Post; string scheme = Uri.UriSchemeGopher; HttpStatusCode status = HttpStatusCode.Ambiguous; Func <HttpResponseMessage, HealthCheckResult, HealthCheckResult> additionalCheck = (r, h) => HealthCheckResult.Unhealthy(); KeyValuePair <string, object>[] reportData = new Dictionary <string, object> { { "testKey1", new object() }, { "testKey2", "value" } }.ToArray(); HttpHealthCheckParameters parameters = new HttpHealthCheckParameters( endpoitName, path, method, scheme, status, additionalCheck, reportData); Assert.AreEqual(path, parameters.RelativeUri.ToString(), nameof(HttpHealthCheckParameters.RelativeUri)); Assert.AreEqual(method, parameters.Method, nameof(HttpHealthCheckParameters.Method)); Assert.AreEqual(scheme, parameters.Scheme, nameof(HttpHealthCheckParameters.Scheme)); Assert.AreEqual(status, parameters.ExpectedStatus, nameof(HttpHealthCheckParameters.ExpectedStatus)); Assert.AreEqual(additionalCheck, parameters.AdditionalCheck, nameof(HttpHealthCheckParameters.AdditionalCheck)); CollectionAssert.AreEquivalent(reportData, parameters.ReportData.ToArray(), nameof(HttpHealthCheckParameters.ReportData)); }
public void AddServiceFabricHealthChecks_RegisterPublisherAndChecks() { string checkName = "MockHttpCheck"; string endpoitName = "MockEndpoitName"; string path = "MockPath"; HttpMethod method = HttpMethod.Post; HttpStatusCode code = HttpStatusCode.HttpVersionNotSupported; string scheme = Uri.UriSchemeGopher; Func <HttpResponseMessage, HealthCheckResult, HealthCheckResult> additionalCheck = (r, h) => HealthCheckResult.Degraded(); KeyValuePair <string, object>[] reportData = new Dictionary <string, object> { { "testKey1", new object() }, { "testKey2", "value" } }.ToArray(); IServiceProvider provider = GetBuilder() .AddHttpEndpointCheck(checkName, endpoitName, path, method, scheme, code, additionalCheck, reportData) .Services .BuildServiceProvider(); HttpHealthCheckParameters parameters = GetParameters(provider, checkName); Assert.AreEqual(endpoitName, parameters.EndpointName, nameof(HttpHealthCheckParameters.EndpointName)); Assert.AreEqual(path, parameters.RelativeUri.ToString(), nameof(HttpHealthCheckParameters.RelativeUri)); Assert.AreEqual(method, parameters.Method, nameof(HttpHealthCheckParameters.Method)); Assert.AreEqual(scheme, parameters.Scheme, nameof(HttpHealthCheckParameters.Scheme)); Assert.AreEqual(code, parameters.ExpectedStatus, nameof(HttpHealthCheckParameters.ExpectedStatus)); Assert.AreEqual(additionalCheck, parameters.AdditionalCheck, nameof(HttpHealthCheckParameters.AdditionalCheck)); CollectionAssert.AreEquivalent(reportData, parameters.ReportData.ToArray(), nameof(HttpHealthCheckParameters.ReportData)); }
public void Constructor_SetsDefaultParameters() { HttpHealthCheckParameters parameters = new HttpHealthCheckParameters( nameof(Constructor_SetsDefaultParameters), new Uri("path", UriKind.Relative), null, null, null, null, Array.Empty <KeyValuePair <string, object> >()); Assert.AreEqual(HttpMethod.Get, parameters.Method, nameof(HttpHealthCheckParameters.Method)); Assert.AreEqual(Uri.UriSchemeHttp, parameters.Scheme, nameof(HttpHealthCheckParameters.Scheme)); Assert.AreEqual(HttpStatusCode.OK, parameters.ExpectedStatus, nameof(HttpHealthCheckParameters.ExpectedStatus)); Assert.IsNull(parameters.AdditionalCheck, nameof(HttpHealthCheckParameters.AdditionalCheck)); Assert.IsFalse(parameters.ReportData.Any(), nameof(HttpHealthCheckParameters.ReportData)); }
public async Task CheckHealthAsync_WhenWrongStatusAndExplicitRegistrationFailureStatus_ReturnsRegistrationFailureStatus() { string contentText = nameof(CheckHealthAsync_WhenWrongStatusAndExplicitRegistrationFailureStatus_ReturnsRegistrationFailureStatus); KeyValuePair <string, object>[] reportData = new KeyValuePair <string, object> [0]; HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(contentText) }; HttpHealthCheckParameters parameters = HttpHealthCheckParametersTests.Create( expectedStatus: HttpStatusCode.NotFound, reportData: reportData); (MockClient _, HealthCheckResult result) = await RunHealthCheckAsync(parameters, response, failureStatus : HealthStatus.Degraded); Assert.AreEqual(HealthStatus.Degraded, result.Status, FormattableString.Invariant($"Should return {HealthStatus.Unhealthy} for wrong status")); Assert.AreEqual(contentText, result.Description, "Content should be in the description for unhealthy check"); CollectionAssert.AreEquivalent(reportData, result.Data.ToArray(), "Result should propagate reportData"); }