134 lines
5.4 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved.
// MessageRegistryTests.cs
using Microsoft.AutoGen.Contracts;
using Microsoft.AutoGen.RuntimeGateway.Grpc.Abstractions;
using Microsoft.AutoGen.RuntimeGateway.Grpc.Tests.Helpers.Orleans;
namespace Microsoft.AutoGen.RuntimeGateway.Grpc.Tests;
public class MessageRegistryTests
{
public MessageRegistryTests() { }
[Fact]
public async Task Write_and_Remove_Messages()
{
// Arrange
var fixture = new ClusterFixture();
var cluster = fixture.Cluster;
var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
var topic = Guid.NewGuid().ToString(); // Random topic
var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
// Act
await grain.AddMessageToDeadLetterQueueAsync(topic, message);
// Assert
// attempt to remove the topic from the queue
var removedMessages = await grain.RemoveMessagesAsync(topic);
// attempt to compare the message with the removed message
Assert.Single(removedMessages);
Assert.Equal(message.Id, removedMessages[0].Id);
// ensure the queue is empty
removedMessages = await grain.RemoveMessagesAsync(topic);
Assert.Empty(removedMessages);
cluster.StopAllSilos();
}
/// <summary>
/// Test that messages are removed from the event buffer after the buffer time
/// </summary>
[Fact]
public async Task Write_and_Remove_Messages_BufferTime()
{
// Arrange
var fixture = new ClusterFixture();
var cluster = fixture.Cluster;
var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
var topic = Guid.NewGuid().ToString(); // Random topic
var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
// Act
await grain.AddMessageToEventBufferAsync(topic, message);
// wait 5 seconds
await Task.Delay(5000);
// attempt to remove the topic from the queue
var removedMessages = await grain.RemoveMessagesAsync(topic);
Assert.Empty(removedMessages);
cluster.StopAllSilos();
}
/// <summary>
/// Test that messages are still in the event buffer after 1 second
/// </summary>
[Fact]
public async Task Write_and_Remove_Messages_BufferTime_StillInBuffer()
{
// Arrange
var fixture = new ClusterFixture();
var cluster = fixture.Cluster;
var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
var topic = Guid.NewGuid().ToString(); // Random topic
var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
// Act
await grain.AddMessageToEventBufferAsync(topic, message);
// wait 1 second
await Task.Delay(1000);
// attempt to remove the topic from the queue
var removedMessages = await grain.RemoveMessagesAsync(topic);
Assert.Single(removedMessages);
cluster.StopAllSilos();
}
/// <summary>
/// Test that messages which exceed the mas message size are not written to the event buffer
/// </summary>
[Fact]
public async Task Do_No_Buffer_If_Messages_Exceed_MaxMessageSize()
{
// Arrange
var fixture = new ClusterFixture();
var cluster = fixture.Cluster;
var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
var topic = Guid.NewGuid().ToString(); // Random topic
var maxMessageSize = 1024 * 1024 * 10; // 10MB
var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
// Act
await grain.AddMessageToDeadLetterQueueAsync(topic, message); // small message
message.BinaryData = Google.Protobuf.ByteString.CopyFrom(new byte[maxMessageSize + 1]);
await grain.AddMessageToDeadLetterQueueAsync(topic, message); // over the limit
// attempt to remove the topic from the queue
var removedMessages = await grain.RemoveMessagesAsync(topic);
Assert.Single(removedMessages); // only the small message should be in the buffer
cluster.StopAllSilos();
}
/// <summary>
/// Test that the queue cannot grow past the max queue size
/// </summary>
[Fact]
public async Task Do_No_Buffer_If_Queue_Exceeds_MaxQueueSize()
{
// Arrange
var fixture = new ClusterFixture();
var cluster = fixture.Cluster;
var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
var topic = Guid.NewGuid().ToString(); // Random topic
var bigMessage = 1024 * 1024 * 1; // 1MB
var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
// Act
for (int i = 0; i < 11; i++)
{
message.BinaryData = Google.Protobuf.ByteString.CopyFrom(new byte[bigMessage]);
message.Source = i.ToString();
await grain.AddMessageToDeadLetterQueueAsync(topic, message);
}
// attempt to remove the topic from the queue
var removedMessages = await grain.RemoveMessagesAsync(topic);
Assert.Equal(9, removedMessages.Count); // only 3 messages should be in the buffer
cluster.StopAllSilos();
}
}