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); }
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()); middlewareFilterBuilderService.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((_, 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); }
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); }
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); }
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); }