React to logging in DI changes (#1873)

This commit is contained in:
Pavel Krymets 2017-06-02 08:34:22 -07:00 committed by GitHub
parent 69b4100bbc
commit 3c731ceb13
9 changed files with 53 additions and 56 deletions

View File

@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26403.7
VisualStudioVersion = 15.0.26510.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7972A5D6-3385-4127-9277-428506DD44FF}"
ProjectSection(SolutionItems) = preProject
@ -22,7 +22,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "shared", "{0EF2AC
test\shared\DummyApplication.cs = test\shared\DummyApplication.cs
test\shared\HttpClientSlim.cs = test\shared\HttpClientSlim.cs
test\shared\HttpParsingData.cs = test\shared\HttpParsingData.cs
test\shared\KestrelTestLoggerFactory.cs = test\shared\KestrelTestLoggerFactory.cs
test\shared\KestrelTestLoggerProvider.cs = test\shared\KestrelTestLoggerProvider.cs
test\shared\LifetimeNotImplemented.cs = test\shared\LifetimeNotImplemented.cs
test\shared\MockConnectionInformation.cs = test\shared\MockConnectionInformation.cs
test\shared\MockFrameControl.cs = test\shared\MockFrameControl.cs

View File

@ -156,7 +156,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
private static KestrelServer CreateServer(KestrelServerOptions options, ILogger testLogger)
{
return new KestrelServer(Options.Create(options), new MockTransportFactory(), new KestrelTestLoggerFactory(testLogger));
return new KestrelServer(Options.Create(options), new MockTransportFactory(), new LoggerFactory(new [] { new KestrelTestLoggerProvider(testLogger)} ));
}
private static void StartDummyApplication(IServer server)

View File

@ -26,6 +26,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Testing" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(TestSdkVersion)" />

View File

@ -19,6 +19,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Xunit;
@ -31,9 +32,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{
private const int MaxRetries = 10;
private readonly ILoggerFactory _loggerFactory;
private readonly Action<ILoggingBuilder> _configureLoggingDelegate;
public AddressRegistrationTests(ITestOutputHelper output) => _loggerFactory = new LoggerFactory().AddXunit(output);
public AddressRegistrationTests(ITestOutputHelper output) => _configureLoggingDelegate = builder => builder.AddXunit(output);
[ConditionalFact]
[NetworkIsReachable]
@ -161,7 +162,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{
var hostBuilder = new WebHostBuilder()
.UseKestrel()
.UseLoggerFactory(_loggerFactory)
.ConfigureLogging(_configureLoggingDelegate)
.UseUrls(addressInput)
.Configure(ConfigureEchoAddress);
@ -220,7 +221,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
private async Task RegisterIPEndPoint_Success(IPEndPoint endPoint, string testUrl, int testPort = 0)
{
var hostBuilder = new WebHostBuilder()
.UseLoggerFactory(_loggerFactory)
.ConfigureLogging(_configureLoggingDelegate)
.UseKestrel(options =>
{
options.Listen(endPoint, listenOptions =>
@ -301,9 +302,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var testLogger = new TestApplicationErrorLogger();
var hostBuilder = new WebHostBuilder()
.UseLoggerFactory(_loggerFactory)
.ConfigureLogging(_configureLoggingDelegate)
.UseKestrel()
.UseLoggerFactory(_ => new KestrelTestLoggerFactory(testLogger))
.ConfigureLogging(builder => builder
.AddProvider(new KestrelTestLoggerProvider(testLogger))
.SetMinimumLevel(LogLevel.Debug))
.Configure(ConfigureEchoAddress);
using (var host = hostBuilder.Build())
@ -331,7 +334,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var port = ((IPEndPoint)socket.LocalEndPoint).Port;
var hostBuilder = new WebHostBuilder()
.UseLoggerFactory(_loggerFactory)
.ConfigureLogging(_configureLoggingDelegate)
.UseKestrel()
.UseUrls($"http://127.0.0.1:{port}")
.Configure(ConfigureEchoAddress);
@ -354,7 +357,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var port = ((IPEndPoint)socket.LocalEndPoint).Port;
var hostBuilder = new WebHostBuilder()
.UseLoggerFactory(_loggerFactory)
.ConfigureLogging(_configureLoggingDelegate)
.UseKestrel()
.UseUrls($"http://[::1]:{port}")
.Configure(ConfigureEchoAddress);
@ -382,7 +385,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
})
.UseUrls(useUrlsAddress)
.PreferHostingUrls(true)
.UseLoggerFactory(_ => new KestrelTestLoggerFactory(testLogger))
.ConfigureLogging(builder => builder.AddProvider(new KestrelTestLoggerProvider(testLogger)))
.Configure(ConfigureEchoAddress);
using (var host = hostBuilder.Build())
@ -412,7 +415,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var useUrlsAddress = $"http://127.0.0.1:0";
var testLogger = new TestApplicationErrorLogger();
var hostBuilder = new WebHostBuilder()
.UseLoggerFactory(_loggerFactory)
.ConfigureLogging(_configureLoggingDelegate)
.UseKestrel(options =>
{
options.Listen(new IPEndPoint(IPAddress.Loopback, 0), listenOptions =>
@ -422,7 +425,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
})
.UseUrls($"http://127.0.0.1:0")
.PreferHostingUrls(false)
.UseLoggerFactory(_ => new KestrelTestLoggerFactory(testLogger))
.ConfigureLogging(builder => builder.AddProvider(new KestrelTestLoggerProvider(testLogger)))
.Configure(ConfigureEchoAddress);
using (var host = hostBuilder.Build())
@ -450,7 +453,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public async Task DoesNotOverrideDirectConfigurationWithIServerAddressesFeature_IfAddressesEmpty()
{
var hostBuilder = new WebHostBuilder()
.UseLoggerFactory(_loggerFactory)
.ConfigureLogging(_configureLoggingDelegate)
.UseKestrel(options =>
{
options.Listen(new IPEndPoint(IPAddress.Loopback, 0), listenOptions =>
@ -528,7 +531,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var port = ((IPEndPoint)socket.LocalEndPoint).Port;
var hostBuilder = new WebHostBuilder()
.UseLoggerFactory(_loggerFactory)
.ConfigureLogging(_configureLoggingDelegate)
.UseKestrel()
.UseUrls($"http://localhost:{port}")
.Configure(ConfigureEchoAddress);

View File

@ -8,6 +8,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Extensions.Logging;
using Moq;
using Xunit;
@ -42,7 +43,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var tcs = new TaskCompletionSource<object>();
return tcs.Task;
},
new TestServiceContext(new KestrelTestLoggerFactory(), mockTrace.Object)))
new TestServiceContext(new LoggerFactory(), mockTrace.Object)))
{
using (var connection = server.CreateConnection())
{

View File

@ -11,6 +11,7 @@ using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.Https;
@ -26,7 +27,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact]
public async Task EmptyRequestLoggedAsInformation()
{
var loggerFactory = new HandshakeErrorLoggerFactory();
var loggerProvider = new HandshakeErrorLoggerProvider();
var hostBuilder = new WebHostBuilder()
.UseKestrel(options =>
@ -36,7 +37,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
listenOptions.UseHttps(TestResources.TestCertificatePath, "testPassword");
});
})
.UseLoggerFactory(loggerFactory)
.ConfigureLogging(builder => builder.AddProvider(loggerProvider))
.Configure(app => { });
using (var host = hostBuilder.Build())
@ -48,19 +49,19 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
// Close socket immediately
}
await loggerFactory.FilterLogger.LogTcs.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
await loggerProvider.FilterLogger.LogTcs.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
}
Assert.Equal(1, loggerFactory.FilterLogger.LastEventId.Id);
Assert.Equal(LogLevel.Information, loggerFactory.FilterLogger.LastLogLevel);
Assert.True(loggerFactory.ErrorLogger.TotalErrorsLogged == 0,
userMessage: string.Join(Environment.NewLine, loggerFactory.ErrorLogger.ErrorMessages));
Assert.Equal(1, loggerProvider.FilterLogger.LastEventId.Id);
Assert.Equal(LogLevel.Information, loggerProvider.FilterLogger.LastLogLevel);
Assert.True(loggerProvider.ErrorLogger.TotalErrorsLogged == 0,
userMessage: string.Join(Environment.NewLine, loggerProvider.ErrorLogger.ErrorMessages));
}
[Fact]
public async Task ClientHandshakeFailureLoggedAsInformation()
{
var loggerFactory = new HandshakeErrorLoggerFactory();
var loggerProvider = new HandshakeErrorLoggerProvider();
var hostBuilder = new WebHostBuilder()
.UseKestrel(options =>
@ -70,7 +71,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
listenOptions.UseHttps(TestResources.TestCertificatePath, "testPassword");
});
})
.UseLoggerFactory(loggerFactory)
.ConfigureLogging(builder => builder.AddProvider(loggerProvider))
.Configure(app => { });
using (var host = hostBuilder.Build())
@ -84,20 +85,20 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
await stream.WriteAsync(new byte[10], 0, 10);
}
await loggerFactory.FilterLogger.LogTcs.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
await loggerProvider.FilterLogger.LogTcs.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
}
Assert.Equal(1, loggerFactory.FilterLogger.LastEventId.Id);
Assert.Equal(LogLevel.Information, loggerFactory.FilterLogger.LastLogLevel);
Assert.True(loggerFactory.ErrorLogger.TotalErrorsLogged == 0,
userMessage: string.Join(Environment.NewLine, loggerFactory.ErrorLogger.ErrorMessages));
Assert.Equal(1, loggerProvider.FilterLogger.LastEventId.Id);
Assert.Equal(LogLevel.Information, loggerProvider.FilterLogger.LastLogLevel);
Assert.True(loggerProvider.ErrorLogger.TotalErrorsLogged == 0,
userMessage: string.Join(Environment.NewLine, loggerProvider.ErrorLogger.ErrorMessages));
}
// Regression test for https://github.com/aspnet/KestrelHttpServer/issues/1103#issuecomment-246971172
[Fact]
public async Task DoesNotThrowObjectDisposedExceptionOnConnectionAbort()
{
var loggerFactory = new HandshakeErrorLoggerFactory();
var loggerProvider = new HandshakeErrorLoggerProvider();
var hostBuilder = new WebHostBuilder()
.UseKestrel(options =>
{
@ -106,7 +107,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
listenOptions.UseHttps(TestResources.TestCertificatePath, "testPassword");
});
})
.UseLoggerFactory(loggerFactory)
.ConfigureLogging(builder => builder.AddProvider(loggerProvider))
.Configure(app => app.Run(async httpContext =>
{
var ct = httpContext.RequestAborted;
@ -142,14 +143,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
}
}
Assert.False(loggerFactory.ErrorLogger.ObjectDisposedExceptionLogged);
Assert.False(loggerProvider.ErrorLogger.ObjectDisposedExceptionLogged);
}
[Fact]
public async Task DoesNotThrowObjectDisposedExceptionFromWriteAsyncAfterConnectionIsAborted()
{
var tcs = new TaskCompletionSource<object>();
var loggerFactory = new HandshakeErrorLoggerFactory();
var loggerProvider = new HandshakeErrorLoggerProvider();
var hostBuilder = new WebHostBuilder()
.UseKestrel(options =>
{
@ -158,7 +159,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
listenOptions.UseHttps(TestResources.TestCertificatePath, "testPassword");
});
})
.UseLoggerFactory(loggerFactory)
.ConfigureLogging(builder => builder.AddProvider(loggerProvider))
.Configure(app => app.Run(async httpContext =>
{
httpContext.Abort();
@ -198,7 +199,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact]
public async Task DoesNotThrowObjectDisposedExceptionOnEmptyConnection()
{
var loggerFactory = new HandshakeErrorLoggerFactory();
var loggerProvider = new HandshakeErrorLoggerProvider();
var hostBuilder = new WebHostBuilder()
.UseKestrel(options =>
{
@ -207,7 +208,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
listenOptions.UseHttps(TestResources.TestCertificatePath, "testPassword");
});
})
.UseLoggerFactory(loggerFactory)
.ConfigureLogging(builder => builder.AddProvider(loggerProvider))
.Configure(app => app.Run(httpContext => Task.CompletedTask));
using (var host = hostBuilder.Build())
@ -224,14 +225,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
}
}
Assert.False(loggerFactory.ErrorLogger.ObjectDisposedExceptionLogged);
Assert.False(loggerProvider.ErrorLogger.ObjectDisposedExceptionLogged);
}
// Regression test for https://github.com/aspnet/KestrelHttpServer/pull/1197
[Fact]
public void ConnectionFilterDoesNotLeakBlock()
{
var loggerFactory = new HandshakeErrorLoggerFactory();
var loggerProvider = new HandshakeErrorLoggerProvider();
var hostBuilder = new WebHostBuilder()
.UseKestrel(options =>
@ -241,7 +242,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
listenOptions.UseHttps(TestResources.TestCertificatePath, "testPassword");
});
})
.UseLoggerFactory(loggerFactory)
.ConfigureLogging(builder => builder.AddProvider(loggerProvider))
.Configure(app => { });
using (var host = hostBuilder.Build())
@ -258,7 +259,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
}
}
private class HandshakeErrorLoggerFactory : ILoggerFactory
private class HandshakeErrorLoggerProvider : ILoggerProvider
{
public HttpsConnectionFilterLogger FilterLogger { get; } = new HttpsConnectionFilterLogger();
public ApplicationErrorLogger ErrorLogger { get; } = new ApplicationErrorLogger();
@ -275,11 +276,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
}
}
public void AddProvider(ILoggerProvider provider)
{
throw new NotImplementedException();
}
public void Dispose()
{
}

View File

@ -27,6 +27,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Testing" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(TestSdkVersion)" />

View File

@ -6,16 +6,16 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Testing
{
public class KestrelTestLoggerFactory : ILoggerFactory
public class KestrelTestLoggerProvider : ILoggerProvider
{
private readonly ILogger _testLogger;
public KestrelTestLoggerFactory()
public KestrelTestLoggerProvider()
: this(new TestApplicationErrorLogger())
{
}
public KestrelTestLoggerFactory(ILogger testLogger)
public KestrelTestLoggerProvider(ILogger testLogger)
{
_testLogger = testLogger;
}
@ -25,11 +25,6 @@ namespace Microsoft.AspNetCore.Testing
return _testLogger;
}
public void AddProvider(ILoggerProvider provider)
{
throw new NotImplementedException();
}
public void Dispose()
{
throw new NotImplementedException();

View File

@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Testing
public class TestServiceContext : ServiceContext
{
public TestServiceContext()
: this(new KestrelTestLoggerFactory())
: this(new LoggerFactory(new[] { new KestrelTestLoggerProvider() }))
{
}