Server per test (#3253)
This commit is contained in:
parent
b006a2c789
commit
ffd4bcd850
|
|
@ -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<ServerFixture<Startup>>
|
||||
public class HubConnectionTestsCollection : ICollectionFixture<InProcessTestServer<Startup>>
|
||||
{
|
||||
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<Startup> 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<IConnectionFactory>(delegateConnectionFactory);
|
||||
|
||||
return hubConnectionBuilder.Build();
|
||||
}
|
||||
|
||||
private Func<TransferFormat, Task<ConnectionContext>> GetHttpConnectionFactory(ILoggerFactory loggerFactory, string path, HttpTransportType transportType)
|
||||
private Func<TransferFormat, Task<ConnectionContext>> 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<Startup>(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<Startup>(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<Startup>(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<Startup>(out var loggerFactory, out var fixture, LogLevel.Trace, $"{nameof(CanStartConnectionFromClosedEvent)}_{protocol.Name}_{transportType}_{path.TrimStart('/')}"))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<HubConnectionTests>();
|
||||
const string originalMessage = "SignalR";
|
||||
|
||||
var connection = CreateHubConnection(path, transportType, protocol, loggerFactory);
|
||||
var connection = CreateHubConnection(fixture.Url, path, transportType, protocol, loggerFactory);
|
||||
var restartTcs = new TaskCompletionSource<object>();
|
||||
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<Startup>(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<Startup>(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<Startup>(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<object>();
|
||||
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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(out var loggerFactory, out var fixture, $"{nameof(ClientCanUseJwtBearerTokenForAuthentication)}_{transportType}"))
|
||||
{
|
||||
async Task<string> 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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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 =>
|
||||
|
|
|
|||
|
|
@ -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<ServerFixture<VersionStartup>>
|
||||
public class HubProtocolVersionTestsCollection : ICollectionFixture<InProcessTestServer<VersionStartup>>
|
||||
{
|
||||
public const string Name = nameof(HubProtocolVersionTestsCollection);
|
||||
}
|
||||
|
||||
[Collection(HubProtocolVersionTestsCollection.Name)]
|
||||
public class HubProtocolVersionTests : VerifiableServerLoggedTest
|
||||
public class HubProtocolVersionTests : FunctionalTestBase
|
||||
{
|
||||
public HubProtocolVersionTests(ServerFixture<VersionStartup> 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<VersionStartup>(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<VersionStartup>(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<IHubProtocol>(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<VersionStartup>(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<object>();
|
||||
|
|
@ -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<VersionStartup>(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<IHubProtocol>(new VersionedJsonHubProtocol(int.MaxValue));
|
||||
|
||||
var connection = connectionBuilder.Build();
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ namespace Microsoft.AspNetCore.SignalR.Redis.Tests
|
|||
public class RedisServerFixture<TStartup> : IDisposable
|
||||
where TStartup : class
|
||||
{
|
||||
public ServerFixture<TStartup> FirstServer { get; private set; }
|
||||
public ServerFixture<TStartup> SecondServer { get; private set; }
|
||||
public InProcessTestServer<TStartup> FirstServer { get; private set; }
|
||||
public InProcessTestServer<TStartup> 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<TStartup> StartServer()
|
||||
private InProcessTestServer<TStartup> StartServer()
|
||||
{
|
||||
try
|
||||
{
|
||||
return new ServerFixture<TStartup>(_loggerFactory);
|
||||
return new InProcessTestServer<TStartup>(_loggerFactory);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ namespace Microsoft.AspNetCore.SignalR.StackExchangeRedis.Tests
|
|||
public class RedisServerFixture<TStartup> : IDisposable
|
||||
where TStartup : class
|
||||
{
|
||||
public ServerFixture<TStartup> FirstServer { get; private set; }
|
||||
public ServerFixture<TStartup> SecondServer { get; private set; }
|
||||
public InProcessTestServer<TStartup> FirstServer { get; private set; }
|
||||
public InProcessTestServer<TStartup> 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<TStartup> StartServer()
|
||||
private InProcessTestServer<TStartup> StartServer()
|
||||
{
|
||||
try
|
||||
{
|
||||
return new ServerFixture<TStartup>(_loggerFactory);
|
||||
return new InProcessTestServer<TStartup>(_loggerFactory);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<WriteContext, bool> _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<WriteContext, bool> expectedErrorsFilter = null)
|
||||
public IDisposable StartServer<T>(out ILoggerFactory loggerFactory, out InProcessTestServer<T> testServer, LogLevel minLogLevel, [CallerMemberName] string testName = null, Func<WriteContext, bool> expectedErrorsFilter = null) where T : class
|
||||
{
|
||||
var disposable = base.StartVerifiableLog(out loggerFactory, minLogLevel, testName, ResolveExpectedErrorsFilter(expectedErrorsFilter));
|
||||
return new ServerLogScope(ServerFixture, loggerFactory, disposable);
|
||||
testServer = new InProcessTestServer<T>(loggerFactory);
|
||||
return new MultiDisposable(testServer, disposable);
|
||||
}
|
||||
|
||||
public override IDisposable StartVerifiableLog(out ILoggerFactory loggerFactory, [CallerMemberName] string testName = null, Func<WriteContext, bool> expectedErrorsFilter = null)
|
||||
public IDisposable StartServer<T>(out ILoggerFactory loggerFactory, out InProcessTestServer<T> testServer, [CallerMemberName] string testName = null, Func<WriteContext, bool> expectedErrorsFilter = null) where T : class
|
||||
{
|
||||
var disposable = base.StartVerifiableLog(out loggerFactory, testName, ResolveExpectedErrorsFilter(expectedErrorsFilter));
|
||||
return new ServerLogScope(ServerFixture, loggerFactory, disposable);
|
||||
testServer = new InProcessTestServer<T>(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<IDisposable> _disposables;
|
||||
public MultiDisposable(params IDisposable[] disposables)
|
||||
{
|
||||
_disposables = new List<IDisposable>(disposables);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
foreach (var disposable in _disposables)
|
||||
{
|
||||
disposable.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<LogRecord> ServerLogged;
|
||||
|
||||
|
|
@ -29,7 +26,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
|||
public abstract void Dispose();
|
||||
}
|
||||
|
||||
public class ServerFixture<TStartup> : ServerFixture
|
||||
public class InProcessTestServer<TStartup> : 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<TStartup>)}_{typeof(TStartup).Name}",
|
||||
out _loggerFactory, nameof(ServerFixture));
|
||||
_logToken = testLog.StartTestLog(null, $"{nameof(InProcessTestServer<TStartup>)}_{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<ServerFixture<TStartup>>();
|
||||
_logger = _loggerFactory.CreateLogger<InProcessTestServer<TStartup>>();
|
||||
|
||||
StartServer();
|
||||
}
|
||||
|
|
@ -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<string, ILogger> _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;
|
||||
|
|
|
|||
|
|
@ -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<ServerFixture<Startup>>
|
||||
public class EndToEndTestsCollection : ICollectionFixture<InProcessTestServer<Startup>>
|
||||
{
|
||||
public const string Name = nameof(EndToEndTestsCollection);
|
||||
}
|
||||
|
||||
[Collection(EndToEndTestsCollection.Name)]
|
||||
public class EndToEndTests : VerifiableServerLoggedTest
|
||||
public class EndToEndTests : FunctionalTestBase
|
||||
{
|
||||
public EndToEndTests(ServerFixture<Startup> serverFixture, ITestOutputHelper output) : base(serverFixture, output)
|
||||
public EndToEndTests(ITestOutputHelper output) : base(output)
|
||||
{
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CanStartAndStopConnectionUsingDefaultTransport()
|
||||
{
|
||||
using (StartVerifiableLog(out var loggerFactory))
|
||||
using (StartServer<Startup>(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<Startup>(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<Startup>(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<Startup>(out var loggerFactory, out var server))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
|
||||
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<Startup>(out var loggerFactory, out var server))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
|
||||
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<Startup>(out var loggerFactory, out var server))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
var url = ServerFixture.Url + "/echo";
|
||||
var url = server.Url + "/echo";
|
||||
|
||||
var mockHttpHandler = new Mock<HttpMessageHandler>();
|
||||
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<Startup>(out var loggerFactory, out var server))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
var url = ServerFixture.Url + "/echo";
|
||||
var url = server.Url + "/echo";
|
||||
|
||||
var mockHttpHandler = new Mock<HttpMessageHandler>();
|
||||
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<Startup>(out var loggerFactory, out var server, minLogLevel: LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}_{requestedTransferFormat.ToString()}"))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
|
||||
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<Startup>(out var loggerFactory, out var server, LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveDifferentMessageSizesWebSocketsTransport_{message.Length}"))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
|
||||
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<Startup>(out var loggerFactory, out var server, LogLevel.Trace, expectedErrorsFilter: ExpectedErrors))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
|
||||
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<HttpRequestException>(() => 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<Startup>(out var loggerFactory, out var server, LogLevel.Trace, expectedErrorsFilter: ExpectedErrors))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
|
||||
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<Startup>(out var loggerFactory, out var server, LogLevel.Trace, testName: $"{nameof(UnauthorizedConnectionDoesNotConnect)}_{transportType}", expectedErrorsFilter: ExpectedErrors))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
|
||||
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<Startup>(out var loggerFactory, out var server, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}"))
|
||||
{
|
||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||
|
||||
var url = ServerFixture.Url + "/uncreatable";
|
||||
var url = server.Url + "/uncreatable";
|
||||
var connection = new HubConnectionBuilder()
|
||||
.WithLoggerFactory(loggerFactory)
|
||||
.WithUrl(url, transportType)
|
||||
|
|
|
|||
|
|
@ -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<Startup> 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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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<Startup>(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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue