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((ctx, next) => { return(next(ctx)); }); }; // 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); }
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); }
private RequestDelegate GetMiddlewarePipeline(Type middlewarePipelineProviderType) { var applicationServices = new ServiceCollection(); var applicationBuilder = new ApplicationBuilder(applicationServices.BuildServiceProvider()); var middlewareFilterBuilderService = new MiddlewareFilterBuilder( new MiddlewareFilterConfigurationProvider()) { ApplicationBuilder = applicationBuilder }; return(middlewareFilterBuilderService.GetPipeline(middlewarePipelineProviderType)); }
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((ctx, next) => { return(next(ctx)); }); }; 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); }
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((ctx, next) => { return(next(ctx)); }); }; 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); }