// 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.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging.Testing; using Xunit; namespace Microsoft.AspNetCore.Routing { public class RouterMiddlewareTest { [Fact] public async Task Invoke_LogsCorrectValues_WhenNotHandled() { // Arrange var expectedMessage = "Request did not match any routes"; var isHandled = false; var sink = new TestSink( TestSink.EnableWithTypeName, TestSink.EnableWithTypeName); var loggerFactory = new TestLoggerFactory(sink, enabled: true); var httpContext = new DefaultHttpContext(); httpContext.RequestServices = new ServiceProvider(); RequestDelegate next = (c) => { return Task.FromResult(null); }; var router = new TestRouter(isHandled); var middleware = new RouterMiddleware(next, loggerFactory, router); // Act await middleware.Invoke(httpContext); // Assert Assert.Empty(sink.Scopes); var write = Assert.Single(sink.Writes); Assert.Equal(expectedMessage, write.State?.ToString()); } [Fact] public async Task Invoke_DoesNotLog_WhenHandled() { // Arrange var isHandled = true; var sink = new TestSink( TestSink.EnableWithTypeName, TestSink.EnableWithTypeName); var loggerFactory = new TestLoggerFactory(sink, enabled: true); var httpContext = new DefaultHttpContext(); httpContext.RequestServices = new ServiceProvider(); RequestDelegate next = (c) => { return Task.FromResult(null); }; var router = new TestRouter(isHandled); var middleware = new RouterMiddleware(next, loggerFactory, router); // Act await middleware.Invoke(httpContext); // Assert Assert.Empty(sink.Scopes); Assert.Empty(sink.Writes); } private class TestRouter : IRouter { private bool _isHandled; public TestRouter(bool isHandled) { _isHandled = isHandled; } public VirtualPathData GetVirtualPath(VirtualPathContext context) { return new VirtualPathData(this, ""); } public Task RouteAsync(RouteContext context) { context.Handler = _isHandled ? (RequestDelegate)((c) => Task.CompletedTask) : null; return Task.FromResult(null); } } private class ServiceProvider : IServiceProvider { public object GetService(Type serviceType) { throw new NotImplementedException(); } } } }