| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 |
- // Copyright (c) .NET Foundation. All rights reserved.
- // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
- using System;
- using System.Collections.Generic;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Builder;
- using Microsoft.AspNetCore.Builder.Internal;
- using Microsoft.AspNetCore.Http.Abstractions;
- using Xunit;
- namespace Microsoft.AspNetCore.Http
- {
- public class UseMiddlewareTest
- {
- [Fact]
- public void UseMiddleware_WithNoParameters_ThrowsException()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareNoParametersStub));
- var exception = Assert.Throws<InvalidOperationException>(() => builder.Build());
- Assert.Equal(
- Resources.FormatException_UseMiddlewareNoParameters(
- UseMiddlewareExtensions.InvokeMethodName,
- UseMiddlewareExtensions.InvokeAsyncMethodName,
- nameof(HttpContext)),
- exception.Message);
- }
- [Fact]
- public void UseMiddleware_AsyncWithNoParameters_ThrowsException()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareAsyncNoParametersStub));
- var exception = Assert.Throws<InvalidOperationException>(() => builder.Build());
- Assert.Equal(
- Resources.FormatException_UseMiddlewareNoParameters(
- UseMiddlewareExtensions.InvokeMethodName,
- UseMiddlewareExtensions.InvokeAsyncMethodName,
- nameof(HttpContext)),
- exception.Message);
- }
- [Fact]
- public void UseMiddleware_NonTaskReturnType_ThrowsException()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareNonTaskReturnStub));
- var exception = Assert.Throws<InvalidOperationException>(() => builder.Build());
- Assert.Equal(
- Resources.FormatException_UseMiddlewareNonTaskReturnType(
- UseMiddlewareExtensions.InvokeMethodName,
- UseMiddlewareExtensions.InvokeAsyncMethodName,
- nameof(Task)),
- exception.Message);
- }
- [Fact]
- public void UseMiddleware_AsyncNonTaskReturnType_ThrowsException()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareAsyncNonTaskReturnStub));
- var exception = Assert.Throws<InvalidOperationException>(() => builder.Build());
- Assert.Equal(
- Resources.FormatException_UseMiddlewareNonTaskReturnType(
- UseMiddlewareExtensions.InvokeMethodName,
- UseMiddlewareExtensions.InvokeAsyncMethodName,
- nameof(Task)),
- exception.Message);
- }
- [Fact]
- public void UseMiddleware_NoInvokeOrInvokeAsyncMethod_ThrowsException()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareNoInvokeStub));
- var exception = Assert.Throws<InvalidOperationException>(() => builder.Build());
- Assert.Equal(
- Resources.FormatException_UseMiddlewareNoInvokeMethod(
- UseMiddlewareExtensions.InvokeMethodName,
- UseMiddlewareExtensions.InvokeAsyncMethodName, typeof(MiddlewareNoInvokeStub)),
- exception.Message);
- }
- [Fact]
- public void UseMiddleware_MultipleInvokeMethods_ThrowsException()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareMultipleInvokesStub));
- var exception = Assert.Throws<InvalidOperationException>(() => builder.Build());
- Assert.Equal(
- Resources.FormatException_UseMiddleMutlipleInvokes(
- UseMiddlewareExtensions.InvokeMethodName,
- UseMiddlewareExtensions.InvokeAsyncMethodName),
- exception.Message);
- }
- [Fact]
- public void UseMiddleware_MultipleInvokeAsyncMethods_ThrowsException()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareMultipleInvokeAsyncStub));
- var exception = Assert.Throws<InvalidOperationException>(() => builder.Build());
- Assert.Equal(
- Resources.FormatException_UseMiddleMutlipleInvokes(
- UseMiddlewareExtensions.InvokeMethodName,
- UseMiddlewareExtensions.InvokeAsyncMethodName),
- exception.Message);
- }
- [Fact]
- public void UseMiddleware_MultipleInvokeAndInvokeAsyncMethods_ThrowsException()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareMultipleInvokeAndInvokeAsyncStub));
- var exception = Assert.Throws<InvalidOperationException>(() => builder.Build());
- Assert.Equal(
- Resources.FormatException_UseMiddleMutlipleInvokes(
- UseMiddlewareExtensions.InvokeMethodName,
- UseMiddlewareExtensions.InvokeAsyncMethodName),
- exception.Message);
- }
- [Fact]
- public async Task UseMiddleware_ThrowsIfArgCantBeResolvedFromContainer()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareInjectInvokeNoService));
- var app = builder.Build();
- var exception = await Assert.ThrowsAsync<InvalidOperationException>(() => app(new DefaultHttpContext()));
- Assert.Equal(
- Resources.FormatException_InvokeMiddlewareNoService(
- typeof(object),
- typeof(MiddlewareInjectInvokeNoService)),
- exception.Message);
- }
- [Fact]
- public void UseMiddlewareWithInvokeArg()
- {
- var builder = new ApplicationBuilder(new DummyServiceProvider());
- builder.UseMiddleware(typeof(MiddlewareInjectInvoke));
- var app = builder.Build();
- app(new DefaultHttpContext());
- }
- [Fact]
- public void UseMiddlewareWithInvokeWithOutAndRefThrows()
- {
- var mockServiceProvider = new DummyServiceProvider();
- var builder = new ApplicationBuilder(mockServiceProvider);
- builder.UseMiddleware(typeof(MiddlewareInjectWithOutAndRefParams));
- var exception = Assert.Throws<NotSupportedException>(() => builder.Build());
- }
- [Fact]
- public void UseMiddlewareWithIMiddlewareThrowsIfParametersSpecified()
- {
- var mockServiceProvider = new DummyServiceProvider();
- var builder = new ApplicationBuilder(mockServiceProvider);
- var exception = Assert.Throws<NotSupportedException>(() => builder.UseMiddleware(typeof(Middleware), "arg"));
- Assert.Equal(Resources.FormatException_UseMiddlewareExplicitArgumentsNotSupported(typeof(IMiddleware)), exception.Message);
- }
- [Fact]
- public async Task UseMiddlewareWithIMiddlewareThrowsIfNoIMiddlewareFactoryRegistered()
- {
- var mockServiceProvider = new DummyServiceProvider();
- var builder = new ApplicationBuilder(mockServiceProvider);
- builder.UseMiddleware(typeof(Middleware));
- var app = builder.Build();
- var exception = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
- {
- var context = new DefaultHttpContext();
- var sp = new DummyServiceProvider();
- context.RequestServices = sp;
- await app(context);
- });
- Assert.Equal(Resources.FormatException_UseMiddlewareNoMiddlewareFactory(typeof(IMiddlewareFactory)), exception.Message);
- }
- [Fact]
- public async Task UseMiddlewareWithIMiddlewareThrowsIfMiddlewareFactoryCreateReturnsNull()
- {
- var mockServiceProvider = new DummyServiceProvider();
- var builder = new ApplicationBuilder(mockServiceProvider);
- builder.UseMiddleware(typeof(Middleware));
- var app = builder.Build();
- var exception = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
- {
- var context = new DefaultHttpContext();
- var sp = new DummyServiceProvider();
- sp.AddService(typeof(IMiddlewareFactory), new BadMiddlewareFactory());
- context.RequestServices = sp;
- await app(context);
- });
- Assert.Equal(
- Resources.FormatException_UseMiddlewareUnableToCreateMiddleware(
- typeof(BadMiddlewareFactory),
- typeof(Middleware)),
- exception.Message);
- }
- [Fact]
- public async Task UseMiddlewareWithIMiddlewareWorks()
- {
- var mockServiceProvider = new DummyServiceProvider();
- var builder = new ApplicationBuilder(mockServiceProvider);
- builder.UseMiddleware(typeof(Middleware));
- var app = builder.Build();
- var context = new DefaultHttpContext();
- var sp = new DummyServiceProvider();
- var middlewareFactory = new BasicMiddlewareFactory();
- sp.AddService(typeof(IMiddlewareFactory), middlewareFactory);
- context.RequestServices = sp;
- await app(context);
- Assert.True(Assert.IsType<bool>(context.Items["before"]));
- Assert.True(Assert.IsType<bool>(context.Items["after"]));
- Assert.NotNull(middlewareFactory.Created);
- Assert.NotNull(middlewareFactory.Released);
- Assert.IsType<Middleware>(middlewareFactory.Created);
- Assert.IsType<Middleware>(middlewareFactory.Released);
- Assert.Same(middlewareFactory.Created, middlewareFactory.Released);
- }
- public class Middleware : IMiddleware
- {
- public async Task InvokeAsync(HttpContext context, RequestDelegate next)
- {
- context.Items["before"] = true;
- await next(context);
- context.Items["after"] = true;
- }
- }
- public class BasicMiddlewareFactory : IMiddlewareFactory
- {
- public IMiddleware? Created { get; private set; }
- public IMiddleware? Released { get; private set; }
- public IMiddleware? Create(Type middlewareType)
- {
- Created = Activator.CreateInstance(middlewareType) as IMiddleware;
- return Created;
- }
- public void Release(IMiddleware middleware)
- {
- Released = middleware;
- }
- }
- public class BadMiddlewareFactory : IMiddlewareFactory
- {
- public IMiddleware? Create(Type middlewareType) => null;
- public void Release(IMiddleware middleware) { }
- }
- private class DummyServiceProvider : IServiceProvider
- {
- private readonly Dictionary<Type, object> _services = new Dictionary<Type, object>();
- public void AddService(Type type, object value) => _services[type] = value;
- public object? GetService(Type serviceType)
- {
- if (serviceType == typeof(IServiceProvider))
- {
- return this;
- }
- if (_services.TryGetValue(serviceType, out var value))
- {
- return value;
- }
- return null;
- }
- }
- public class MiddlewareInjectWithOutAndRefParams
- {
- public MiddlewareInjectWithOutAndRefParams(RequestDelegate next) { }
- public Task Invoke(HttpContext context, ref IServiceProvider? sp1, out IServiceProvider? sp2)
- {
- sp1 = null;
- sp2 = null;
- return Task.FromResult(0);
- }
- }
- private class MiddlewareInjectInvokeNoService
- {
- public MiddlewareInjectInvokeNoService(RequestDelegate next) { }
- public Task Invoke(HttpContext context, object value) => Task.CompletedTask;
- }
- private class MiddlewareInjectInvoke
- {
- public MiddlewareInjectInvoke(RequestDelegate next) { }
- public Task Invoke(HttpContext context, IServiceProvider provider) => Task.CompletedTask;
- }
- private class MiddlewareNoParametersStub
- {
- public MiddlewareNoParametersStub(RequestDelegate next) { }
- public Task Invoke() => Task.CompletedTask;
- }
- private class MiddlewareAsyncNoParametersStub
- {
- public MiddlewareAsyncNoParametersStub(RequestDelegate next) { }
- public Task InvokeAsync() => Task.CompletedTask;
- }
- private class MiddlewareNonTaskReturnStub
- {
- public MiddlewareNonTaskReturnStub(RequestDelegate next) { }
- public int Invoke() => 0;
- }
- private class MiddlewareAsyncNonTaskReturnStub
- {
- public MiddlewareAsyncNonTaskReturnStub(RequestDelegate next) { }
- public int InvokeAsync() => 0;
- }
- private class MiddlewareNoInvokeStub
- {
- public MiddlewareNoInvokeStub(RequestDelegate next) { }
- }
- private class MiddlewareMultipleInvokesStub
- {
- public MiddlewareMultipleInvokesStub(RequestDelegate next) { }
- public Task Invoke(HttpContext context) => Task.CompletedTask;
- public Task Invoke(HttpContext context, int i) => Task.CompletedTask;
- }
- private class MiddlewareMultipleInvokeAsyncStub
- {
- public MiddlewareMultipleInvokeAsyncStub(RequestDelegate next) { }
- public Task InvokeAsync(HttpContext context) => Task.CompletedTask;
- public Task InvokeAsync(HttpContext context, int i) => Task.CompletedTask;
- }
- private class MiddlewareMultipleInvokeAndInvokeAsyncStub
- {
- public MiddlewareMultipleInvokeAndInvokeAsyncStub(RequestDelegate next) { }
- public Task Invoke(HttpContext context) => Task.CompletedTask;
- public Task InvokeAsync(HttpContext context) => Task.CompletedTask;
- }
- }
- }
|