diff --git a/tests/ModelContextProtocol.TestSseServer/Program.cs b/tests/ModelContextProtocol.TestSseServer/Program.cs index 712f845f3..08ad81d4c 100644 --- a/tests/ModelContextProtocol.TestSseServer/Program.cs +++ b/tests/ModelContextProtocol.TestSseServer/Program.cs @@ -6,7 +6,9 @@ using System.Text; using System.Text.Json; -internal class Program +namespace ModelContextProtocol.TestSseServer; + +public class Program { private static ILoggerFactory CreateLoggerFactory() { @@ -25,7 +27,9 @@ private static ILoggerFactory CreateLoggerFactory() }); } - private static async Task Main(string[] args) + public static Task Main(string[] args) => MainAsync(args); + + public static async Task MainAsync(string[] args, CancellationToken cancellationToken = default) { Console.WriteLine("Starting server..."); @@ -386,12 +390,19 @@ static CreateMessageRequestParams CreateRequestSamplingParams(string context, st Console.WriteLine("Server initialized."); - await server.StartAsync(); + await server.StartAsync(cancellationToken); Console.WriteLine("Server started."); - // Run until process is stopped by the client (parent process) - await Task.Delay(Timeout.Infinite); + try + { + // Run until process is stopped by the client (parent process) or test + await Task.Delay(Timeout.Infinite, cancellationToken); + } + finally + { + await server.DisposeAsync(); + } } const string MCP_TINY_IMAGE = diff --git a/tests/ModelContextProtocol.Tests/ModelContextProtocol.Tests.csproj b/tests/ModelContextProtocol.Tests/ModelContextProtocol.Tests.csproj index 530f57c21..e2eba568f 100644 --- a/tests/ModelContextProtocol.Tests/ModelContextProtocol.Tests.csproj +++ b/tests/ModelContextProtocol.Tests/ModelContextProtocol.Tests.csproj @@ -38,12 +38,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - diff --git a/tests/ModelContextProtocol.Tests/SseServerIntegrationTestFixture.cs b/tests/ModelContextProtocol.Tests/SseServerIntegrationTestFixture.cs index 7b2642284..e9a361c18 100644 --- a/tests/ModelContextProtocol.Tests/SseServerIntegrationTestFixture.cs +++ b/tests/ModelContextProtocol.Tests/SseServerIntegrationTestFixture.cs @@ -1,15 +1,14 @@ -using ModelContextProtocol.Client; +using Microsoft.Extensions.Logging; +using ModelContextProtocol.Client; using ModelContextProtocol.Configuration; using ModelContextProtocol.Protocol.Transport; -using Microsoft.Extensions.Logging; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; namespace ModelContextProtocol.Tests; -public class SseServerIntegrationTestFixture : IDisposable +public class SseServerIntegrationTestFixture : IAsyncDisposable { - private Process _process; + private readonly CancellationTokenSource _stopCts = new(); + private readonly Task _serverTask; public ILoggerFactory LoggerFactory { get; } public McpClientOptions DefaultOptions { get; } @@ -35,40 +34,20 @@ public SseServerIntegrationTestFixture() Location = "http://localhost:3001/sse" }; - Start(); + _serverTask = TestSseServer.Program.MainAsync([], _stopCts.Token); } - [MemberNotNull(nameof(_process))] - public void Start() - { - // Start the server (which is at TestSseServer.exe on windows and "dotnet TestSseServer.dll" on linux) - var processStartInfo = new ProcessStartInfo - { - FileName = OperatingSystem.IsWindows() ? "TestSseServer.exe" : "dotnet", - Arguments = "TestSseServer.dll", - RedirectStandardInput = true, - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false, - }; - - _process = Process.Start(processStartInfo) - ?? throw new InvalidOperationException($"Could not start process for {processStartInfo.FileName} with '{processStartInfo.Arguments}'."); - - // Wait 1 second - Thread.Sleep(1000); - } - - public void Dispose() + public async ValueTask DisposeAsync() { + LoggerFactory.Dispose(); + _stopCts.Cancel(); try { - LoggerFactory?.Dispose(); + await _serverTask.ConfigureAwait(false); } - finally + catch (OperationCanceledException) { - // Kill the server process - _process.Kill(); } + _stopCts.Dispose(); } } \ No newline at end of file