From dda264c8a34d4b8fde405a17ff72a2a10e25ded6 Mon Sep 17 00:00:00 2001 From: Brennan Date: Fri, 10 Jan 2025 13:41:41 -0800 Subject: [PATCH 1/2] Fix flaky SignalR test: RequestTimeoutDisabledWhenConnected --- .../Http.Connections/test/HttpConnectionDispatcherTests.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/SignalR/common/Http.Connections/test/HttpConnectionDispatcherTests.cs b/src/SignalR/common/Http.Connections/test/HttpConnectionDispatcherTests.cs index b7bd2b654c29..c7f260d7ebc3 100644 --- a/src/SignalR/common/Http.Connections/test/HttpConnectionDispatcherTests.cs +++ b/src/SignalR/common/Http.Connections/test/HttpConnectionDispatcherTests.cs @@ -3505,6 +3505,8 @@ public async Task RequestTimeoutDisabledWhenConnected(HttpTransportType transpor { services.AddConnections(); + services.AddSingleton(); + // Since tests run in parallel, it's possible multiple servers will startup, // we use an ephemeral key provider and repository to avoid filesystem contention issues services.AddSingleton(); @@ -3550,6 +3552,8 @@ public async Task RequestTimeoutDisabledWhenConnected(HttpTransportType transpor await connection.StartAsync(); + await host.Services.GetRequiredService().Started; + var negotiateResponse = NegotiateProtocol.ParseResponse(stream.ToArray()); Assert.True(manager.TryGetConnection(negotiateResponse.ConnectionToken, out var context)); From 910affa42806b1b4ac260a6afe754cae864fbda1 Mon Sep 17 00:00:00 2001 From: Brennan Date: Fri, 10 Jan 2025 13:55:40 -0800 Subject: [PATCH 2/2] fix --- .../test/HttpConnectionDispatcherTests.cs | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/SignalR/common/Http.Connections/test/HttpConnectionDispatcherTests.cs b/src/SignalR/common/Http.Connections/test/HttpConnectionDispatcherTests.cs index c7f260d7ebc3..3ba5e15984bf 100644 --- a/src/SignalR/common/Http.Connections/test/HttpConnectionDispatcherTests.cs +++ b/src/SignalR/common/Http.Connections/test/HttpConnectionDispatcherTests.cs @@ -3505,8 +3505,6 @@ public async Task RequestTimeoutDisabledWhenConnected(HttpTransportType transpor { services.AddConnections(); - services.AddSingleton(); - // Since tests run in parallel, it's possible multiple servers will startup, // we use an ephemeral key provider and repository to avoid filesystem contention issues services.AddSingleton(); @@ -3527,7 +3525,7 @@ public async Task RequestTimeoutDisabledWhenConnected(HttpTransportType transpor app.UseRouting(); app.UseEndpoints(endpoints => { - endpoints.MapConnectionHandler("/foo"); + endpoints.MapConnectionHandler("/foo"); }); }) .UseUrls("http://127.0.0.1:0"); @@ -3552,7 +3550,9 @@ public async Task RequestTimeoutDisabledWhenConnected(HttpTransportType transpor await connection.StartAsync(); - await host.Services.GetRequiredService().Started; + // Easy way to make sure everything is set is to send and receive data over the connection + await connection.Transport.Output.WriteAsync(new byte[2]); + await connection.Transport.Input.ReadAsync(); var negotiateResponse = NegotiateProtocol.ParseResponse(stream.ToArray()); @@ -3902,6 +3902,34 @@ public override async Task OnConnectedAsync(ConnectionContext connection) } } +public class EchoConnectionHandler : ConnectionHandler +{ + public override async Task OnConnectedAsync(ConnectionContext connection) + { + while (true) + { + var result = await connection.Transport.Input.ReadAsync(); + var buffer = result.Buffer; + + try + { + if (!buffer.IsEmpty) + { + await connection.Transport.Output.WriteAsync(buffer.ToArray()); + } + else if (result.IsCompleted) + { + break; + } + } + finally + { + connection.Transport.Input.AdvanceTo(result.Buffer.End); + } + } + } +} + public class ServiceProviderConnectionHandler : ConnectionHandler { public override async Task OnConnectedAsync(ConnectionContext connection)