You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

MessageRegistryTests.cs 5.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright (c) Microsoft Corporation. All rights reserved.
  2. // MessageRegistryTests.cs
  3. using Microsoft.AutoGen.Contracts;
  4. using Microsoft.AutoGen.RuntimeGateway.Grpc.Abstractions;
  5. using Microsoft.AutoGen.RuntimeGateway.Grpc.Tests.Helpers.Orleans;
  6. namespace Microsoft.AutoGen.RuntimeGateway.Grpc.Tests;
  7. public class MessageRegistryTests
  8. {
  9. public MessageRegistryTests() { }
  10. [Fact]
  11. public async Task Write_and_Remove_Messages()
  12. {
  13. // Arrange
  14. var fixture = new ClusterFixture();
  15. var cluster = fixture.Cluster;
  16. var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
  17. var topic = Guid.NewGuid().ToString(); // Random topic
  18. var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
  19. // Act
  20. await grain.AddMessageToDeadLetterQueueAsync(topic, message);
  21. // Assert
  22. // attempt to remove the topic from the queue
  23. var removedMessages = await grain.RemoveMessagesAsync(topic);
  24. // attempt to compare the message with the removed message
  25. Assert.Single(removedMessages);
  26. Assert.Equal(message.Id, removedMessages[0].Id);
  27. // ensure the queue is empty
  28. removedMessages = await grain.RemoveMessagesAsync(topic);
  29. Assert.Empty(removedMessages);
  30. cluster.StopAllSilos();
  31. }
  32. /// <summary>
  33. /// Test that messages are removed from the event buffer after the buffer time
  34. /// </summary>
  35. [Fact]
  36. public async Task Write_and_Remove_Messages_BufferTime()
  37. {
  38. // Arrange
  39. var fixture = new ClusterFixture();
  40. var cluster = fixture.Cluster;
  41. var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
  42. var topic = Guid.NewGuid().ToString(); // Random topic
  43. var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
  44. // Act
  45. await grain.AddMessageToEventBufferAsync(topic, message);
  46. // wait 5 seconds
  47. await Task.Delay(5000);
  48. // attempt to remove the topic from the queue
  49. var removedMessages = await grain.RemoveMessagesAsync(topic);
  50. Assert.Empty(removedMessages);
  51. cluster.StopAllSilos();
  52. }
  53. /// <summary>
  54. /// Test that messages are still in the event buffer after 1 second
  55. /// </summary>
  56. [Fact]
  57. public async Task Write_and_Remove_Messages_BufferTime_StillInBuffer()
  58. {
  59. // Arrange
  60. var fixture = new ClusterFixture();
  61. var cluster = fixture.Cluster;
  62. var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
  63. var topic = Guid.NewGuid().ToString(); // Random topic
  64. var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
  65. // Act
  66. await grain.AddMessageToEventBufferAsync(topic, message);
  67. // wait 1 second
  68. await Task.Delay(1000);
  69. // attempt to remove the topic from the queue
  70. var removedMessages = await grain.RemoveMessagesAsync(topic);
  71. Assert.Single(removedMessages);
  72. cluster.StopAllSilos();
  73. }
  74. /// <summary>
  75. /// Test that messages which exceed the mas message size are not written to the event buffer
  76. /// </summary>
  77. [Fact]
  78. public async Task Do_No_Buffer_If_Messages_Exceed_MaxMessageSize()
  79. {
  80. // Arrange
  81. var fixture = new ClusterFixture();
  82. var cluster = fixture.Cluster;
  83. var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
  84. var topic = Guid.NewGuid().ToString(); // Random topic
  85. var maxMessageSize = 1024 * 1024 * 10; // 10MB
  86. var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
  87. // Act
  88. await grain.AddMessageToDeadLetterQueueAsync(topic, message); // small message
  89. message.BinaryData = Google.Protobuf.ByteString.CopyFrom(new byte[maxMessageSize + 1]);
  90. await grain.AddMessageToDeadLetterQueueAsync(topic, message); // over the limit
  91. // attempt to remove the topic from the queue
  92. var removedMessages = await grain.RemoveMessagesAsync(topic);
  93. Assert.Single(removedMessages); // only the small message should be in the buffer
  94. cluster.StopAllSilos();
  95. }
  96. /// <summary>
  97. /// Test that the queue cannot grow past the max queue size
  98. /// </summary>
  99. [Fact]
  100. public async Task Do_No_Buffer_If_Queue_Exceeds_MaxQueueSize()
  101. {
  102. // Arrange
  103. var fixture = new ClusterFixture();
  104. var cluster = fixture.Cluster;
  105. var grain = cluster.GrainFactory.GetGrain<IMessageRegistryGrain>(0);
  106. var topic = Guid.NewGuid().ToString(); // Random topic
  107. var bigMessage = 1024 * 1024 * 1; // 1MB
  108. var message = new CloudEvent { Id = Guid.NewGuid().ToString(), Source = "test-source", Type = "test-type" };
  109. // Act
  110. for (int i = 0; i < 11; i++)
  111. {
  112. message.BinaryData = Google.Protobuf.ByteString.CopyFrom(new byte[bigMessage]);
  113. message.Source = i.ToString();
  114. await grain.AddMessageToDeadLetterQueueAsync(topic, message);
  115. }
  116. // attempt to remove the topic from the queue
  117. var removedMessages = await grain.RemoveMessagesAsync(topic);
  118. Assert.Equal(9, removedMessages.Count); // only 3 messages should be in the buffer
  119. cluster.StopAllSilos();
  120. }
  121. }