Example #1
0
        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");
        }
Example #2
0
        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");
        }
Example #3
0
        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);
        }
Example #5
0
        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));
        }
Example #6
0
        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));
        }
Example #7
0
        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));
        }
Example #8
0
        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");
        }