Jacob Alber 392aa14491
fix: Add deferral to RegisterAgentType and (Add/Remove)Subscription (#5494)
Unlike with the InProcessRuntime, there is a two-phase initialization,
first when AgentsApp is built (when initial agents are registered) and
when it StartAsync()s and connects to the Gateway. Unfortunately, it is
possible to attempt to send direct RPC calls to the Gateway before the
message channel is opened; in this case, the Gateway has no connected
client corresponding to the RPC's clientId, and falls over.

The fix is to defer registering agents and subscriptions with the
gateway until after the connection is established after .StartAsync() is
called.
2025-02-11 16:03:02 -05:00

51 lines
2.0 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved.
// GrpcAgentRuntimeTests.cs
using FluentAssertions;
using Microsoft.AutoGen.Contracts;
using Microsoft.Extensions.Logging;
using Xunit;
namespace Microsoft.AutoGen.Core.Grpc.Tests;
[Trait("Category", "GRPC")]
public class GrpcAgentRuntimeTests : TestBase
{
[Fact]
public async Task GatewayShouldNotReceiveRegistrationsUntilRuntimeStart()
{
var fixture = new GrpcAgentRuntimeFixture();
var runtime = (GrpcAgentRuntime)await fixture.StartAsync(startRuntime: false, registerDefaultAgent: false);
Logger<BaseAgent> logger = new(new LoggerFactory());
await runtime.RegisterAgentFactoryAsync("MyAgent", async (id, runtime) =>
{
return await ValueTask.FromResult(new SubscribedProtobufAgent(id, runtime, logger));
});
await runtime.RegisterImplicitAgentSubscriptionsAsync<SubscribedProtobufAgent>("MyAgent");
fixture.GrpcRequestCollector.RegisterAgentTypeRequests.Should().BeEmpty();
fixture.GrpcRequestCollector.AddSubscriptionRequests.Should().BeEmpty();
await fixture.AgentsApp!.StartAsync().ConfigureAwait(true);
fixture.GrpcRequestCollector.RegisterAgentTypeRequests.Should().NotBeEmpty();
fixture.GrpcRequestCollector.RegisterAgentTypeRequests.Single().Type.Should().Be("MyAgent");
fixture.GrpcRequestCollector.AddSubscriptionRequests.Should().NotBeEmpty();
fixture.GrpcRequestCollector.Clear();
await runtime.RegisterAgentFactoryAsync("MyAgent2", async (id, runtime) =>
{
return await ValueTask.FromResult(new TestProtobufAgent(id, runtime, logger));
});
fixture.GrpcRequestCollector.RegisterAgentTypeRequests.Should().NotBeEmpty();
fixture.GrpcRequestCollector.RegisterAgentTypeRequests.Single().Type.Should().Be("MyAgent2");
fixture.GrpcRequestCollector.AddSubscriptionRequests.Should().BeEmpty();
fixture.Dispose();
}
}