Example #1
0
        public async Task Invoke_AuthZPolicyFailed_DelegateToNextMiddleware()
        {
            var             contextMock = GetMockContext("/canary");
            RequestDelegate next        = _ =>
            {
                _.Response.StatusCode = 404;
                return(Task.FromResult <object>(null));
            };

            var options = new Mock <IOptions <CanaryOptions> >();

            options.SetupGet(o => o.Value)
            .Returns(new CanaryOptions()
            {
                Path = "/canary",
                AuthorizationPolicy = new AuthorizationPolicyBuilder().RequireClaim("invalid").Build()
            });

            var loggerFactory = new LoggerFactory();
            var healthService = new Mock <IHealthCheckService>();

            healthService.Setup(s => s.CheckHealthAsync(It.IsAny <HealthCheckPolicy>()))
            .ReturnsAsync(new HealthCheckResponse(new HealthCheckResult[] { new HealthCheckResult {
                                                                                Status = HealthStatus.Healthy
                                                                            } }));

            var defaultPolicy  = new HealthCheckPolicy(new HealthCheckSettingsCollection());
            var policyProvider = new DefaultHealthCheckPolicyProvider(defaultPolicy);

            var serverSwitch = new Mock <IServerSwitch>();

            serverSwitch.Setup(s => s.CheckServerStateAsync(It.IsAny <ServerSwitchContext>()))
            .Returns(Task.FromResult(0));

            var authZService = new Mock <IAuthorizationService>();

            authZService
            .Setup(s => s.AuthorizeAsync(It.IsAny <ClaimsPrincipal>(), It.IsAny <object>(), It.IsAny <IEnumerable <IAuthorizationRequirement> >()))
            .ReturnsAsync(false);

            var canaryMiddleware = new CanaryMiddleware(next, options.Object, loggerFactory, healthService.Object, policyProvider, serverSwitch.Object, authZService.Object);
            await canaryMiddleware.Invoke(contextMock.Object);

            serverSwitch.Verify(s => s.CheckServerStateAsync(It.IsAny <ServerSwitchContext>()), Times.Never());
            healthService.Verify(s => s.CheckHealthAsync(It.IsAny <HealthCheckPolicy>()), Times.Never());
            Assert.Equal(404, contextMock.Object.Response.StatusCode);
        }
Example #2
0
        public async Task Invoke_ServerDisabled_Returns503()
        {
            var             contextMock = GetMockContext("/canary");
            RequestDelegate next        = _ =>
            {
                return(Task.FromResult <object>(null));
            };

            var options = new Mock <IOptions <CanaryOptions> >();

            options.SetupGet(o => o.Value)
            .Returns(new CanaryOptions()
            {
                Path = "/canary"
            });

            var loggerFactory = new LoggerFactory();
            var healthService = new Mock <IHealthCheckService>();

            healthService.Setup(s => s.CheckHealthAsync(It.IsAny <HealthCheckPolicy>()))
            .ReturnsAsync(HealthCheckResponse.Empty);

            var defaultPolicy  = new HealthCheckPolicy(new HealthCheckSettingsCollection());
            var policyProvider = new DefaultHealthCheckPolicyProvider(defaultPolicy);

            var serverSwitch = new Mock <IServerSwitch>();

            serverSwitch.Setup(s => s.CheckServerStateAsync(It.IsAny <ServerSwitchContext>()))
            .Callback <ServerSwitchContext>(c => c.Disable())
            .Returns(Task.FromResult(0));

            var authZService = new Mock <IAuthorizationService>();

            var canaryMiddleware = new CanaryMiddleware(next, options.Object, loggerFactory, healthService.Object, policyProvider, serverSwitch.Object, authZService.Object);
            await canaryMiddleware.Invoke(contextMock.Object);


            serverSwitch.Verify(s => s.CheckServerStateAsync(It.IsAny <ServerSwitchContext>()), Times.Once());
            healthService.Verify(s => s.CheckHealthAsync(It.IsAny <HealthCheckPolicy>()), Times.Never());
            Assert.Equal(StatusCodes.Status503ServiceUnavailable, contextMock.Object.Response.StatusCode);
        }
Example #3
0
        public async Task Invoke_WithNonMatchingPath_IgnoresRequest()
        {
            var             contextMock = GetMockContext("/nonmatchingpath");
            RequestDelegate next        = _ =>
            {
                return(Task.FromResult <object>(null));
            };

            var options = new Mock <IOptions <CanaryOptions> >();

            options.SetupGet(o => o.Value)
            .Returns(new CanaryOptions()
            {
                Path = "/canary"
            });

            var loggerFactory = new LoggerFactory();
            var healthService = new Mock <IHealthCheckService>();

            healthService.Setup(s => s.CheckHealthAsync(It.IsAny <HealthCheckPolicy>()))
            .ReturnsAsync(HealthCheckResponse.Empty);

            var defaultPolicy  = new HealthCheckPolicy(new HealthCheckSettingsCollection());
            var policyProvider = new DefaultHealthCheckPolicyProvider(defaultPolicy);

            var serverSwitch = new Mock <IServerSwitch>();

            serverSwitch.Setup(s => s.CheckServerStateAsync(It.IsAny <ServerSwitchContext>()));

            var authZService = new Mock <IAuthorizationService>();

            var canaryMiddleware = new CanaryMiddleware(next, options.Object, loggerFactory, healthService.Object, policyProvider, serverSwitch.Object, authZService.Object);
            await canaryMiddleware.Invoke(contextMock.Object);

            healthService.Verify(s => s.CheckHealthAsync(It.IsAny <HealthCheckPolicy>()), Times.Never());
        }