From ffd4bcd850b3d842c3b8e9efe794d6561dabc914 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 6 Nov 2018 09:33:15 -0800 Subject: [PATCH] Server per test (#3253) --- .../HubConnectionTests.cs | 139 +++++++++--------- .../HubProtocolVersionTests.cs | 24 ++- .../RedisServerFixture.cs | 8 +- .../RedisServerFixture.cs | 8 +- ...verLoggedTest.cs => FunctionalTestBase.cs} | 42 +++--- ...erverFixture.cs => InProcessTestServer.cs} | 17 +-- .../ServerLogScope.cs | 4 +- .../EndToEndTests.cs | 61 ++++---- .../WebSocketsTransportTests.cs | 28 ++-- 9 files changed, 164 insertions(+), 167 deletions(-) rename test/Microsoft.AspNetCore.SignalR.Tests.Utils/{VerifiableServerLoggedTest.cs => FunctionalTestBase.cs} (51%) rename test/Microsoft.AspNetCore.SignalR.Tests.Utils/{ServerFixture.cs => InProcessTestServer.cs} (91%) diff --git a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs index 0fe68b0589..28c90e5445 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs @@ -22,23 +22,24 @@ using Xunit.Abstractions; namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests { - // Disable running server tests in parallel so server logs can accurately be captured per test - [CollectionDefinition(Name, DisableParallelization = true)] - public class HubConnectionTestsCollection : ICollectionFixture> + public class HubConnectionTestsCollection : ICollectionFixture> { public const string Name = nameof(HubConnectionTestsCollection); } [Collection(HubConnectionTestsCollection.Name)] - public class HubConnectionTests : VerifiableServerLoggedTest + public class HubConnectionTests : FunctionalTestBase { - private const string DefaultHubDispatcherLoggerName = "SERVER Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher"; + private const string DefaultHubDispatcherLoggerName = "Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher"; - public HubConnectionTests(ServerFixture serverFixture, ITestOutputHelper output) : base(serverFixture, output) + // Pass null for server fixture as tests should provide their own + // This is to prevent logs from previous tests affecting running tests + public HubConnectionTests(ITestOutputHelper output) : base(output) { } private HubConnection CreateHubConnection( + string url, string path = null, HttpTransportType? transportType = null, IHubProtocol protocol = null, @@ -49,18 +50,18 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests hubConnectionBuilder.WithLoggerFactory(loggerFactory); var delegateConnectionFactory = new DelegateConnectionFactory( - GetHttpConnectionFactory(loggerFactory, path, transportType ?? HttpTransportType.LongPolling | HttpTransportType.WebSockets | HttpTransportType.ServerSentEvents), + GetHttpConnectionFactory(url, loggerFactory, path, transportType ?? HttpTransportType.LongPolling | HttpTransportType.WebSockets | HttpTransportType.ServerSentEvents), connection => ((HttpConnection)connection).DisposeAsync()); hubConnectionBuilder.Services.AddSingleton(delegateConnectionFactory); return hubConnectionBuilder.Build(); } - private Func> GetHttpConnectionFactory(ILoggerFactory loggerFactory, string path, HttpTransportType transportType) + private Func> GetHttpConnectionFactory(string url, ILoggerFactory loggerFactory, string path, HttpTransportType transportType) { return async format => { - var connection = new HttpConnection(new Uri(ServerFixture.Url + path), transportType, loggerFactory); + var connection = new HttpConnection(new Uri(url + path), transportType, loggerFactory); await connection.StartAsync(format); return connection; }; @@ -71,11 +72,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CheckFixedMessage(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(CheckFixedMessage)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(CheckFixedMessage)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var connectionBuilder = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + path, transportType); + .WithUrl(fixture.Url + path, transportType); connectionBuilder.Services.AddSingleton(protocol); var connection = connectionBuilder.Build(); @@ -105,10 +106,10 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanSendAndReceiveMessage(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(CanSendAndReceiveMessage)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(CanSendAndReceiveMessage)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { const string originalMessage = "SignalR"; - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -134,10 +135,10 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanStopAndStartConnection(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStopAndStartConnection)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, LogLevel.Trace, $"{nameof(CanStopAndStartConnection)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { const string originalMessage = "SignalR"; - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -165,12 +166,12 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanStartConnectionFromClosedEvent(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStartConnectionFromClosedEvent)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, LogLevel.Trace, $"{nameof(CanStartConnectionFromClosedEvent)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { var logger = loggerFactory.CreateLogger(); const string originalMessage = "SignalR"; - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); var restartTcs = new TaskCompletionSource(); connection.Closed += async e => { @@ -227,10 +228,10 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task MethodsAreCaseInsensitive(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(MethodsAreCaseInsensitive)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(MethodsAreCaseInsensitive)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { const string originalMessage = "SignalR"; - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -256,11 +257,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanInvokeClientMethodFromServer(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanInvokeClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, LogLevel.Trace, $"{nameof(CanInvokeClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { const string originalMessage = "SignalR"; - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -289,9 +290,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task InvokeNonExistantClientMethodFromServer(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(InvokeNonExistantClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, LogLevel.Trace, $"{nameof(InvokeNonExistantClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); var closeTcs = new TaskCompletionSource(); connection.Closed += e => { @@ -330,9 +331,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanStreamClientMethodFromServer(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanStreamClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, LogLevel.Trace, $"{nameof(CanStreamClientMethodFromServer)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -359,9 +360,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task CanCloseStreamMethodEarly(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(CanCloseStreamMethodEarly)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, LogLevel.Trace, $"{nameof(CanCloseStreamMethodEarly)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -399,9 +400,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests public async Task StreamDoesNotStartIfTokenAlreadyCanceled(string protocolName, HttpTransportType transportType, string path) { var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(StreamDoesNotStartIfTokenAlreadyCanceled)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) + using (StartServer(out var loggerFactory, out var fixture, LogLevel.Trace, $"{nameof(StreamDoesNotStartIfTokenAlreadyCanceled)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}")) { - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -434,9 +435,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var protocol = HubProtocols[protocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ExceptionFromStreamingSentToClient)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ExceptionFromStreamingSentToClient)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(path, transportType, protocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -468,9 +469,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfHubMethodCannotBeResolved)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionIfHubMethodCannotBeResolved)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -501,9 +502,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfHubMethodCannotBeResolvedAndArgumentsPassedIn)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionIfHubMethodCannotBeResolvedAndArgumentsPassedIn)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -534,9 +535,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnHubMethodArgumentCountMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionOnHubMethodArgumentCountMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -567,9 +568,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnHubMethodArgumentTypeMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionOnHubMethodArgumentTypeMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -600,9 +601,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfStreamingHubMethodCannotBeResolved)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionIfStreamingHubMethodCannotBeResolved)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -634,10 +635,10 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnStreamingHubMethodArgumentCountMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionOnStreamingHubMethodArgumentCountMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { loggerFactory.AddConsole(LogLevel.Trace); - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -669,9 +670,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionOnStreamingHubMethodArgumentTypeMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionOnStreamingHubMethodArgumentTypeMismatch)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -703,9 +704,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfNonStreamMethodInvokedWithStreamAsync)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionIfNonStreamMethodInvokedWithStreamAsync)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -736,9 +737,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfStreamMethodInvokedWithInvoke)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionIfStreamMethodInvokedWithInvoke)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -769,9 +770,9 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } var hubProtocol = HubProtocols[hubProtocolName]; - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfBuildingAsyncEnumeratorIsNotPossible)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ServerThrowsHubExceptionIfBuildingAsyncEnumeratorIsNotPossible)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors)) { - var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory); + var connection = CreateHubConnection(fixture.Url, hubPath, transportType, hubProtocol, loggerFactory); try { await connection.StartAsync().OrTimeout(); @@ -795,18 +796,18 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task ClientCanUseJwtBearerTokenForAuthentication(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ClientCanUseJwtBearerTokenForAuthentication)}_{transportType}")) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ClientCanUseJwtBearerTokenForAuthentication)}_{transportType}")) { async Task AccessTokenProvider() { - var httpResponse = await new HttpClient().GetAsync(ServerFixture.Url + "/generateJwtToken"); + var httpResponse = await new HttpClient().GetAsync(fixture.Url + "/generateJwtToken"); httpResponse.EnsureSuccessStatusCode(); return await httpResponse.Content.ReadAsStringAsync(); }; var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/authorizedhub", transportType, options => + .WithUrl(fixture.Url + "/authorizedhub", transportType, options => { options.AccessTokenProvider = AccessTokenProvider; }) @@ -833,11 +834,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task ClientCanUseJwtBearerTokenForAuthenticationWhenRedirected(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ClientCanUseJwtBearerTokenForAuthenticationWhenRedirected)}_{transportType}")) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ClientCanUseJwtBearerTokenForAuthenticationWhenRedirected)}_{transportType}")) { var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/redirect", transportType) + .WithUrl(fixture.Url + "/redirect", transportType) .Build(); try { @@ -861,11 +862,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task ClientCanSendHeaders(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ClientCanSendHeaders)}_{transportType}")) + using (StartServer(out var loggerFactory, out var fixture, $"{nameof(ClientCanSendHeaders)}_{transportType}")) { var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/default", transportType, options => + .WithUrl(fixture.Url + "/default", transportType, options => { options.Headers["X-test"] = "42"; options.Headers["X-42"] = "test"; @@ -893,15 +894,15 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [WebSocketsSupportedCondition] public async Task WebSocketOptionsAreApplied() { - using (StartVerifiableLog(out var loggerFactory, $"{nameof(WebSocketOptionsAreApplied)}")) + using (StartServer(out var loggerFactory, out var fixture, $"{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(); - cookieJar.Add(new System.Net.Cookie("Foo", "Bar", "/", new Uri(ServerFixture.Url).Host)); + cookieJar.Add(new System.Net.Cookie("Foo", "Bar", "/", new Uri(fixture.Url).Host)); var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/default", HttpTransportType.WebSockets, options => + .WithUrl(fixture.Url + "/default", HttpTransportType.WebSockets, options => { options.WebSocketConfiguration = o => o.Cookies = cookieJar; }) @@ -927,11 +928,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [Fact] public async Task CheckHttpConnectionFeatures() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var fixture)) { var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/default") + .WithUrl(fixture.Url + "/default") .Build(); try { @@ -963,11 +964,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [Fact] public async Task UserIdProviderCanAccessHttpContext() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var fixture)) { var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/default", options => + .WithUrl(fixture.Url + "/default", options => { options.Headers.Add(HeaderUserIdProvider.HeaderName, "SuperAdmin"); }) @@ -994,12 +995,12 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [Fact] public async Task NegotiationSkipsServerSentEventsWhenUsingBinaryProtocol() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var fixture)) { var hubConnectionBuilder = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) .AddMessagePackProtocol() - .WithUrl(ServerFixture.Url + "/default-nowebsockets"); + .WithUrl(fixture.Url + "/default-nowebsockets"); var hubConnection = hubConnectionBuilder.Build(); try @@ -1024,12 +1025,12 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [Fact] public async Task StopCausesPollToReturnImmediately() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var fixture)) { PollTrackingMessageHandler pollTracker = null; var hubConnection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/default", options => + .WithUrl(fixture.Url + "/default", options => { options.Transports = HttpTransportType.LongPolling; options.HttpMessageHandlerFactory = handler => diff --git a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubProtocolVersionTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubProtocolVersionTests.cs index 5e6b7a8295..47b6ff6229 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubProtocolVersionTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubProtocolVersionTests.cs @@ -23,17 +23,15 @@ using Xunit.Abstractions; namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests { - // Disable running server tests in parallel so server logs can accurately be captured per test - [CollectionDefinition(Name, DisableParallelization = true)] - public class HubProtocolVersionTestsCollection : ICollectionFixture> + public class HubProtocolVersionTestsCollection : ICollectionFixture> { public const string Name = nameof(HubProtocolVersionTestsCollection); } [Collection(HubProtocolVersionTestsCollection.Name)] - public class HubProtocolVersionTests : VerifiableServerLoggedTest + public class HubProtocolVersionTests : FunctionalTestBase { - public HubProtocolVersionTests(ServerFixture serverFixture, ITestOutputHelper output) : base(serverFixture, output) + public HubProtocolVersionTests(ITestOutputHelper output) : base(output) { } @@ -41,11 +39,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task ClientUsingOldCallWithOriginalProtocol(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ClientUsingOldCallWithOriginalProtocol)}_{transportType}")) + using (StartServer(out var loggerFactory, out var server, $"{nameof(ClientUsingOldCallWithOriginalProtocol)}_{transportType}")) { var connectionBuilder = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/version", transportType); + .WithUrl(server.Url + "/version", transportType); var connection = connectionBuilder.Build(); @@ -73,11 +71,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task ClientUsingOldCallWithNewProtocol(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ClientUsingOldCallWithNewProtocol)}_{transportType}")) + using (StartServer(out var loggerFactory, out var server, $"{nameof(ClientUsingOldCallWithNewProtocol)}_{transportType}")) { var connectionBuilder = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/version", transportType); + .WithUrl(server.Url + "/version", transportType); connectionBuilder.Services.AddSingleton(new VersionedJsonHubProtocol(1000)); var connection = connectionBuilder.Build(); @@ -106,11 +104,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests [MemberData(nameof(TransportTypes))] public async Task ClientUsingNewCallWithNewProtocol(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory, $"{nameof(ClientUsingNewCallWithNewProtocol)}_{transportType}")) + using (StartServer(out var loggerFactory, out var server, $"{nameof(ClientUsingNewCallWithNewProtocol)}_{transportType}")) { var httpConnectionFactory = new HttpConnectionFactory(Options.Create(new HttpConnectionOptions { - Url = new Uri(ServerFixture.Url + "/version"), + Url = new Uri(server.Url + "/version"), Transports = transportType }), loggerFactory); var tcs = new TaskCompletionSource(); @@ -168,11 +166,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests return writeContext.LoggerName == typeof(HubConnection).FullName; } - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, $"{nameof(ClientWithUnsupportedProtocolVersionDoesNotConnect)}_{transportType}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var server, LogLevel.Trace, $"{nameof(ClientWithUnsupportedProtocolVersionDoesNotConnect)}_{transportType}", expectedErrorsFilter: ExpectedErrors)) { var connectionBuilder = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) - .WithUrl(ServerFixture.Url + "/version", transportType); + .WithUrl(server.Url + "/version", transportType); connectionBuilder.Services.AddSingleton(new VersionedJsonHubProtocol(int.MaxValue)); var connection = connectionBuilder.Build(); diff --git a/test/Microsoft.AspNetCore.SignalR.Redis.Tests/RedisServerFixture.cs b/test/Microsoft.AspNetCore.SignalR.Redis.Tests/RedisServerFixture.cs index e2fab22665..37f510a6af 100644 --- a/test/Microsoft.AspNetCore.SignalR.Redis.Tests/RedisServerFixture.cs +++ b/test/Microsoft.AspNetCore.SignalR.Redis.Tests/RedisServerFixture.cs @@ -11,8 +11,8 @@ namespace Microsoft.AspNetCore.SignalR.Redis.Tests public class RedisServerFixture : IDisposable where TStartup : class { - public ServerFixture FirstServer { get; private set; } - public ServerFixture SecondServer { get; private set; } + public InProcessTestServer FirstServer { get; private set; } + public InProcessTestServer SecondServer { get; private set; } private readonly ILogger _logger; private readonly ILoggerFactory _loggerFactory; @@ -37,11 +37,11 @@ namespace Microsoft.AspNetCore.SignalR.Redis.Tests SecondServer = StartServer(); } - private ServerFixture StartServer() + private InProcessTestServer StartServer() { try { - return new ServerFixture(_loggerFactory); + return new InProcessTestServer(_loggerFactory); } catch (Exception ex) { diff --git a/test/Microsoft.AspNetCore.SignalR.StackExchangeRedis.Tests/RedisServerFixture.cs b/test/Microsoft.AspNetCore.SignalR.StackExchangeRedis.Tests/RedisServerFixture.cs index 0d0da42680..a498682567 100644 --- a/test/Microsoft.AspNetCore.SignalR.StackExchangeRedis.Tests/RedisServerFixture.cs +++ b/test/Microsoft.AspNetCore.SignalR.StackExchangeRedis.Tests/RedisServerFixture.cs @@ -11,8 +11,8 @@ namespace Microsoft.AspNetCore.SignalR.StackExchangeRedis.Tests public class RedisServerFixture : IDisposable where TStartup : class { - public ServerFixture FirstServer { get; private set; } - public ServerFixture SecondServer { get; private set; } + public InProcessTestServer FirstServer { get; private set; } + public InProcessTestServer SecondServer { get; private set; } private readonly ILogger _logger; private readonly ILoggerFactory _loggerFactory; @@ -37,11 +37,11 @@ namespace Microsoft.AspNetCore.SignalR.StackExchangeRedis.Tests SecondServer = StartServer(); } - private ServerFixture StartServer() + private InProcessTestServer StartServer() { try { - return new ServerFixture(_loggerFactory); + return new InProcessTestServer(_loggerFactory); } catch (Exception ex) { diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifiableServerLoggedTest.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/FunctionalTestBase.cs similarity index 51% rename from test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifiableServerLoggedTest.cs rename to test/Microsoft.AspNetCore.SignalR.Tests.Utils/FunctionalTestBase.cs index b8fda0f0e2..023f3b90b2 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/VerifiableServerLoggedTest.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/FunctionalTestBase.cs @@ -2,26 +2,20 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Net.Http; -using System.Net.WebSockets; +using System.Collections.Generic; using System.Runtime.CompilerServices; -using System.Threading; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; using Xunit.Abstractions; namespace Microsoft.AspNetCore.SignalR.Tests { - public class VerifiableServerLoggedTest : VerifiableLoggedTest + public class FunctionalTestBase : VerifiableLoggedTest { private readonly Func _globalExpectedErrorsFilter; - public ServerFixture ServerFixture { get; } - - public VerifiableServerLoggedTest(ServerFixture serverFixture, ITestOutputHelper output) : base(output) + public FunctionalTestBase(ITestOutputHelper output) : base(output) { - ServerFixture = serverFixture; - // Suppress errors globally here _globalExpectedErrorsFilter = (writeContext) => false; } @@ -44,25 +38,35 @@ namespace Microsoft.AspNetCore.SignalR.Tests }; } - public override IDisposable StartVerifiableLog(out ILoggerFactory loggerFactory, LogLevel minLogLevel, [CallerMemberName] string testName = null, Func expectedErrorsFilter = null) + public IDisposable StartServer(out ILoggerFactory loggerFactory, out InProcessTestServer testServer, LogLevel minLogLevel, [CallerMemberName] string testName = null, Func expectedErrorsFilter = null) where T : class { var disposable = base.StartVerifiableLog(out loggerFactory, minLogLevel, testName, ResolveExpectedErrorsFilter(expectedErrorsFilter)); - return new ServerLogScope(ServerFixture, loggerFactory, disposable); + testServer = new InProcessTestServer(loggerFactory); + return new MultiDisposable(testServer, disposable); } - public override IDisposable StartVerifiableLog(out ILoggerFactory loggerFactory, [CallerMemberName] string testName = null, Func expectedErrorsFilter = null) + public IDisposable StartServer(out ILoggerFactory loggerFactory, out InProcessTestServer testServer, [CallerMemberName] string testName = null, Func expectedErrorsFilter = null) where T : class { var disposable = base.StartVerifiableLog(out loggerFactory, testName, ResolveExpectedErrorsFilter(expectedErrorsFilter)); - return new ServerLogScope(ServerFixture, loggerFactory, disposable); + testServer = new InProcessTestServer(loggerFactory); + return new MultiDisposable(testServer, disposable); } - public override void Dispose() + private class MultiDisposable : IDisposable { - // Unit tests in a fixture reuse the server. - // A small delay prevents server logging from a previous tests from showing up in the next test's logs - // by giving the server time to finish any in-progress request logic. - Thread.Sleep(TimeSpan.FromMilliseconds(100)); - base.Dispose(); + List _disposables; + public MultiDisposable(params IDisposable[] disposables) + { + _disposables = new List(disposables); + } + + public void Dispose() + { + foreach (var disposable in _disposables) + { + disposable.Dispose(); + } + } } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerFixture.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/InProcessTestServer.cs similarity index 91% rename from test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerFixture.cs rename to test/Microsoft.AspNetCore.SignalR.Tests.Utils/InProcessTestServer.cs index 1304ceec0a..6723915cd1 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerFixture.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/InProcessTestServer.cs @@ -5,20 +5,17 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net; -using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting.Server.Features; -using Microsoft.AspNetCore.Server.Kestrel.Core.Internal; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; namespace Microsoft.AspNetCore.SignalR.Tests { - public abstract class ServerFixture : IDisposable + public abstract class InProcessTestServer : IDisposable { internal abstract event Action ServerLogged; @@ -29,7 +26,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests public abstract void Dispose(); } - public class ServerFixture : ServerFixture + public class InProcessTestServer : InProcessTestServer where TStartup : class { private readonly ILoggerFactory _loggerFactory; @@ -51,19 +48,19 @@ namespace Microsoft.AspNetCore.SignalR.Tests public override string Url => _url; - public ServerFixture() : this(loggerFactory: null) + public InProcessTestServer() : this(loggerFactory: null) { } - public ServerFixture(ILoggerFactory loggerFactory) + public InProcessTestServer(ILoggerFactory loggerFactory) { _logSinkProvider = new LogSinkProvider(); if (loggerFactory == null) { var testLog = AssemblyTestLog.ForAssembly(typeof(TStartup).Assembly); - _logToken = testLog.StartTestLog(null, $"{nameof(ServerFixture)}_{typeof(TStartup).Name}", - out _loggerFactory, nameof(ServerFixture)); + _logToken = testLog.StartTestLog(null, $"{nameof(InProcessTestServer)}_{typeof(TStartup).Name}", + out _loggerFactory, nameof(InProcessTestServer)); } else { @@ -72,7 +69,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests _loggerFactory = new WrappingLoggerFactory(_loggerFactory); _loggerFactory.AddProvider(_logSinkProvider); - _logger = _loggerFactory.CreateLogger>(); + _logger = _loggerFactory.CreateLogger>(); StartServer(); } diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs index 37d9e6fb0e..78cc3b9961 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests { public class ServerLogScope : IDisposable { - private readonly ServerFixture _serverFixture; + private readonly InProcessTestServer _serverFixture; private readonly ILoggerFactory _loggerFactory; private readonly IDisposable _wrappedDisposable; private readonly ConcurrentDictionary _serverLoggers; @@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests private readonly object _lock; private bool _disposed; - public ServerLogScope(ServerFixture serverFixture, ILoggerFactory loggerFactory, IDisposable wrappedDisposable) + public ServerLogScope(InProcessTestServer serverFixture, ILoggerFactory loggerFactory, IDisposable wrappedDisposable) { _loggerFactory = loggerFactory; _serverFixture = serverFixture; diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs b/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs index fc91abb899..786608fcf7 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.IO.Pipelines; using System.Net.Http; using System.Net.WebSockets; -using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -27,26 +26,24 @@ using HttpConnectionOptions = Microsoft.AspNetCore.Http.Connections.Client.HttpC namespace Microsoft.AspNetCore.SignalR.Tests { - // Disable running server tests in parallel so server logs can accurately be captured per test - [CollectionDefinition(Name, DisableParallelization = true)] - public class EndToEndTestsCollection : ICollectionFixture> + public class EndToEndTestsCollection : ICollectionFixture> { public const string Name = nameof(EndToEndTestsCollection); } [Collection(EndToEndTestsCollection.Name)] - public class EndToEndTests : VerifiableServerLoggedTest + public class EndToEndTests : FunctionalTestBase { - public EndToEndTests(ServerFixture serverFixture, ITestOutputHelper output) : base(serverFixture, output) + public EndToEndTests(ITestOutputHelper output) : base(output) { } [Fact] public async Task CanStartAndStopConnectionUsingDefaultTransport() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { - var url = ServerFixture.Url + "/echo"; + var url = server.Url + "/echo"; // The test should connect to the server using WebSockets transport on Windows 8 and newer. // On Windows 7/2008R2 it should use ServerSentEvents transport to connect to the server. var connection = new HttpConnection(new Uri(url), HttpTransports.All, loggerFactory); @@ -64,9 +61,9 @@ namespace Microsoft.AspNetCore.SignalR.Tests writeContext.EventId.Name == "ErrorStartingTransport"; } - using (StartVerifiableLog(out var loggerFactory, expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var server, expectedErrorsFilter: ExpectedErrors)) { - var url = ServerFixture.Url + "/echo"; + var url = server.Url + "/echo"; // The test should connect to the server using WebSockets transport on Windows 8 and newer. // On Windows 7/2008R2 it should use ServerSentEvents transport to connect to the server. @@ -81,9 +78,9 @@ namespace Microsoft.AspNetCore.SignalR.Tests [MemberData(nameof(TransportTypes))] public async Task CanStartAndStopConnectionUsingGivenTransport(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory, minLogLevel: LogLevel.Trace, testName: $"CanStartAndStopConnectionUsingGivenTransport_{transportType}")) + using (StartServer(out var loggerFactory, out var server, minLogLevel: LogLevel.Trace, testName: $"CanStartAndStopConnectionUsingGivenTransport_{transportType}")) { - var url = ServerFixture.Url + "/echo"; + var url = server.Url + "/echo"; var connection = new HttpConnection(new Uri(url), transportType, loggerFactory); await connection.StartAsync(TransferFormat.Text).OrTimeout(); await connection.DisposeAsync().OrTimeout(); @@ -94,14 +91,14 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTest() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var logger = loggerFactory.CreateLogger(); const string message = "Hello, World!"; using (var ws = new ClientWebSocket()) { - var socketUrl = ServerFixture.WebSocketsUrl + "/echo"; + var socketUrl = server.WebSocketsUrl + "/echo"; logger.LogInformation("Connecting WebSocket to {socketUrl}", socketUrl); await ws.ConnectAsync(new Uri(socketUrl), CancellationToken.None).OrTimeout(); @@ -132,14 +129,14 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsReceivesAndSendsPartialFramesTest() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var logger = loggerFactory.CreateLogger(); const string message = "Hello, World!"; using (var ws = new ClientWebSocket()) { - var socketUrl = ServerFixture.WebSocketsUrl + "/echo"; + var socketUrl = server.WebSocketsUrl + "/echo"; logger.LogInformation("Connecting WebSocket to {socketUrl}", socketUrl); await ws.ConnectAsync(new Uri(socketUrl), CancellationToken.None).OrTimeout(); @@ -171,10 +168,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task HttpRequestsNotSentWhenWebSocketsTransportRequestedAndSkipNegotiationSet() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var logger = loggerFactory.CreateLogger(); - var url = ServerFixture.Url + "/echo"; + var url = server.Url + "/echo"; var mockHttpHandler = new Mock(); mockHttpHandler.Protected() @@ -221,10 +218,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests [InlineData(HttpTransportType.ServerSentEvents)] public async Task HttpConnectionThrowsIfSkipNegotiationSetAndTransportIsNotWebSockets(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var logger = loggerFactory.CreateLogger(); - var url = ServerFixture.Url + "/echo"; + var url = server.Url + "/echo"; var mockHttpHandler = new Mock(); mockHttpHandler.Protected() @@ -263,13 +260,13 @@ namespace Microsoft.AspNetCore.SignalR.Tests [MemberData(nameof(TransportTypesAndTransferFormats))] public async Task ConnectionCanSendAndReceiveMessages(HttpTransportType transportType, TransferFormat requestedTransferFormat) { - using (StartVerifiableLog(out var loggerFactory, minLogLevel: LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}_{requestedTransferFormat.ToString()}")) + using (StartServer(out var loggerFactory, out var server, minLogLevel: LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}_{requestedTransferFormat.ToString()}")) { var logger = loggerFactory.CreateLogger(); const string message = "Major Key"; - var url = ServerFixture.Url + "/echo"; + var url = server.Url + "/echo"; var connection = new HttpConnection(new Uri(url), transportType, loggerFactory); try { @@ -327,11 +324,11 @@ namespace Microsoft.AspNetCore.SignalR.Tests [MemberData(nameof(MessageSizesData))] public async Task ConnectionCanSendAndReceiveDifferentMessageSizesWebSocketsTransport(string message) { - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveDifferentMessageSizesWebSocketsTransport_{message.Length}")) + using (StartServer(out var loggerFactory, out var server, LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveDifferentMessageSizesWebSocketsTransport_{message.Length}")) { var logger = loggerFactory.CreateLogger(); - var url = ServerFixture.Url + "/echo"; + var url = server.Url + "/echo"; var connection = new HttpConnection(new Uri(url), HttpTransportType.WebSockets, loggerFactory); try @@ -375,11 +372,11 @@ namespace Microsoft.AspNetCore.SignalR.Tests writeContext.EventId.Name == "ErrorWithNegotiation"; } - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var server, LogLevel.Trace, expectedErrorsFilter: ExpectedErrors)) { var logger = loggerFactory.CreateLogger(); - var url = ServerFixture.Url + "/auth"; + var url = server.Url + "/auth"; var connection = new HttpConnection(new Uri(url), HttpTransportType.WebSockets, loggerFactory); var exception = await Assert.ThrowsAsync(() => connection.StartAsync(TransferFormat.Binary).OrTimeout()); @@ -398,11 +395,11 @@ namespace Microsoft.AspNetCore.SignalR.Tests writeContext.EventId.Name == "ErrorStartingTransport"; } - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var server, LogLevel.Trace, expectedErrorsFilter: ExpectedErrors)) { var logger = loggerFactory.CreateLogger(); - var url = ServerFixture.Url + "/auth"; + var url = server.Url + "/auth"; var options = new HttpConnectionOptions { Url = new Uri(url), @@ -427,11 +424,11 @@ namespace Microsoft.AspNetCore.SignalR.Tests writeContext.EventId.Name == "ErrorWithNegotiation"; } - using (StartVerifiableLog(out var loggerFactory, LogLevel.Trace, testName: $"{nameof(UnauthorizedConnectionDoesNotConnect)}_{transportType}", expectedErrorsFilter: ExpectedErrors)) + using (StartServer(out var loggerFactory, out var server, LogLevel.Trace, testName: $"{nameof(UnauthorizedConnectionDoesNotConnect)}_{transportType}", expectedErrorsFilter: ExpectedErrors)) { var logger = loggerFactory.CreateLogger(); - var url = ServerFixture.Url + "/auth"; + var url = server.Url + "/auth"; var connection = new HttpConnection(new Uri(url), transportType, loggerFactory); try @@ -484,11 +481,11 @@ namespace Microsoft.AspNetCore.SignalR.Tests private async Task ServerClosesConnectionWithErrorIfHubCannotBeCreated(HttpTransportType transportType) { - using (StartVerifiableLog(out var loggerFactory, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}")) + using (StartServer(out var loggerFactory, out var server, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}")) { var logger = loggerFactory.CreateLogger(); - var url = ServerFixture.Url + "/uncreatable"; + var url = server.Url + "/uncreatable"; var connection = new HubConnectionBuilder() .WithLoggerFactory(loggerFactory) .WithUrl(url, transportType) diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/WebSocketsTransportTests.cs b/test/Microsoft.AspNetCore.SignalR.Tests/WebSocketsTransportTests.cs index 4c8bf6d6f3..b8337cabf7 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/WebSocketsTransportTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/WebSocketsTransportTests.cs @@ -20,9 +20,9 @@ using Xunit.Abstractions; namespace Microsoft.AspNetCore.SignalR.Tests { [Collection(EndToEndTestsCollection.Name)] - public class WebSocketsTransportTests : VerifiableServerLoggedTest + public class WebSocketsTransportTests : FunctionalTestBase { - public WebSocketsTransportTests(ServerFixture serverFixture, ITestOutputHelper output) : base(serverFixture, output) + public WebSocketsTransportTests(ITestOutputHelper output) : base(output) { } @@ -57,10 +57,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportStopsSendAndReceiveLoopsWhenTransportIsStopped() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory, accessTokenProvider: null); - await webSocketsTransport.StartAsync(new Uri(ServerFixture.WebSocketsUrl + "/echo"), + await webSocketsTransport.StartAsync(new Uri(server.WebSocketsUrl + "/echo"), TransferFormat.Binary).OrTimeout(); await webSocketsTransport.StopAsync().OrTimeout(); await webSocketsTransport.Running.OrTimeout(); @@ -71,10 +71,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportSendsUserAgent() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory, accessTokenProvider: null); - await webSocketsTransport.StartAsync(new Uri(ServerFixture.WebSocketsUrl + "/httpheader"), + await webSocketsTransport.StartAsync(new Uri(server.WebSocketsUrl + "/httpheader"), TransferFormat.Binary).OrTimeout(); await webSocketsTransport.Output.WriteAsync(Encoding.UTF8.GetBytes("User-Agent")); @@ -99,10 +99,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportSendsXRequestedWithHeader() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory, accessTokenProvider: null); - await webSocketsTransport.StartAsync(new Uri(ServerFixture.WebSocketsUrl + "/httpheader"), + await webSocketsTransport.StartAsync(new Uri(server.WebSocketsUrl + "/httpheader"), TransferFormat.Binary).OrTimeout(); await webSocketsTransport.Output.WriteAsync(Encoding.UTF8.GetBytes("X-Requested-With")); @@ -122,10 +122,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests [WebSocketsSupportedCondition] public async Task WebSocketsTransportStopsWhenConnectionChannelClosed() { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory, accessTokenProvider: null); - await webSocketsTransport.StartAsync(new Uri(ServerFixture.WebSocketsUrl + "/echo"), + await webSocketsTransport.StartAsync(new Uri(server.WebSocketsUrl + "/echo"), TransferFormat.Binary); webSocketsTransport.Output.Complete(); await webSocketsTransport.Running.OrTimeout(TimeSpan.FromSeconds(10)); @@ -138,10 +138,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests [InlineData(TransferFormat.Binary)] public async Task WebSocketsTransportStopsWhenConnectionClosedByTheServer(TransferFormat transferFormat) { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory, accessTokenProvider: null); - await webSocketsTransport.StartAsync(new Uri(ServerFixture.WebSocketsUrl + "/echoAndClose"), transferFormat); + await webSocketsTransport.StartAsync(new Uri(server.WebSocketsUrl + "/echoAndClose"), transferFormat); await webSocketsTransport.Output.WriteAsync(new byte[] { 0x42 }); @@ -160,11 +160,11 @@ namespace Microsoft.AspNetCore.SignalR.Tests [InlineData(TransferFormat.Binary)] public async Task WebSocketsTransportSetsTransferFormat(TransferFormat transferFormat) { - using (StartVerifiableLog(out var loggerFactory)) + using (StartServer(out var loggerFactory, out var server)) { var webSocketsTransport = new WebSocketsTransport(httpConnectionOptions: null, loggerFactory: loggerFactory, accessTokenProvider: null); - await webSocketsTransport.StartAsync(new Uri(ServerFixture.WebSocketsUrl + "/echo"), + await webSocketsTransport.StartAsync(new Uri(server.WebSocketsUrl + "/echo"), transferFormat).OrTimeout(); await webSocketsTransport.StopAsync().OrTimeout();