コード例 #1
0
        public async Task EndMiddleware_ThrowsException_WhenMiddleFeature_NotAvailable()
        {
            // Arrange
            var services               = new ServiceCollection();
            var appBuilder             = new ApplicationBuilder(services.BuildServiceProvider());
            var pipelineBuilderService = new MiddlewareFilterBuilder(new MiddlewareFilterConfigurationProvider())
            {
                ApplicationBuilder = appBuilder,
            };

            var httpContext = new DefaultHttpContext();

            Pipeline1.ConfigurePipeline = ab =>
            {
                ab.Use((_, next) =>
                {
                    return(next());
                });
            };

            // Act
            var pipeline = pipelineBuilderService.GetPipeline(typeof(Pipeline1));

            // Assert
            Assert.NotNull(pipeline);
            var exception = await Assert.ThrowsAsync <InvalidOperationException>(() => pipeline(httpContext));

            Assert.Equal("Could not find 'IMiddlewareFilterFeature' in the feature list.", exception.Message);
        }
コード例 #2
0
        public void GetPipeline_CallsIntoConfigure_OnlyOnce_ForTheSamePipelineType()
        {
            // Arrange
            var services               = new ServiceCollection();
            var appBuilder             = new ApplicationBuilder(services.BuildServiceProvider());
            var pipelineBuilderService = new MiddlewareFilterBuilder(new MiddlewareFilterConfigurationProvider())
            {
                ApplicationBuilder = appBuilder,
            };

            var configureCount = 0;

            Pipeline1.ConfigurePipeline = _ =>
            {
                configureCount++;
            };

            // Act
            var pipeline1 = pipelineBuilderService.GetPipeline(typeof(Pipeline1));

            // Assert
            Assert.NotNull(pipeline1);
            Assert.Equal(1, configureCount);

            // Act
            var pipeline2 = pipelineBuilderService.GetPipeline(typeof(Pipeline1));

            // Assert
            Assert.NotNull(pipeline2);
            Assert.Same(pipeline1, pipeline2);
            Assert.Equal(1, configureCount);
        }
コード例 #3
0
ファイル: MiddlewareFilterTest.cs プロジェクト: vpoorshab/Mvc
        private RequestDelegate GetMiddlewarePipeline(Type middlewarePipelineProviderType)
        {
            var applicationServices            = new ServiceCollection();
            var applicationBuilder             = new ApplicationBuilder(applicationServices.BuildServiceProvider());
            var middlewareFilterBuilderService = new MiddlewareFilterBuilder(
                new MiddlewareFilterConfigurationProvider());

            middlewareFilterBuilderService.ApplicationBuilder = applicationBuilder;
            return(middlewareFilterBuilderService.GetPipeline(middlewarePipelineProviderType));
        }
コード例 #4
0
        public async Task EndMiddleware_DoesNotThrow_IfExceptionHandled()
        {
            // Arrange
            var services               = new ServiceCollection();
            var appBuilder             = new ApplicationBuilder(services.BuildServiceProvider());
            var pipelineBuilderService = new MiddlewareFilterBuilder(new MiddlewareFilterConfigurationProvider())
            {
                ApplicationBuilder = appBuilder,
            };

            Pipeline1.ConfigurePipeline = ab =>
            {
                ab.Use((_, next) =>
                {
                    return(next());
                });
            };

            var middlewareFilterFeature = new MiddlewareFilterFeature
            {
                ResourceExecutionDelegate = () =>
                {
                    var actionContext = new ActionContext(
                        new DefaultHttpContext(),
                        new RouteData(),
                        new ActionDescriptor(),
                        new ModelStateDictionary());
                    var context = new ResourceExecutedContext(actionContext, new List <IFilterMetadata>())
                    {
                        Exception        = new InvalidOperationException("Error!!!"),
                        ExceptionHandled = true,
                    };

                    return(Task.FromResult(context));
                },
            };

            var features = new FeatureCollection();

            features.Set <IMiddlewareFilterFeature>(middlewareFilterFeature);
            var httpContext = new DefaultHttpContext(features);

            // Act
            var pipeline = pipelineBuilderService.GetPipeline(typeof(Pipeline1));

            // Assert
            Assert.NotNull(pipeline);

            // Does not throw.
            await pipeline(httpContext);
        }
コード例 #5
0
        public void GetPipeline_CallsInto_Configure()
        {
            // Arrange
            var services               = new ServiceCollection();
            var appBuilder             = new ApplicationBuilder(services.BuildServiceProvider());
            var pipelineBuilderService = new MiddlewareFilterBuilder(new MiddlewareFilterConfigurationProvider());

            pipelineBuilderService.ApplicationBuilder = appBuilder;
            var configureCount = 0;

            Pipeline1.ConfigurePipeline = (ab) =>
            {
                configureCount++;
            };

            // Act
            var pipeline = pipelineBuilderService.GetPipeline(typeof(Pipeline1));

            // Assert
            Assert.NotNull(pipeline);
            Assert.Equal(1, configureCount);
        }
コード例 #6
0
        public async Task EndMiddleware_PropagatesBackException_ToEarlierMiddleware()
        {
            // Arrange
            var services               = new ServiceCollection();
            var appBuilder             = new ApplicationBuilder(services.BuildServiceProvider());
            var pipelineBuilderService = new MiddlewareFilterBuilder(new MiddlewareFilterConfigurationProvider());

            pipelineBuilderService.ApplicationBuilder = appBuilder;
            Pipeline1.ConfigurePipeline = (ab) =>
            {
                ab.Use((httpCtxt, next) =>
                {
                    return(next());
                });
            };
            var middlewareFilterFeature = new MiddlewareFilterFeature();

            middlewareFilterFeature.ResourceExecutionDelegate = () =>
            {
                var context = new ResourceExecutedContext(
                    new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor(), new ModelStateDictionary()),
                    new List <IFilterMetadata>());
                context.Exception = new InvalidOperationException("Error!!!");
                return(Task.FromResult(context));
            };
            var features = new FeatureCollection();

            features.Set <IMiddlewareFilterFeature>(middlewareFilterFeature);
            var httpContext = new DefaultHttpContext(features);

            // Act
            var pipeline = pipelineBuilderService.GetPipeline(typeof(Pipeline1));

            // Assert
            Assert.NotNull(pipeline);
            var exception = await Assert.ThrowsAsync <InvalidOperationException>(() => pipeline(httpContext));

            Assert.Equal("Error!!!", exception.Message);
        }
コード例 #7
0
        public async Task EndMiddleware_PropagatesFullExceptionInfo_ToEarlierMiddleware()
        {
            // Arrange
            var services               = new ServiceCollection();
            var appBuilder             = new ApplicationBuilder(services.BuildServiceProvider());
            var pipelineBuilderService = new MiddlewareFilterBuilder(new MiddlewareFilterConfigurationProvider())
            {
                ApplicationBuilder = appBuilder,
            };

            Pipeline1.ConfigurePipeline = ab =>
            {
                ab.Use((_, next) =>
                {
                    return(next());
                });
            };

            var middlewareFilterFeature = new MiddlewareFilterFeature
            {
                ResourceExecutionDelegate = () =>
                {
                    ExceptionDispatchInfo exceptionInfo;
                    try
                    {
                        // Create a small stack trace.
                        throw new InvalidOperationException("Error!!!");
                    }
                    catch (Exception ex)
                    {
                        exceptionInfo = ExceptionDispatchInfo.Capture(ex);
                    }

                    var actionContext = new ActionContext(
                        new DefaultHttpContext(),
                        new RouteData(),
                        new ActionDescriptor(),
                        new ModelStateDictionary());
                    var context = new ResourceExecutedContext(actionContext, new List <IFilterMetadata>())
                    {
                        ExceptionDispatchInfo = exceptionInfo,
                    };

                    return(Task.FromResult(context));
                },
            };

            var features = new FeatureCollection();

            features.Set <IMiddlewareFilterFeature>(middlewareFilterFeature);
            var httpContext = new DefaultHttpContext(features);

            // Act
            var pipeline = pipelineBuilderService.GetPipeline(typeof(Pipeline1));

            // Assert
            Assert.NotNull(pipeline);

            var exception = await Assert.ThrowsAsync <InvalidOperationException>(() => pipeline(httpContext));

            Assert.Null(exception.InnerException);
            Assert.Equal("Error!!!", exception.Message);

            var stack = exception.StackTrace;

            Assert.Contains(typeof(MiddlewareFilterBuilder).FullName, stack);
            Assert.Contains(typeof(MiddlewareFilterBuilderTest).FullName, stack);
            Assert.Contains(nameof(EndMiddleware_PropagatesFullExceptionInfo_ToEarlierMiddleware), stack);
        }