From 1b73ed1620221f23a5aa35db6b07206a073413b6 Mon Sep 17 00:00:00 2001 From: Gabriele Santomaggio Date: Thu, 27 Mar 2025 20:48:52 +0100 Subject: [PATCH 1/2] Fix to string in case partitions is null. The bug was introduced on https://github.com/rabbitmq/rabbitmq-stream-dotnet-client/pull/406 Signed-off-by: Gabriele Santomaggio --- RabbitMQ.Stream.Client/IConsumer.cs | 3 ++- RabbitMQ.Stream.Client/IProducer.cs | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/RabbitMQ.Stream.Client/IConsumer.cs b/RabbitMQ.Stream.Client/IConsumer.cs index d7c64ecf..b44e48b2 100644 --- a/RabbitMQ.Stream.Client/IConsumer.cs +++ b/RabbitMQ.Stream.Client/IConsumer.cs @@ -89,6 +89,7 @@ public ConsumerInfo(string stream, string reference, string identifier, List Date: Fri, 28 Mar 2025 09:21:19 +0100 Subject: [PATCH 2/2] add tests Signed-off-by: Gabriele Santomaggio --- Tests/RawConsumerSystemTests.cs | 4 ++ Tests/RawProducerSystemTests.cs | 6 ++- Tests/SuperStreamConsumerTests.cs | 3 ++ Tests/SuperStreamProducerTests.cs | 73 +++++++++++++++++++++++-------- 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/Tests/RawConsumerSystemTests.cs b/Tests/RawConsumerSystemTests.cs index 415e31df..14922812 100644 --- a/Tests/RawConsumerSystemTests.cs +++ b/Tests/RawConsumerSystemTests.cs @@ -122,6 +122,10 @@ public async Task ConsumerStoreOffset() } }); + Assert.Equal( + $"ConsumerInfo(Stream={stream}, Reference=consumer_offset, Identifier=, Partitions=)", + consumer.Info.ToString()); + new Utils(testOutputHelper).WaitUntilTaskCompletes(testPassed); await SystemUtils.WaitAsync(); // // Here we use the standard client to check the offest diff --git a/Tests/RawProducerSystemTests.cs b/Tests/RawProducerSystemTests.cs index c46e5cad..5864ca90 100644 --- a/Tests/RawProducerSystemTests.cs +++ b/Tests/RawProducerSystemTests.cs @@ -278,7 +278,8 @@ await SystemUtils.PublishMessages(system, stream, NumberOfMessages, // sequence start from zero Assert.True(resAfter == (NumberOfMessages - 1)); - var rawProducer = await system.CreateRawProducer(new RawProducerConfig(stream) { Reference = ProducerName }); + var rawProducer = + await system.CreateRawProducer(new RawProducerConfig(stream) { Reference = ProducerName }); Assert.True(await rawProducer.GetLastPublishingId() == (NumberOfMessages - 1)); await system.DeleteStream(stream); await system.Close(); @@ -339,6 +340,9 @@ public async Task ProducerBatchConfirmNumberOfMessages() } } ); + Assert.Equal( + $"ProducerInfo(Stream={stream}, Reference=producer, Identifier=, Partitions=)", + rawProducer.Info.ToString()); var messages = new List<(ulong, Message)>(); for (var i = 1; i <= NumberOfMessages; i++) { diff --git a/Tests/SuperStreamConsumerTests.cs b/Tests/SuperStreamConsumerTests.cs index 719729a3..bce3b47c 100644 --- a/Tests/SuperStreamConsumerTests.cs +++ b/Tests/SuperStreamConsumerTests.cs @@ -661,6 +661,9 @@ public async Task ReliableConsumerSuperStreamInfoShouldBeTheSame() Assert.Contains(SystemUtils.InvoicesStream0, consumer.Info.Partitions); Assert.Contains(SystemUtils.InvoicesStream1, consumer.Info.Partitions); Assert.Contains(SystemUtils.InvoicesStream2, consumer.Info.Partitions); + Assert.Equal( + $"ConsumerInfo(Stream={SystemUtils.InvoicesExchange}, Reference=, Identifier=, Partitions={SystemUtils.InvoicesStream0},{SystemUtils.InvoicesStream1},{SystemUtils.InvoicesStream2})", + consumer.Info.ToString()); await consumer.Close(); } } diff --git a/Tests/SuperStreamProducerTests.cs b/Tests/SuperStreamProducerTests.cs index 893ec62b..aa20c488 100644 --- a/Tests/SuperStreamProducerTests.cs +++ b/Tests/SuperStreamProducerTests.cs @@ -65,17 +65,50 @@ private class MessageIdToStreamTestCases : IEnumerable { public IEnumerator GetEnumerator() { - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-02", MessageId = "hello1" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-01", MessageId = "hello2" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-02", MessageId = "hello3" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-03", MessageId = "hello4" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-01", MessageId = "hello5" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-03", MessageId = "hello6" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-01", MessageId = "hello7" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-02", MessageId = "hello8" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-01", MessageId = "hello9" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-03", MessageId = "hello10" } }; - yield return new object[] { new MessageIdToStream { StreamExpected = "invoices-02", MessageId = "hello88" } }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-02", MessageId = "hello1" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-01", MessageId = "hello2" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-02", MessageId = "hello3" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-03", MessageId = "hello4" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-01", MessageId = "hello5" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-03", MessageId = "hello6" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-01", MessageId = "hello7" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-02", MessageId = "hello8" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-01", MessageId = "hello9" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-03", MessageId = "hello10" } + }; + yield return new object[] + { + new MessageIdToStream { StreamExpected = "invoices-02", MessageId = "hello88" } + }; } IEnumerator IEnumerable.GetEnumerator() @@ -360,13 +393,13 @@ await Producer.Create(new ProducerConfig(system, SuperStream) }); var messages = new List() { - new(Encoding.Default.GetBytes("hello")) {Properties = new Properties() {MessageId = "italy"}}, - new(Encoding.Default.GetBytes("hello")) {Properties = new Properties() {MessageId = "italy"}}, - new(Encoding.Default.GetBytes("hello")) {Properties = new Properties() {MessageId = "france"}}, - new(Encoding.Default.GetBytes("hello")) {Properties = new Properties() {MessageId = "spain"}}, - new(Encoding.Default.GetBytes("hello")) {Properties = new Properties() {MessageId = "germany"}}, - new(Encoding.Default.GetBytes("hello")) {Properties = new Properties() {MessageId = "germany"}}, - new(Encoding.Default.GetBytes("hello")) {Properties = new Properties() {MessageId = "uk"}}, + new(Encoding.Default.GetBytes("hello")) { Properties = new Properties() { MessageId = "italy" } }, + new(Encoding.Default.GetBytes("hello")) { Properties = new Properties() { MessageId = "italy" } }, + new(Encoding.Default.GetBytes("hello")) { Properties = new Properties() { MessageId = "france" } }, + new(Encoding.Default.GetBytes("hello")) { Properties = new Properties() { MessageId = "spain" } }, + new(Encoding.Default.GetBytes("hello")) { Properties = new Properties() { MessageId = "germany" } }, + new(Encoding.Default.GetBytes("hello")) { Properties = new Properties() { MessageId = "germany" } }, + new(Encoding.Default.GetBytes("hello")) { Properties = new Properties() { MessageId = "uk" } }, }; foreach (var message in messages) @@ -952,7 +985,9 @@ public async Task ReliableProducerSuperStreamInfoShouldBeTheSame() Assert.Contains(SystemUtils.InvoicesStream0, producer.Info.Partitions); Assert.Contains(SystemUtils.InvoicesStream1, producer.Info.Partitions); Assert.Contains(SystemUtils.InvoicesStream2, producer.Info.Partitions); + Assert.Equal( + $"ProducerInfo(Stream={SystemUtils.InvoicesExchange}, Reference=, Identifier=, Partitions={SystemUtils.InvoicesStream0},{SystemUtils.InvoicesStream1},{SystemUtils.InvoicesStream2})", + producer.Info.ToString()); await producer.Close(); - } }