Call enqueue interceptor for retained messages (fix) (#2212)

* Call the event handler also for retained messages

* Update release notes

* Add Unit Test
This commit is contained in:
Christian
2025-10-19 21:21:47 +02:00
committed by GitHub
parent 51979fa5a4
commit 5ebc5fcb7e
6 changed files with 104 additions and 48 deletions
@@ -13,7 +13,7 @@ namespace MQTTnet.Tests.Server;
// ReSharper disable InconsistentNaming
[TestClass]
public sealed class Retained_Messages_Tests : BaseTestClass
public class Retained_Messages_Tests : BaseTestClass
{
[TestMethod]
public async Task Clear_Retained_Message_With_Empty_Payload()
@@ -31,9 +31,9 @@ public sealed class Retained_Messages_Tests : BaseTestClass
var c2 = await testEnvironment.ConnectClient();
var messageHandler = testEnvironment.CreateApplicationMessageHandler(c2);
await Task.Delay(200);
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
await Task.Delay(500);
await MediumTestDelay();
messageHandler.AssertReceivedCountEquals(0);
}
@@ -54,9 +54,9 @@ public sealed class Retained_Messages_Tests : BaseTestClass
var c2 = await testEnvironment.ConnectClient();
var messageHandler = testEnvironment.CreateApplicationMessageHandler(c2);
await Task.Delay(200);
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
await Task.Delay(500);
await MediumTestDelay();
messageHandler.AssertReceivedCountEquals(0);
}
@@ -82,7 +82,7 @@ public sealed class Retained_Messages_Tests : BaseTestClass
var messageHandler = testEnvironment.CreateApplicationMessageHandler(c2);
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
await LongTestDelay();
await MediumTestDelay();
messageHandler.AssertReceivedCountEquals(1);
@@ -110,7 +110,7 @@ public sealed class Retained_Messages_Tests : BaseTestClass
var messageHandler = testEnvironment.CreateApplicationMessageHandler(c2);
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce });
await LongTestDelay();
await MediumTestDelay();
messageHandler.AssertReceivedCountEquals(1);
@@ -131,7 +131,7 @@ public sealed class Retained_Messages_Tests : BaseTestClass
var messageHandler = testEnvironment.CreateApplicationMessageHandler(c2);
await c2.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("retained_other").Build());
await Task.Delay(500);
await MediumTestDelay();
messageHandler.AssertReceivedCountEquals(0);
}
@@ -178,10 +178,10 @@ public sealed class Retained_Messages_Tests : BaseTestClass
var c2 = await testEnvironment.ConnectClient();
var messageHandler = testEnvironment.CreateApplicationMessageHandler(c2);
await Task.Delay(200);
// Using QoS 2 will lead to 1 instead because the publish was made with QoS level 1 (see 3.8.4 SUBSCRIBE Actions)!
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce });
await Task.Delay(500);
await MediumTestDelay();
messageHandler.AssertReceivedCountEquals(1);
}
@@ -248,4 +248,33 @@ public sealed class Retained_Messages_Tests : BaseTestClass
Assert.IsTrue(connectResult.RetainAvailable);
}
[TestMethod]
public async Task Skip_Enqueue_Of_Retained_Message()
{
using var testEnvironment = CreateTestEnvironment();
var server = await testEnvironment.StartServer();
server.InterceptingClientEnqueueAsync += e =>
{
e.AcceptEnqueue = false;
return Task.CompletedTask;
};
var c1 = await testEnvironment.ConnectClient();
await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build());
await c1.DisconnectAsync();
var c2 = await testEnvironment.ConnectClient();
var messageHandler = testEnvironment.CreateApplicationMessageHandler(c2);
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
await MediumTestDelay();
messageHandler.AssertReceivedCountEquals(0);
}
}