From ddc905c219d19f28445bfaf68a15d84b10b6646c Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 15 Apr 2018 11:12:21 +1200 Subject: [PATCH] Add VerifyNoErrorsScope (#1972) --- .../Internal/LoggingHttpMessageHandler.cs | 20 ++-- .../Internal/LongPollingTransport.cs | 7 ++ .../HttpConnectionDispatcherTests.cs | 95 ++++++++++--------- .../WebSocketsTests.cs | 21 ++-- .../HubConnectionTests.cs | 55 +++++------ ...HttpConnectionTests.ConnectionLifecycle.cs | 51 +++++++--- .../HttpConnectionTests.Negotiate.cs | 32 ++++--- .../HttpConnectionTests.cs | 3 +- .../HubConnectionTests.cs | 10 +- .../ResponseUtils.cs | 6 ++ .../TestHttpMessageHandler.cs | 17 ++++ .../RedisEndToEnd.cs | 6 +- .../ServerFixture.cs | 91 +++++++++--------- .../VerifiableLoggedTest.cs | 34 +++++++ .../VerifyNoErrorsScope.cs | 67 +++++++++++++ .../EndToEndTests.cs | 32 +++++-- .../WebSocketsTransportTests.cs | 16 ++-- 17 files changed, 377 insertions(+), 186 deletions(-) create mode 100644 test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifiableLoggedTest.cs create mode 100644 test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifyNoErrorsScope.cs diff --git a/src/Microsoft.AspNetCore.Http.Connections.Client/Internal/LoggingHttpMessageHandler.cs b/src/Microsoft.AspNetCore.Http.Connections.Client/Internal/LoggingHttpMessageHandler.cs index ee598c537d..7d8df64783 100644 --- a/src/Microsoft.AspNetCore.Http.Connections.Client/Internal/LoggingHttpMessageHandler.cs +++ b/src/Microsoft.AspNetCore.Http.Connections.Client/Internal/LoggingHttpMessageHandler.cs @@ -26,13 +26,13 @@ namespace Microsoft.AspNetCore.Http.Connections.Client.Internal protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { - Log.SendingHttpRequest(_logger, request.RequestUri); + Log.SendingHttpRequest(_logger, request.Method, request.RequestUri); var response = await base.SendAsync(request, cancellationToken); if (!response.IsSuccessStatusCode) { - Log.UnsuccessfulHttpResponse(_logger, request.RequestUri, response.StatusCode); + Log.UnsuccessfulHttpResponse(_logger, response.StatusCode, request.Method, request.RequestUri); } return response; @@ -40,19 +40,19 @@ namespace Microsoft.AspNetCore.Http.Connections.Client.Internal private static class Log { - private static readonly Action _sendingHttpRequest = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "SendingHttpRequest"), "Sending HTTP request to '{RequestUrl}'."); + private static readonly Action _sendingHttpRequest = + LoggerMessage.Define(LogLevel.Trace, new EventId(1, "SendingHttpRequest"), "Sending HTTP request {RequestMethod} '{RequestUrl}'."); - private static readonly Action _unsuccessfulHttpResponse = - LoggerMessage.Define(LogLevel.Warning, new EventId(2, "UnsuccessfulHttpResponse"), "Unsuccessful HTTP response status code of {StatusCode} return from '{RequestUrl}'."); + private static readonly Action _unsuccessfulHttpResponse = + LoggerMessage.Define(LogLevel.Warning, new EventId(2, "UnsuccessfulHttpResponse"), "Unsuccessful HTTP response status code of {StatusCode} return from {RequestMethod} '{RequestUrl}'."); - public static void SendingHttpRequest(ILogger logger, Uri requestUrl) + public static void SendingHttpRequest(ILogger logger, HttpMethod requestMethod, Uri requestUrl) { - _sendingHttpRequest(logger, requestUrl, null); + _sendingHttpRequest(logger, requestMethod, requestUrl, null); } - public static void UnsuccessfulHttpResponse(ILogger logger, Uri requestUrl, HttpStatusCode statusCode) + public static void UnsuccessfulHttpResponse(ILogger logger, HttpStatusCode statusCode, HttpMethod requestMethod, Uri requestUrl) { - _unsuccessfulHttpResponse(logger, requestUrl, statusCode, null); + _unsuccessfulHttpResponse(logger, statusCode, requestMethod, requestUrl, null); } } } diff --git a/src/Microsoft.AspNetCore.Http.Connections.Client/Internal/LongPollingTransport.cs b/src/Microsoft.AspNetCore.Http.Connections.Client/Internal/LongPollingTransport.cs index 30be6d696b..4059049a96 100644 --- a/src/Microsoft.AspNetCore.Http.Connections.Client/Internal/LongPollingTransport.cs +++ b/src/Microsoft.AspNetCore.Http.Connections.Client/Internal/LongPollingTransport.cs @@ -149,6 +149,13 @@ namespace Microsoft.AspNetCore.Http.Connections.Client.Internal // just want to start a new poll. continue; } + catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled) + { + // SendAsync on .NET Framework doesn't reliably throw OperationCanceledException. + // Catch the WebException and test it. + // https://github.com/dotnet/corefx/issues/26335 + continue; + } Log.PollResponseReceived(_logger, response); diff --git a/test/Microsoft.AspNetCore.Http.Connections.Tests/HttpConnectionDispatcherTests.cs b/test/Microsoft.AspNetCore.Http.Connections.Tests/HttpConnectionDispatcherTests.cs index 4ecfb1d433..2e96afd7a7 100644 --- a/test/Microsoft.AspNetCore.Http.Connections.Tests/HttpConnectionDispatcherTests.cs +++ b/test/Microsoft.AspNetCore.Http.Connections.Tests/HttpConnectionDispatcherTests.cs @@ -20,6 +20,7 @@ using Microsoft.AspNetCore.Connections.Features; using Microsoft.AspNetCore.Http.Connections.Internal; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.SignalR.Tests; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; @@ -31,7 +32,7 @@ using Xunit.Abstractions; namespace Microsoft.AspNetCore.Http.Connections.Tests { - public class HttpConnectionDispatcherTests : LoggedTest + public class HttpConnectionDispatcherTests : VerifiableLoggedTest { public HttpConnectionDispatcherTests(ITestOutputHelper output) : base(output) { @@ -40,7 +41,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task NegotiateReservesConnectionIdAndReturnsIt() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -63,7 +64,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task CheckThatThresholdValuesAreEnforced() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -101,7 +102,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.ServerSentEvents)] public async Task CheckThatThresholdValuesAreEnforcedWithSends(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -153,7 +154,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.LongPolling | HttpTransportType.WebSockets)] public async Task NegotiateReturnsAvailableTransportsAfterFilteringByOptions(HttpTransportType transports) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -187,7 +188,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.LongPolling)] public async Task EndpointsThatAcceptConnectionId404WhenUnknownConnectionIdProvided(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -224,7 +225,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task EndpointsThatAcceptConnectionId404WhenUnknownConnectionIdProvidedForPost() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -259,7 +260,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task PostNotAllowedForWebSocketConnections() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -296,7 +297,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task PostReturns404IfConnectionDisposed() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -334,7 +335,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.WebSockets)] public async Task TransportEndingGracefullyWaitsOnApplication(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -395,7 +396,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task TransportEndingGracefullyWaitsOnApplicationLongPolling() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -458,7 +459,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.ServerSentEvents)] public async Task PostSendsToConnection(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -507,7 +508,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.ServerSentEvents)] public async Task PostSendsToConnectionInParallel(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -592,7 +593,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task HttpContextFeatureForLongpollingWorksBetweenPolls() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -685,7 +686,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.LongPolling)] public async Task EndpointsThatRequireConnectionId400WhenNoConnectionIdProvided(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -717,7 +718,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task EndpointsThatRequireConnectionId400WhenNoConnectionIdProvidedForPost() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); @@ -749,7 +750,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.ServerSentEvents, 404)] public async Task EndPointThatOnlySupportsLongPollingRejectsOtherTransports(HttpTransportType transportType, int status) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { await CheckTransportSupported(HttpTransportType.LongPolling, transportType, status, loggerFactory); } @@ -761,7 +762,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.LongPolling, 404)] public async Task EndPointThatOnlySupportsSSERejectsOtherTransports(HttpTransportType transportType, int status) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { await CheckTransportSupported(HttpTransportType.ServerSentEvents, transportType, status, loggerFactory); } @@ -773,7 +774,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.LongPolling, 404)] public async Task EndPointThatOnlySupportsWebSockesRejectsOtherTransports(HttpTransportType transportType, int status) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { await CheckTransportSupported(HttpTransportType.WebSockets, transportType, status, loggerFactory); } @@ -783,7 +784,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.LongPolling, 404)] public async Task EndPointThatOnlySupportsWebSocketsAndSSERejectsLongPolling(HttpTransportType transportType, int status) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { await CheckTransportSupported(HttpTransportType.WebSockets | HttpTransportType.ServerSentEvents, transportType, status, loggerFactory); } @@ -792,7 +793,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task CompletedEndPointEndsConnection() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -820,7 +821,13 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task SynchronusExceptionEndsConnection() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HttpConnectionManager).FullName && + writeContext.EventId.Name == "FailedDispose"; + } + + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug, expectedErrorsFilter: ExpectedErrors)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -847,7 +854,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task CompletedEndPointEndsLongPollingConnection() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -874,7 +881,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task LongPollingTimeoutSets200StatusCode() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -900,7 +907,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task WebSocketTransportTimesOutWhenCloseFrameNotReceived() { - using (StartLog(out var loggerFactory, LogLevel.Trace)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -930,7 +937,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.ServerSentEvents)] public async Task RequestToActiveConnectionId409ForStreamingTransports(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -973,7 +980,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task RequestToActiveConnectionIdKillsPreviousConnectionLongPolling() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1011,7 +1018,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.LongPolling)] public async Task RequestToDisposedConnectionIdReturns404(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1039,7 +1046,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task ConnectionStateSetToInactiveAfterPoll() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1074,7 +1081,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task BlockingConnectionWorksWithStreamingConnections() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1109,7 +1116,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task BlockingConnectionWorksWithLongPollingConnection() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1143,7 +1150,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task AttemptingToPollWhileAlreadyPollingReplacesTheCurrentPoll() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1185,7 +1192,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.WebSockets, TransferFormat.Binary | TransferFormat.Text)] public async Task TransferModeSet(HttpTransportType transportType, TransferFormat? expectedTransferFormats) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1217,7 +1224,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task UnauthorizedConnectionFailsToStartEndPoint() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1263,7 +1270,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task AuthenticatedUserWithoutPermissionCausesForbidden() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1311,7 +1318,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task AuthorizedConnectionCanConnectToEndPoint() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1368,7 +1375,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task AllPoliciesRequiredForAuthorizedEndPoint() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1450,7 +1457,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task AuthorizedConnectionWithAcceptedSchemesCanConnectToEndPoint() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1508,7 +1515,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task AuthorizedConnectionWithRejectedSchemesFailsToConnectToEndPoint() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1562,7 +1569,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task SetsInherentKeepAliveFeatureOnFirstLongPollingRequest() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1594,7 +1601,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(HttpTransportType.WebSockets)] public async Task DeleteEndpointRejectsRequestToTerminateNonLongPollingTransport(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1635,7 +1642,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task DeleteEndpointGracefullyTerminatesLongPolling() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1682,7 +1689,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task DeleteEndpointGracefullyTerminatesLongPollingEvenWhenBetweenPolls() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var connection = manager.CreateConnection(); @@ -1730,7 +1737,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task NegotiateDoesNotReturnWebSocketsWhenNotAvailable() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var manager = CreateConnectionManager(loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); diff --git a/test/Microsoft.AspNetCore.Http.Connections.Tests/WebSocketsTests.cs b/test/Microsoft.AspNetCore.Http.Connections.Tests/WebSocketsTests.cs index 4bc577be48..82a59030e1 100644 --- a/test/Microsoft.AspNetCore.Http.Connections.Tests/WebSocketsTests.cs +++ b/test/Microsoft.AspNetCore.Http.Connections.Tests/WebSocketsTests.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Http.Connections.Internal; using Microsoft.AspNetCore.Http.Connections.Internal.Transports; using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.SignalR.Tests; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; using Microsoft.Net.Http.Headers; @@ -21,7 +22,7 @@ using Xunit.Abstractions; namespace Microsoft.AspNetCore.Http.Connections.Tests { - public class WebSocketsTests : LoggedTest + public class WebSocketsTests : VerifiableLoggedTest { public WebSocketsTests(ITestOutputHelper output) : base(output) @@ -34,7 +35,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(nameof(WebSocketMessageType.Binary))] public async Task ReceivedFramesAreWrittenToChannel(string webSocketMessageType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); @@ -82,7 +83,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [InlineData(TransferFormat.Binary, nameof(WebSocketMessageType.Binary))] public async Task WebSocketTransportSetsMessageTypeBasedOnTransferFormatFeature(TransferFormat transferFormat, string expectedMessageType) { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); @@ -119,7 +120,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task TransportCommunicatesErrorToApplicationWhenClientDisconnectsAbnormally() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); @@ -172,7 +173,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task ClientReceivesInternalServerErrorWhenTheApplicationFails() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); @@ -204,7 +205,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task TransportClosesOnCloseTimeoutIfClientDoesNotSendCloseFrame() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); @@ -239,7 +240,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task TransportFailsOnTimeoutWithErrorWhenApplicationFailsAndClientDoesNotSendCloseFrame() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); @@ -274,7 +275,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task ServerGracefullyClosesWhenApplicationEndsThenClientSendsCloseFrame() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); @@ -314,7 +315,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests [Fact] public async Task ServerGracefullyClosesWhenClientSendsCloseFrameThenApplicationEnds() { - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); @@ -357,7 +358,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests const string ExpectedSubProtocol = "expected"; var providedSubProtocols = new[] {"provided1", "provided2"}; - using (StartLog(out var loggerFactory, LogLevel.Debug)) + using (StartVerifableLog(out var loggerFactory, LogLevel.Debug)) { var pair = DuplexPipe.CreateConnectionPair(PipeOptions.Default, PipeOptions.Default); var connection = new HttpConnectionContext("foo", pair.Transport, pair.Application); diff --git a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs index 49ded8337d..0121d2577f 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Channels; using System.Threading.Tasks; @@ -29,7 +30,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } [Collection(HubConnectionTestsCollection.Name)] - public class HubConnectionTests : LoggedTest + public class HubConnectionTests : VerifiableLoggedTest { private readonly ServerFixture _serverFixture; public HubConnectionTests(ServerFixture serverFixture, ITestOutputHelper output) @@ -76,7 +77,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CheckFixedMessage(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, $"{nameof(CheckFixedMessage)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(CheckFixedMessage)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var connectionBuilder = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) @@ -110,7 +111,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanSendAndReceiveMessage(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, $"{nameof(CanSendAndReceiveMessage)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(CanSendAndReceiveMessage)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { const string originalMessage = "SignalR"; var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); @@ -139,7 +140,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanStopAndStartConnection(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStopAndStartConnection)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStopAndStartConnection)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { const string originalMessage = "SignalR"; var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); @@ -170,7 +171,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanStartConnectionFromClosedEvent(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStartConnectionFromClosedEvent)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStartConnectionFromClosedEvent)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var logger = loggerFactory.CreateLogger(); const string originalMessage = "SignalR"; @@ -232,7 +233,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task MethodsAreCaseInsensitive(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, $"{nameof(MethodsAreCaseInsensitive)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(MethodsAreCaseInsensitive)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { const string originalMessage = "SignalR"; var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); @@ -261,7 +262,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanInvokeClientMethodFromServer(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanInvokeClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanInvokeClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { const string originalMessage = "SignalR"; @@ -294,7 +295,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task InvokeNonExistantClientMethodFromServer(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, LogLevel.Trace, $"{nameof(InvokeNonExistantClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(InvokeNonExistantClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); var closeTcs = new TaskCompletionSource(); @@ -335,7 +336,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanStreamClientMethodFromServer(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStreamClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStreamClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); try @@ -364,7 +365,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanCloseStreamMethodEarly(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, $"{nameof(CanCloseStreamMethodEarly)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(CanCloseStreamMethodEarly)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); try @@ -404,7 +405,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task StreamDoesNotStartIfTokenAlreadyCanceled(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, LogLevel.Trace, $"{nameof(StreamDoesNotStartIfTokenAlreadyCanceled)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(StreamDoesNotStartIfTokenAlreadyCanceled)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); try @@ -436,7 +437,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ExceptionFromStreamingSentToClient(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ExceptionFromStreamingSentToClient)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ExceptionFromStreamingSentToClient)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); try @@ -464,7 +465,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionIfHubMethodCannotBeResolved(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfHubMethodCannotBeResolved)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfHubMethodCannotBeResolved)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); try @@ -491,7 +492,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionOnHubMethodArgumentCountMismatch(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnHubMethodArgumentCountMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnHubMethodArgumentCountMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); try @@ -518,7 +519,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionOnHubMethodArgumentTypeMismatch(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnHubMethodArgumentTypeMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnHubMethodArgumentTypeMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); try @@ -545,7 +546,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionIfStreamingHubMethodCannotBeResolved(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfStreamingHubMethodCannotBeResolved)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfStreamingHubMethodCannotBeResolved)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); try @@ -573,7 +574,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionOnStreamingHubMethodArgumentCountMismatch(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnStreamingHubMethodArgumentCountMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnStreamingHubMethodArgumentCountMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { loggerFactory.AddConsole(LogLevel.Trace); var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); @@ -602,7 +603,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionOnStreamingHubMethodArgumentTypeMismatch(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnStreamingHubMethodArgumentTypeMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnStreamingHubMethodArgumentTypeMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); try @@ -630,7 +631,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionIfNonStreamMethodInvokedWithStreamAsync(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfNonStreamMethodInvokedWithStreamAsync)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfNonStreamMethodInvokedWithStreamAsync)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); try @@ -657,7 +658,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionIfStreamMethodInvokedWithInvoke(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfStreamMethodInvokedWithInvoke)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfStreamMethodInvokedWithInvoke)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); try @@ -684,7 +685,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task ServerThrowsHubExceptionIfBuildingAsyncEnumeratorIsNotPossible(string hubProtocolName, HttpTransportType transportType, string hubPath) { var hubProtocol = HubProtocols[hubProtocolName]; - using (StartLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfBuildingAsyncEnumeratorIsNotPossible)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfBuildingAsyncEnumeratorIsNotPossible)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}")) { var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); try @@ -710,7 +711,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task ClientCanUseJwtBearerTokenForAuthentication(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, $"{nameof(ClientCanUseJwtBearerTokenForAuthentication)}_{transportType}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ClientCanUseJwtBearerTokenForAuthentication)}_{transportType}")) { async Task AccessTokenProvider() { @@ -748,7 +749,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task ClientCanSendHeaders(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, $"{nameof(ClientCanSendHeaders)}_{transportType}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(ClientCanSendHeaders)}_{transportType}")) { var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) @@ -780,7 +781,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [WebSocketsSupportedCondition] public async Task WebSocketOptionsAreApplied() { - using (StartLog(out var loggerFactory, $"{nameof(WebSocketOptionsAreApplied)}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(WebSocketOptionsAreApplied)}")) { // System.Net has a HttpTransportType type which means we need to fully-qualify this rather than 'use' the namespace var cookieJar = new System.Net.CookieContainer(); @@ -815,7 +816,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task CheckHttpConnectionFeatures(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, $"{nameof(CheckHttpConnectionFeatures)}_{transportType}")) + using (StartVerifableLog(out var loggerFactory, $"{nameof(CheckHttpConnectionFeatures)}_{transportType}")) { var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) @@ -851,7 +852,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [Fact] public async Task NegotiationSkipsServerSentEventsWhenUsingBinaryProtocol() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var hubConnectionBuilder = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) @@ -881,7 +882,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [Fact] public async Task StopCausesPollToReturnImmediately() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { PollTrackingMessageHandler pollTracker = null; var hubConnection = new HubConnectionBuilder() diff --git a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.ConnectionLifecycle.cs b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.ConnectionLifecycle.cs index e60b3e6f1a..08710a3228 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.ConnectionLifecycle.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.ConnectionLifecycle.cs @@ -19,9 +19,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests { public partial class HttpConnectionTests { - private static readonly Version Windows8Version = new Version(6, 2); - - public class ConnectionLifecycle : LoggedTest + public class ConnectionLifecycle : VerifiableLoggedTest { public ConnectionLifecycle(ITestOutputHelper output) : base(output) { @@ -30,7 +28,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task CanStartStartedConnection() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { await WithConnectionAsync(CreateConnection(loggerFactory: loggerFactory), async (connection) => { @@ -43,7 +41,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task CanStartStartingConnection() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { await WithConnectionAsync( CreateConnection(loggerFactory: loggerFactory, transport: new TestTransport(onTransportStart: SyncPoint.Create(out var syncPoint))), @@ -63,7 +61,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task CannotStartConnectionOnceDisposed() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { await WithConnectionAsync( CreateConnection(loggerFactory: loggerFactory), @@ -85,7 +83,13 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [InlineData(3)] public async Task TransportThatFailsToStartFallsBack(int passThreshold) { - using (StartLog(out var loggerFactory)) + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HttpConnection).FullName && + writeContext.EventId.Name == "ErrorStartingTransport"; + } + + using (StartVerifableLog(out var loggerFactory, expectedErrorsFilter: ExpectedErrors)) { var startCounter = 0; var expected = new Exception("Transport failed to start"); @@ -130,7 +134,13 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task StartThrowsAfterAllTransportsFail() { - using (StartLog(out var loggerFactory)) + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HttpConnection).FullName && + writeContext.EventId.Name == "ErrorStartingTransport"; + } + + using (StartVerifableLog(out var loggerFactory, expectedErrorsFilter: ExpectedErrors)) { var startCounter = 0; var availableTransports = 3; @@ -165,7 +175,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task CanDisposeUnstartedConnection() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { await WithConnectionAsync( CreateConnection(loggerFactory: loggerFactory), @@ -180,7 +190,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task CanDisposeStartingConnection() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { await WithConnectionAsync( CreateConnection( @@ -214,7 +224,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task CanDisposeDisposingConnection() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { await WithConnectionAsync( CreateConnection( @@ -273,7 +283,13 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task TransportPipeIsCompletedWhenErrorOccursInTransport() { - using (StartLog(out var loggerFactory)) + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(LongPollingTransport).FullName && + writeContext.EventId.Name == "ErrorSending"; + } + + using (StartVerifableLog(out var loggerFactory, expectedErrorsFilter: ExpectedErrors)) { var httpHandler = new TestHttpMessageHandler(); @@ -286,6 +302,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests }); return longPollResult.Task; }); + httpHandler.OnLongPollDelete(cancellationToken => ResponseUtils.CreateResponse(HttpStatusCode.NoContent)); httpHandler.OnSocketSend((data, _) => { @@ -309,7 +326,13 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task SSEWontStartIfSuccessfulConnectionIsNotEstablished() { - using (StartLog(out var loggerFactory)) + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HttpConnection).FullName && + writeContext.EventId.Name == "ErrorStartingTransport"; + } + + using (StartVerifableLog(out var loggerFactory, expectedErrorsFilter: ExpectedErrors)) { var httpHandler = new TestHttpMessageHandler(); @@ -333,7 +356,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task SSEWaitsForResponseToStart() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var httpHandler = new TestHttpMessageHandler(); diff --git a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.Negotiate.cs b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.Negotiate.cs index 7d6ed721b2..68753a526d 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.Negotiate.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.Negotiate.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Http.Connections; using Microsoft.AspNetCore.Http.Connections.Client; using Microsoft.AspNetCore.Http.Connections.Client.Internal; +using Microsoft.AspNetCore.SignalR.Tests; using Moq; using Newtonsoft.Json; using Xunit; @@ -60,6 +61,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests var negotiateUrlTcs = new TaskCompletionSource(); testHttpHandler.OnLongPoll(cancellationToken => ResponseUtils.CreateResponse(HttpStatusCode.NoContent)); + testHttpHandler.OnLongPollDelete(cancellationToken => ResponseUtils.CreateResponse(HttpStatusCode.NoContent)); testHttpHandler.OnNegotiate((request, cancellationToken) => { negotiateUrlTcs.TrySetResult(request.RequestUri.ToString()); @@ -67,12 +69,15 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests ResponseUtils.CreateNegotiationContent()); }); - await WithConnectionAsync( - CreateConnection(testHttpHandler, url: requestedUrl), - async (connection) => - { - await connection.StartAsync(TransferFormat.Text).OrTimeout(); - }); + using (var noErrorScope = new VerifyNoErrorsScope()) + { + await WithConnectionAsync( + CreateConnection(testHttpHandler, url: requestedUrl, loggerFactory: noErrorScope.LoggerFactory), + async (connection) => + { + await connection.StartAsync(TransferFormat.Text).OrTimeout(); + }); + } Assert.Equal(expectedNegotiate, await negotiateUrlTcs.Task.OrTimeout()); } @@ -115,12 +120,15 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests transportFactory.Setup(t => t.CreateTransport(HttpTransportType.LongPolling)) .Returns(new TestTransport(transferFormat: TransferFormat.Text | TransferFormat.Binary)); - await WithConnectionAsync( - CreateConnection(testHttpHandler, transportFactory: transportFactory.Object), - async (connection) => - { - await connection.StartAsync(TransferFormat.Binary).OrTimeout(); - }); + using (var noErrorScope = new VerifyNoErrorsScope()) + { + await WithConnectionAsync( + CreateConnection(testHttpHandler, transportFactory: transportFactory.Object, loggerFactory: noErrorScope.LoggerFactory), + async (connection) => + { + await connection.StartAsync(TransferFormat.Binary).OrTimeout(); + }); + } } [Fact] diff --git a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.cs index ce4f4d4bc7..1c0719165c 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HttpConnectionTests.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Http.Connections; using Microsoft.AspNetCore.Http.Connections.Client; +using Microsoft.AspNetCore.SignalR.Tests; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Testing; @@ -19,7 +20,7 @@ using Xunit.Abstractions; namespace Microsoft.AspNetCore.SignalR.Client.Tests { - public partial class HttpConnectionTests : LoggedTest + public partial class HttpConnectionTests : VerifiableLoggedTest { public HttpConnectionTests(ITestOutputHelper output) : base(output) { diff --git a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HubConnectionTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HubConnectionTests.cs index 5f8abfe00b..99618d3e01 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HubConnectionTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HubConnectionTests.cs @@ -16,7 +16,7 @@ using Xunit.Abstractions; namespace Microsoft.AspNetCore.SignalR.Client.Tests { - public partial class HubConnectionTests : LoggedTest + public partial class HubConnectionTests : VerifiableLoggedTest { public HubConnectionTests(ITestOutputHelper output) : base(output) @@ -120,7 +120,13 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests [Fact] public async Task PendingInvocationsAreTerminatedIfServerTimeoutIntervalElapsesWithNoMessages() { - using (StartLog(out var loggerFactory, LogLevel.Trace)) + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HubConnection).FullName && + writeContext.EventId.Name == "ShutdownWithError"; + } + + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, expectedErrorsFilter: ExpectedErrors)) { var hubConnection = CreateHubConnection(new TestConnection(), loggerFactory: loggerFactory); hubConnection.ServerTimeout = TimeSpan.FromMilliseconds(2000); diff --git a/test/Microsoft.AspNetCore.SignalR.Client.Tests/ResponseUtils.cs b/test/Microsoft.AspNetCore.SignalR.Client.Tests/ResponseUtils.cs index a4d10977dc..c23b216ac2 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.Tests/ResponseUtils.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.Tests/ResponseUtils.cs @@ -43,6 +43,12 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests (request.RequestUri.PathAndQuery.Contains("?id=") || request.RequestUri.PathAndQuery.Contains("&id=")); } + public static bool IsLongPollDeleteRequest(HttpRequestMessage request) + { + return request.Method == HttpMethod.Delete && + (request.RequestUri.PathAndQuery.Contains("?id=") || request.RequestUri.PathAndQuery.Contains("&id=")); + } + public static bool IsSocketSendRequest(HttpRequestMessage request) { return request.Method == HttpMethod.Post && diff --git a/test/Microsoft.AspNetCore.SignalR.Client.Tests/TestHttpMessageHandler.cs b/test/Microsoft.AspNetCore.SignalR.Client.Tests/TestHttpMessageHandler.cs index 44be6be900..fc9a7e780b 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.Tests/TestHttpMessageHandler.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.Tests/TestHttpMessageHandler.cs @@ -124,6 +124,23 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests }); } + public void OnLongPollDelete(Func handler) => OnLongPollDelete((cancellationToken) => Task.FromResult(handler(cancellationToken))); + + public void OnLongPollDelete(Func> handler) + { + OnRequest((request, next, cancellationToken) => + { + if (ResponseUtils.IsLongPollDeleteRequest(request)) + { + return handler(cancellationToken); + } + else + { + return next(); + } + }); + } + public void OnLongPoll(Func handler) => OnLongPoll(cancellationToken => Task.FromResult(handler(cancellationToken))); public void OnLongPoll(Func> handler) diff --git a/test/Microsoft.AspNetCore.SignalR.Redis.Tests/RedisEndToEnd.cs b/test/Microsoft.AspNetCore.SignalR.Redis.Tests/RedisEndToEnd.cs index 06eaf9a40e..5f1ad5a929 100644 --- a/test/Microsoft.AspNetCore.SignalR.Redis.Tests/RedisEndToEnd.cs +++ b/test/Microsoft.AspNetCore.SignalR.Redis.Tests/RedisEndToEnd.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.SignalR.Redis.Tests } [Collection(EndToEndTestsCollection.Name)] - public class RedisEndToEndTests : LoggedTest + public class RedisEndToEndTests : VerifiableLoggedTest { private readonly RedisServerFixture _serverFixture; @@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.SignalR.Redis.Tests [MemberData(nameof(TransportTypesAndProtocolTypes))] public async Task HubConnectionCanSendAndReceiveMessages(HttpTransportType transportType, string protocolName) { - using (StartLog(out var loggerFactory, testName: + using (StartVerifableLog(out var loggerFactory, testName: $"{nameof(HubConnectionCanSendAndReceiveMessages)}_{transportType.ToString()}_{protocolName}")) { var protocol = HubProtocolHelpers.GetHubProtocol(protocolName); @@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.SignalR.Redis.Tests [MemberData(nameof(TransportTypesAndProtocolTypes))] public async Task HubConnectionCanSendAndReceiveGroupMessages(HttpTransportType transportType, string protocolName) { - using (StartLog(out var loggerFactory, testName: + using (StartVerifableLog(out var loggerFactory, testName: $"{nameof(HubConnectionCanSendAndReceiveGroupMessages)}_{transportType.ToString()}_{protocolName}")) { var protocol = HubProtocolHelpers.GetHubProtocol(protocolName); diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerFixture.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerFixture.cs index 51aa1a1502..462201fd75 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerFixture.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerFixture.cs @@ -144,65 +144,66 @@ namespace Microsoft.AspNetCore.SignalR.Tests return _loggerFactory.CreateLogger(categoryName); } } + } - // TestSink doesn't seem to be thread-safe :(. - private class LogSinkProvider : ILoggerProvider + // TestSink doesn't seem to be thread-safe :(. + internal class LogSinkProvider : ILoggerProvider + { + private readonly ConcurrentQueue _logs = new ConcurrentQueue(); + + public ILogger CreateLogger(string categoryName) { - private readonly ConcurrentQueue _logs = new ConcurrentQueue(); + return new LogSinkLogger(categoryName, this); + } - public ILogger CreateLogger(string categoryName) + public void Dispose() + { + } + + public IList GetLogs() => _logs.ToList(); + + public void Log(string categoryName, LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + var record = new LogRecord( + DateTime.Now, + new WriteContext() + { + LoggerName = categoryName, + LogLevel = logLevel, + EventId = eventId, + State = state, + Exception = exception, + Formatter = (o, e) => formatter((TState)o, e), + }); + _logs.Enqueue(record); + } + + private class LogSinkLogger : ILogger + { + private readonly string _categoryName; + private readonly LogSinkProvider _logSinkProvider; + + public LogSinkLogger(string categoryName, LogSinkProvider logSinkProvider) { - return new LogSinkLogger(categoryName, this); + _categoryName = categoryName; + _logSinkProvider = logSinkProvider; } - public void Dispose() + public IDisposable BeginScope(TState state) { + return null; } - public IList GetLogs() => _logs.ToList(); - - public void Log(string categoryName, LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + public bool IsEnabled(LogLevel logLevel) { - var record = new LogRecord( - DateTime.Now, - new WriteContext() - { - LoggerName = categoryName, - LogLevel = logLevel, - EventId = eventId, - State = state, - Exception = exception, - Formatter = (o, e) => formatter((TState)o, e), - }); - _logs.Enqueue(record); + return true; } - private class LogSinkLogger : ILogger + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { - private readonly string _categoryName; - private readonly LogSinkProvider _logSinkProvider; - - public LogSinkLogger(string categoryName, LogSinkProvider logSinkProvider) - { - _categoryName = categoryName; - _logSinkProvider = logSinkProvider; - } - - public IDisposable BeginScope(TState state) - { - return null; - } - - public bool IsEnabled(LogLevel logLevel) - { - return true; - } - - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) - { - _logSinkProvider.Log(_categoryName, logLevel, eventId, state, exception, formatter); - } + _logSinkProvider.Log(_categoryName, logLevel, eventId, state, exception, formatter); } } } + } diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifiableLoggedTest.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifiableLoggedTest.cs new file mode 100644 index 0000000000..1968f3bcdd --- /dev/null +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifiableLoggedTest.cs @@ -0,0 +1,34 @@ +// 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.Runtime.CompilerServices; +using System.Text; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Testing; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.SignalR.Tests +{ + public class VerifiableLoggedTest : LoggedTest + { + public VerifiableLoggedTest(ITestOutputHelper output) : base(output) + { + } + + public IDisposable StartVerifableLog(out ILoggerFactory loggerFactory, [CallerMemberName] string testName = null, Func expectedErrorsFilter = null) + { + var disposable = StartLog(out loggerFactory, testName); + + return new VerifyNoErrorsScope(loggerFactory, disposable, expectedErrorsFilter); + } + + public IDisposable StartVerifableLog(out ILoggerFactory loggerFactory, LogLevel minLogLevel, [CallerMemberName] string testName = null, Func expectedErrorsFilter = null) + { + var disposable = StartLog(out loggerFactory, minLogLevel, testName); + + return new VerifyNoErrorsScope(loggerFactory, disposable, expectedErrorsFilter); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifyNoErrorsScope.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifyNoErrorsScope.cs new file mode 100644 index 0000000000..c66862fedc --- /dev/null +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifyNoErrorsScope.cs @@ -0,0 +1,67 @@ +// 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.Linq; +using System.Text; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Testing; + +namespace Microsoft.AspNetCore.SignalR.Tests +{ + public class VerifyNoErrorsScope : IDisposable + { + private readonly IDisposable _wrappedDisposable; + private readonly Func _expectedErrorsFilter; + private readonly LogSinkProvider _sink; + + public ILoggerFactory LoggerFactory { get; } + + public VerifyNoErrorsScope(ILoggerFactory loggerFactory = null, IDisposable wrappedDisposable = null, Func expectedErrorsFilter = null) + { + _wrappedDisposable = wrappedDisposable; + _expectedErrorsFilter = expectedErrorsFilter; + _sink = new LogSinkProvider(); + + LoggerFactory = loggerFactory ?? new LoggerFactory(); + LoggerFactory.AddProvider(_sink); + } + + public void Dispose() + { + _wrappedDisposable?.Dispose(); + + var results = _sink.GetLogs().Where(w => w.Write.LogLevel >= LogLevel.Error).ToList(); + + if (_expectedErrorsFilter != null) + { + results = results.Where(w => !_expectedErrorsFilter(w.Write)).ToList(); + } + + if (results.Count > 0) + { + string errorMessage = $"{results.Count} error(s) logged."; + errorMessage += Environment.NewLine; + errorMessage += string.Join(Environment.NewLine, results.Select(record => + { + var r = record.Write; + + string lineMessage = r.LoggerName + " - " + r.EventId.ToString() + " - " + r.Formatter(r.State, r.Exception); + if (r.Exception != null) + { + lineMessage += Environment.NewLine; + lineMessage += "==================="; + lineMessage += Environment.NewLine; + lineMessage += r.Exception; + lineMessage += Environment.NewLine; + lineMessage += "==================="; + } + return lineMessage; + })); + + throw new Exception(errorMessage); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs b/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs index 614bec31b2..8c5096b319 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests } [Collection(EndToEndTestsCollection.Name)] - public class EndToEndTests : LoggedTest + public class EndToEndTests : VerifiableLoggedTest { private readonly ServerFixture _serverFixture; @@ -76,7 +76,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [MemberData(nameof(TransportTypes))] public async Task CanStartAndStopConnectionUsingGivenTransport(HttpTransportType transportType) { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var url = _serverFixture.Url + "/echo"; var connection = new HttpConnection(new Uri(url), transportType, loggerFactory); @@ -89,7 +89,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTest() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var logger = loggerFactory.CreateLogger(); @@ -126,7 +126,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsReceivesAndSendsPartialFramesTest() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var logger = loggerFactory.CreateLogger(); @@ -164,7 +164,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task HttpRequestsNotSentWhenWebSocketsTransportRequested() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var logger = loggerFactory.CreateLogger(); var url = _serverFixture.Url + "/echo"; @@ -212,7 +212,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [MemberData(nameof(TransportTypesAndTransferFormats))] public async Task ConnectionCanSendAndReceiveMessages(HttpTransportType transportType, TransferFormat requestedTransferFormat) { - using (StartLog(out var loggerFactory, minLogLevel: LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}_{requestedTransferFormat.ToString()}")) + using (StartVerifableLog(out var loggerFactory, minLogLevel: LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}_{requestedTransferFormat.ToString()}")) { var logger = loggerFactory.CreateLogger(); @@ -276,7 +276,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [MemberData(nameof(MessageSizesData))] public async Task ConnectionCanSendAndReceiveDifferentMessageSizesWebSocketsTransport(string message) { - using (StartLog(out var loggerFactory, LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveDifferentMessageSizesWebSocketsTransport_{message.Length}")) + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveDifferentMessageSizesWebSocketsTransport_{message.Length}")) { var logger = loggerFactory.CreateLogger(); @@ -318,7 +318,13 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task UnauthorizedWebSocketsConnectionDoesNotConnect() { - using (StartLog(out var loggerFactory, LogLevel.Trace)) + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HttpConnection).FullName && + writeContext.EventId.Name == "ErrorStartingTransport"; + } + + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, expectedErrorsFilter: ExpectedErrors)) { var logger = loggerFactory.CreateLogger(); @@ -351,7 +357,13 @@ namespace Microsoft.AspNetCore.SignalR.Tests [InlineData(HttpTransportType.ServerSentEvents)] public async Task UnauthorizedConnectionDoesNotConnect(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, LogLevel.Trace, testName: $"{nameof(UnauthorizedConnectionDoesNotConnect)}_{transportType}")) + bool ExpectedErrors(WriteContext writeContext) + { + return writeContext.LoggerName == typeof(HttpConnection).FullName && + writeContext.EventId.Name == "ErrorWithNegotiation"; + } + + using (StartVerifableLog(out var loggerFactory, LogLevel.Trace, testName: $"{nameof(UnauthorizedConnectionDoesNotConnect)}_{transportType}", expectedErrorsFilter: ExpectedErrors)) { var logger = loggerFactory.CreateLogger(); @@ -408,7 +420,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests private async Task ServerClosesConnectionWithErrorIfHubCannotBeCreated(HttpTransportType transportType) { - using (StartLog(out var loggerFactory, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}")) + using (StartVerifableLog(out var loggerFactory, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}")) { var logger = loggerFactory.CreateLogger(); diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/WebSocketsTransportTests.cs b/test/Microsoft.AspNetCore.SignalR.Tests/WebSocketsTransportTests.cs index 6d9767167b..18c3d64437 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/WebSocketsTransportTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/WebSocketsTransportTests.cs @@ -22,7 +22,7 @@ using Xunit.Abstractions; namespace Microsoft.AspNetCore.SignalR.Tests { [Collection(EndToEndTestsCollection.Name)] - public class WebSocketsTransportTests : LoggedTest + public class WebSocketsTransportTests : VerifiableLoggedTest { private readonly ServerFixture _serverFixture; @@ -67,7 +67,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportStopsSendAndReceiveLoopsWhenTransportIsStopped() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory); await webSocketsTransport.StartAsync(new Uri(_serverFixture.WebSocketsUrl + "/echo"), @@ -81,7 +81,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportSendsUserAgent() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory); await webSocketsTransport.StartAsync(new Uri(_serverFixture.WebSocketsUrl + "/httpheader"), @@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportSendsXRequestedWithHeader() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory); await webSocketsTransport.StartAsync(new Uri(_serverFixture.WebSocketsUrl + "/httpheader"), @@ -132,7 +132,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportStopsWhenConnectionChannelClosed() { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory); await webSocketsTransport.StartAsync(new Uri(_serverFixture.WebSocketsUrl + "/echo"), @@ -148,7 +148,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [InlineData(TransferFormat.Binary)] public async Task WebSocketsTransportStopsWhenConnectionClosedByTheServer(TransferFormat transferFormat) { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory); await webSocketsTransport.StartAsync(new Uri(_serverFixture.WebSocketsUrl + "/echoAndClose"), transferFormat); @@ -170,7 +170,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [InlineData(TransferFormat.Binary)] public async Task WebSocketsTransportSetsTransferFormat(TransferFormat transferFormat) { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory); @@ -188,7 +188,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportThrowsForInvalidTransferFormat(TransferFormat transferFormat) { - using (StartLog(out var loggerFactory)) + using (StartVerifableLog(out var loggerFactory)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory); var exception = await Assert.ThrowsAsync(() =>