StopAsync resets state on inactive connection (#20083) (#23962)

This commit is contained in:
Brennan 2020-07-16 16:46:15 -07:00 committed by GitHub
parent b8a0fa74dc
commit 9e635724c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 0 deletions

View File

@ -501,6 +501,11 @@ namespace Microsoft.AspNetCore.SignalR.Client
{
connectionState.Stopping = true;
}
else
{
// Reset StopCts if there isn't an active connection so that the next StartAsync wont immediately fail due to the token being canceled
_state.StopCts = new CancellationTokenSource();
}
if (disposing)
{

View File

@ -334,6 +334,26 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
});
}
[Fact]
public async Task StopAsyncOnInactiveConnectionDoesNotAffectNextStartAsync()
{
// Regression test:
// If there wasn't an active underlying connection, StopAsync would leave a CTS canceled which would cause the next StartAsync to fail
var testConnection = new TestConnection();
await AsyncUsing(CreateHubConnection(testConnection), async connection =>
{
Assert.Equal(HubConnectionState.Disconnected, connection.State);
await connection.StopAsync().OrTimeout();
Assert.False(testConnection.Disposed.IsCompleted);
Assert.Equal(HubConnectionState.Disconnected, connection.State);
await connection.StartAsync().OrTimeout();
Assert.True(testConnection.Started.IsCompleted);
Assert.Equal(HubConnectionState.Connected, connection.State);
});
}
[Fact]
public async Task CompletingTheTransportSideMarksConnectionAsClosed()
{