From b82112486442ce367305a6cbe43425cb46ae909a Mon Sep 17 00:00:00 2001 From: jaredpar Date: Fri, 21 Mar 2025 15:57:04 -0700 Subject: [PATCH 1/2] Remove reflection from Connect test This removes the reflection from the double connection test and replaces it with a `MockHttpHandler` to let the connection actually succeed and then test the redundant `ConnectAsync` call. partial fix for #48 --- .../Transport/SseClientTransportTests.cs | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs b/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs index 0749eed71..68f10bbd8 100644 --- a/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs +++ b/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs @@ -5,6 +5,7 @@ using ModelContextProtocol.Tests.Utils; using System.Net; using System.Reflection; +using System.Reflection.Metadata; namespace ModelContextProtocol.Tests.Transport; @@ -107,12 +108,53 @@ public async Task ConnectAsync_Should_Connect_Successfully() [Fact] public async Task ConnectAsync_Throws_If_Already_Connected() { - await using var transport = new SseClientTransport(_transportOptions, _serverConfig, NullLoggerFactory.Instance); - transport.GetType().BaseType!.GetField("_isConnected", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.SetValue(transport, true); + using var mockHttpHandler = new MockHttpHandler(); + using var httpClient = new HttpClient(mockHttpHandler); + await using var transport = new SseClientTransport(_transportOptions, _serverConfig, httpClient, NullLoggerFactory.Instance); + using var mreConnected = new ManualResetEventSlim(false); + using var mreDone = new ManualResetEventSlim(false); + var callIndex = 0; + + mockHttpHandler.RequestHandler = (request) => + { + switch (callIndex++) + { + case 0: + return Task.FromResult(new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent("event: endpoint\r\ndata: http://localhost\r\n\r\n") + }); + case 1: + mreConnected.Set(); + mreDone.Wait(); + return Task.FromResult(new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent("") + }); + default: + return Task.FromResult(new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent("") + }); + } + }; + var task = Task.Run(async () => + { + await transport.ConnectAsync(TestContext.Current.CancellationToken); + }, TestContext.Current.CancellationToken); + + mreConnected.Wait(TestContext.Current.CancellationToken); + Assert.True(transport.IsConnected); var action = async () => await transport.ConnectAsync(); var exception = await Assert.ThrowsAsync(action); Assert.Equal("Transport is already connected", exception.Message); + mreDone.Set(); + await transport.CloseAsync(); + await task; } [Fact] From 87848f3d7a8257b4f7811e6206c1300bbb95756e Mon Sep 17 00:00:00 2001 From: jaredpar Date: Fri, 21 Mar 2025 16:03:57 -0700 Subject: [PATCH 2/2] remove unneeded using --- .../Transport/SseClientTransportTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs b/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs index 68f10bbd8..53d41cc1f 100644 --- a/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs +++ b/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs @@ -5,7 +5,6 @@ using ModelContextProtocol.Tests.Utils; using System.Net; using System.Reflection; -using System.Reflection.Metadata; namespace ModelContextProtocol.Tests.Transport;