// Copyright (c) Microsoft Corporation. All rights reserved. // GrpcAgentRuntimeFixture.cs using Microsoft.AspNetCore.Builder; using Microsoft.AutoGen.Contracts; // using Microsoft.AutoGen.Core.Tests; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace Microsoft.AutoGen.Core.Grpc.Tests; /// /// Fixture for setting up the gRPC agent runtime for testing. /// public sealed class GrpcAgentRuntimeFixture : IDisposable { /// the gRPC agent runtime. public AgentsApp? Client { get; private set; } /// mock server for testing. public WebApplication? Server { get; private set; } public GrpcAgentRuntimeFixture() { } /// /// Start - gets a new port and starts fresh instances /// public async Task Start(bool initialize = true) { int port = GetAvailablePort(); // Get a new port per test run // Update environment variables so each test runs independently Environment.SetEnvironmentVariable("ASPNETCORE_HTTPS_PORTS", port.ToString()); Environment.SetEnvironmentVariable("AGENT_HOST", $"https://localhost:{port}"); Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); Server = ServerBuilder().Result; await Server.StartAsync().ConfigureAwait(true); Client = ClientBuilder().Result; await Client.StartAsync().ConfigureAwait(true); var worker = Client.Services.GetRequiredService(); return (worker); } private static async Task ClientBuilder() { var appBuilder = new AgentsAppBuilder(); appBuilder.AddGrpcAgentWorker(); appBuilder.AddAgent("TestAgent"); return await appBuilder.BuildAsync(); } private static async Task ServerBuilder() { var builder = WebApplication.CreateBuilder(); builder.Services.AddGrpc(); var app = builder.Build(); app.MapGrpcService(); return app; } private static int GetAvailablePort() { using var listener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Loopback, 0); listener.Start(); int port = ((System.Net.IPEndPoint)listener.LocalEndpoint).Port; listener.Stop(); return port; } /// /// Stop - stops the agent and ensures cleanup /// public void Stop() { (Client as IHost)?.StopAsync(TimeSpan.FromSeconds(30)).GetAwaiter().GetResult(); Server?.StopAsync().GetAwaiter().GetResult(); } /// /// Dispose - Ensures cleanup after each test /// public void Dispose() { Stop(); } }