Fix for #104 - RouterMiddleware should take ILoggerFactory in the

constructor

Did some cleanup here to make these tests work on CoreCLR. They weren't
using Moq for anything important.
This commit is contained in:
Ryan Nowak 2014-10-29 14:15:39 -07:00
parent 87f0bbb092
commit 08c591c74b
3 changed files with 51 additions and 72 deletions

View File

@ -1,58 +1,47 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // 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 System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.RequestContainer; using Microsoft.AspNet.RequestContainer;
using Microsoft.AspNet.Routing; using Microsoft.AspNet.Routing;
using Microsoft.AspNet.Routing.Logging; using Microsoft.AspNet.Routing.Logging;
using Microsoft.AspNet.Routing.Logging.Internal; using Microsoft.AspNet.Routing.Logging.Internal;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.Logging; using Microsoft.Framework.Logging;
using System;
namespace Microsoft.AspNet.Builder namespace Microsoft.AspNet.Builder
{ {
public class RouterMiddleware public class RouterMiddleware
{ {
private ILogger _logger; private readonly ILogger _logger;
private readonly RequestDelegate _next;
private readonly IRouter _router;
private readonly IServiceProvider _services;
public RouterMiddleware(RequestDelegate next, IServiceProvider services, IRouter router) public RouterMiddleware(
RequestDelegate next,
IServiceProvider services,
ILoggerFactory loggerFactory,
IRouter router)
{ {
Next = next; _next = next;
Router = router; _services = services;
Services = services; _router = router;
}
private IRouter Router _logger = loggerFactory.Create<RouterMiddleware>();
{
get;
set;
}
private RequestDelegate Next
{
get;
set;
}
private IServiceProvider Services
{
get;
set;
} }
public async Task Invoke(HttpContext httpContext) public async Task Invoke(HttpContext httpContext)
{ {
using (RequestServicesContainer.EnsureRequestServices(httpContext, Services)) using (RequestServicesContainer.EnsureRequestServices(httpContext, _services))
{ {
EnsureLogger(httpContext);
using (_logger.BeginScope("RouterMiddleware.Invoke")) using (_logger.BeginScope("RouterMiddleware.Invoke"))
{ {
var context = new RouteContext(httpContext); var context = new RouteContext(httpContext);
context.RouteData.Routers.Add(Router); context.RouteData.Routers.Add(_router);
await Router.RouteAsync(context); await _router.RouteAsync(context);
if (_logger.IsEnabled(TraceType.Verbose)) if (_logger.IsEnabled(TraceType.Verbose))
{ {
@ -61,19 +50,10 @@ namespace Microsoft.AspNet.Builder
if (!context.IsHandled) if (!context.IsHandled)
{ {
await Next.Invoke(httpContext); await _next.Invoke(httpContext);
} }
} }
} }
} }
private void EnsureLogger(HttpContext context)
{
if (_logger == null)
{
var factory = context.RequestServices.GetRequiredService<ILoggerFactory>();
_logger = factory.Create<RouterMiddleware>();
}
}
} }
} }

View File

@ -1,22 +1,17 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // 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 System.Threading.Tasks;
using Microsoft.AspNet.Builder; using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore;
using Microsoft.AspNet.Routing.Logging; using Microsoft.AspNet.Routing.Logging;
using Microsoft.Framework.Logging;
#if ASPNET50
using Moq;
#endif
using Xunit; using Xunit;
using System;
namespace Microsoft.AspNet.Routing namespace Microsoft.AspNet.Routing
{ {
public class RouterMiddlewareTest public class RouterMiddlewareTest
{ {
#if ASPNET50
[Fact] [Fact]
public async void Invoke_LogsCorrectValuesWhenNotHandled() public async void Invoke_LogsCorrectValuesWhenNotHandled()
{ {
@ -28,11 +23,9 @@ namespace Microsoft.AspNet.Routing
TestSink.EnableWithTypeName<RouterMiddleware>); TestSink.EnableWithTypeName<RouterMiddleware>);
var loggerFactory = new TestLoggerFactory(sink, enabled: true); var loggerFactory = new TestLoggerFactory(sink, enabled: true);
var mockContext = new Mock<HttpContext>(MockBehavior.Strict); var httpContext = new DefaultHttpContext();
mockContext.Setup(m => m.RequestServices.GetService(typeof(ILoggerFactory))) httpContext.ApplicationServices = new ServiceProvider();
.Returns(loggerFactory); httpContext.RequestServices = httpContext.ApplicationServices;
var mockServiceProvider = new Mock<IServiceProvider>();
RequestDelegate next = (c) => RequestDelegate next = (c) =>
{ {
@ -40,10 +33,10 @@ namespace Microsoft.AspNet.Routing
}; };
var router = new TestRouter(isHandled); var router = new TestRouter(isHandled);
var middleware = new RouterMiddleware(next, mockServiceProvider.Object, router); var middleware = new RouterMiddleware(next, httpContext.ApplicationServices, loggerFactory, router);
// Act // Act
await middleware.Invoke(mockContext.Object); await middleware.Invoke(httpContext);
// Assert // Assert
Assert.Single(sink.Scopes); Assert.Single(sink.Scopes);
@ -72,9 +65,9 @@ namespace Microsoft.AspNet.Routing
TestSink.EnableWithTypeName<RouterMiddleware>); TestSink.EnableWithTypeName<RouterMiddleware>);
var loggerFactory = new TestLoggerFactory(sink, enabled: false); var loggerFactory = new TestLoggerFactory(sink, enabled: false);
var mockContext = new Mock<HttpContext>(MockBehavior.Strict); var httpContext = new DefaultHttpContext();
mockContext.Setup(m => m.RequestServices.GetService(typeof(ILoggerFactory))) httpContext.ApplicationServices = new ServiceProvider();
.Returns(loggerFactory); httpContext.RequestServices = httpContext.ApplicationServices;
RequestDelegate next = (c) => RequestDelegate next = (c) =>
{ {
@ -82,11 +75,10 @@ namespace Microsoft.AspNet.Routing
}; };
var router = new TestRouter(isHandled); var router = new TestRouter(isHandled);
var mockServiceProvider = new Mock<IServiceProvider>(); var middleware = new RouterMiddleware(next, httpContext.ApplicationServices, loggerFactory, router);
var middleware = new RouterMiddleware(next, mockServiceProvider.Object, router);
// Act // Act
await middleware.Invoke(mockContext.Object); await middleware.Invoke(httpContext);
// Assert // Assert
Assert.Single(sink.Scopes); Assert.Single(sink.Scopes);
@ -108,9 +100,9 @@ namespace Microsoft.AspNet.Routing
TestSink.EnableWithTypeName<RouterMiddleware>); TestSink.EnableWithTypeName<RouterMiddleware>);
var loggerFactory = new TestLoggerFactory(sink, enabled: true); var loggerFactory = new TestLoggerFactory(sink, enabled: true);
var mockContext = new Mock<HttpContext>(MockBehavior.Strict); var httpContext = new DefaultHttpContext();
mockContext.Setup(m => m.RequestServices.GetService(typeof(ILoggerFactory))) httpContext.ApplicationServices = new ServiceProvider();
.Returns(loggerFactory); httpContext.RequestServices = httpContext.ApplicationServices;
RequestDelegate next = (c) => RequestDelegate next = (c) =>
{ {
@ -118,11 +110,11 @@ namespace Microsoft.AspNet.Routing
}; };
var router = new TestRouter(isHandled); var router = new TestRouter(isHandled);
var mockServiceProvider = new Mock<IServiceProvider>();
var middleware = new RouterMiddleware(next, mockServiceProvider.Object, router); var middleware = new RouterMiddleware(next, httpContext.ApplicationServices, loggerFactory, router);
// Act // Act
await middleware.Invoke(mockContext.Object); await middleware.Invoke(httpContext);
// Assert // Assert
// exists a BeginScope, verify contents // exists a BeginScope, verify contents
@ -153,9 +145,9 @@ namespace Microsoft.AspNet.Routing
TestSink.EnableWithTypeName<RouterMiddleware>); TestSink.EnableWithTypeName<RouterMiddleware>);
var loggerFactory = new TestLoggerFactory(sink, enabled: false); var loggerFactory = new TestLoggerFactory(sink, enabled: false);
var mockContext = new Mock<HttpContext>(MockBehavior.Strict); var httpContext = new DefaultHttpContext();
mockContext.Setup(m => m.RequestServices.GetService(typeof(ILoggerFactory))) httpContext.ApplicationServices = new ServiceProvider();
.Returns(loggerFactory); httpContext.RequestServices = httpContext.ApplicationServices;
RequestDelegate next = (c) => RequestDelegate next = (c) =>
{ {
@ -163,11 +155,10 @@ namespace Microsoft.AspNet.Routing
}; };
var router = new TestRouter(isHandled); var router = new TestRouter(isHandled);
var mockServiceProvider = new Mock<IServiceProvider>(); var middleware = new RouterMiddleware(next, httpContext.ApplicationServices, loggerFactory, router);
var middleware = new RouterMiddleware(next, mockServiceProvider.Object, router);
// Act // Act
await middleware.Invoke(mockContext.Object); await middleware.Invoke(httpContext);
// Assert // Assert
// exists a BeginScope, verify contents // exists a BeginScope, verify contents
@ -178,12 +169,11 @@ namespace Microsoft.AspNet.Routing
Assert.Empty(sink.Writes); Assert.Empty(sink.Writes);
} }
#endif
private class TestRouter : IRouter private class TestRouter : IRouter
{ {
private bool _isHandled; private bool _isHandled;
public TestRouter(bool isHandled) public TestRouter(bool isHandled)
{ {
_isHandled = isHandled; _isHandled = isHandled;
@ -200,5 +190,13 @@ namespace Microsoft.AspNet.Routing
return Task.FromResult<object>(null); return Task.FromResult<object>(null);
} }
} }
private class ServiceProvider : IServiceProvider
{
public object GetService(Type serviceType)
{
throw new NotImplementedException();
}
}
} }
} }

View File

@ -3,6 +3,7 @@
"warningsAsErrors": "true" "warningsAsErrors": "true"
}, },
"dependencies": { "dependencies": {
"Microsoft.AspNet.PipelineCore": "1.0.0-*",
"Microsoft.AspNet.Routing": "1.0.0-*", "Microsoft.AspNet.Routing": "1.0.0-*",
"Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*",
"Xunit.KRunner": "1.0.0-*" "Xunit.KRunner": "1.0.0-*"