Migrate retained messages to the event based approach.

This commit is contained in:
Christian
2021-11-01 11:20:46 +01:00
parent 9ab85b3592
commit 22ccdf10c6
57 changed files with 451 additions and 666 deletions
@@ -34,7 +34,7 @@ namespace MQTTnet.Tests.Server
var disconnectedMre = new ManualResetEventSlim();
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
if (string.IsNullOrEmpty(e.ClientId))
{
@@ -18,7 +18,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttServerClientConnectedEventArgs eventArgs = null;
ClientConnectedEventArgs eventArgs = null;
server.ClientConnectedAsync += e =>
{
eventArgs = e;
@@ -45,7 +45,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttServerClientDisconnectedEventArgs eventArgs = null;
ClientDisconnectedEventArgs eventArgs = null;
server.ClientDisconnectedAsync += e =>
{
eventArgs = e;
@@ -72,7 +72,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttServerClientSubscribedTopicEventArgs eventArgs = null;
ClientSubscribedTopicEventArgs eventArgs = null;
server.ClientSubscribedTopicAsync += e =>
{
eventArgs = e;
@@ -99,7 +99,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
MqttServerClientUnsubscribedTopicEventArgs eventArgs = null;
ClientUnsubscribedTopicEventArgs eventArgs = null;
server.ClientUnsubscribedTopicAsync += e =>
{
eventArgs = e;
@@ -125,8 +125,8 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
InterceptingMqttClientPublishEventArgs eventArgs = null;
server.InterceptingClientPublishAsync += e =>
InterceptingPublishEventArgs eventArgs = null;
server.InterceptingPublishAsync += e =>
{
eventArgs = e;
return Task.CompletedTask;
+22 -17
View File
@@ -512,7 +512,7 @@ namespace MQTTnet.Tests.Server
await Task.Delay(1000);
var retainedMessages = await server.GetRetainedApplicationMessagesAsync();
var retainedMessages = await server.GetRetainedMessagesAsync();
Assert.AreEqual(ClientCount, retainedMessages.Count);
@@ -530,7 +530,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.InterceptingClientPublishAsync += e =>
server.InterceptingPublishAsync += e =>
{
e.ApplicationMessage = new MqttApplicationMessage {Topic = "new_topic"};
@@ -557,19 +557,24 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task Persist_Retained_Message()
{
var serverStorage = new TestServerStorage();
using (var testEnvironment = CreateTestEnvironment())
{
await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithStorage(serverStorage));
List<MqttApplicationMessage> savedRetainedMessages = null;
var s = await testEnvironment.StartServer();
s.RetainedMessageChangedAsync += e =>
{
savedRetainedMessages = e.StoredRetainedMessages;
return Task.CompletedTask;
};
var c1 = await testEnvironment.ConnectClient();
await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("retained").WithPayload(new byte[3]).WithRetainFlag().Build());
await Task.Delay(500);
Assert.AreEqual(1, serverStorage.Messages.Count);
Assert.AreEqual(1, savedRetainedMessages?.Count);
}
}
@@ -617,7 +622,7 @@ namespace MQTTnet.Tests.Server
using (var testEnvironment = CreateTestEnvironment())
{
var server = await testEnvironment.StartServer();
server.InterceptingClientPublishAsync += e =>
server.InterceptingPublishAsync += e =>
{
e.ApplicationMessage.Payload = Encoding.ASCII.GetBytes("extended");
return Task.CompletedTask;
@@ -698,7 +703,7 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
e.ReasonCode = MqttConnectReasonCode.NotAuthorized;
return Task.CompletedTask;
@@ -711,7 +716,7 @@ namespace MQTTnet.Tests.Server
Dictionary<string, bool> _connected;
void ConnectionValidationHandler(ValidatingMqttClientConnectionEventArgs eventArgs)
void ConnectionValidationHandler(ValidatingConnectionEventArgs eventArgs)
{
if (_connected.ContainsKey(eventArgs.ClientId))
{
@@ -734,7 +739,7 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
ConnectionValidationHandler(e);
return Task.CompletedTask;
@@ -923,12 +928,12 @@ namespace MQTTnet.Tests.Server
var clientOptions = new MqttClientOptionsBuilder();
var c1 = await testEnvironment.ConnectClient(clientOptions);
await Task.Delay(500);
Assert.AreEqual(1, (await server.GetClientStatusAsync()).Count);
Assert.AreEqual(1, (await server.GetClientsAsync()).Count);
await c1.DisconnectAsync();
await Task.Delay(500);
Assert.AreEqual(0, (await server.GetClientStatusAsync()).Count);
Assert.AreEqual(0, (await server.GetClientsAsync()).Count);
}
}
@@ -965,7 +970,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
server.InterceptingSubscriptionAsync += e =>
{
// This should lead to no subscriptions for "n" at all. So also no sending of retained messages.
if (e.TopicFilter.Topic == "n")
@@ -1021,7 +1026,7 @@ namespace MQTTnet.Tests.Server
await client1.DisconnectAsync();
await Task.Delay(500);
var clientStatus = await server.GetClientStatusAsync();
var clientStatus = await server.GetClientsAsync();
Assert.AreEqual(0, clientStatus.Count);
var client2 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("b"));
@@ -1032,8 +1037,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
clientStatus = await server.GetClientStatusAsync();
var sessionStatus = await server.GetSessionStatusAsync();
clientStatus = await server.GetClientsAsync();
var sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(0, clientStatus.Count);
Assert.AreEqual(2, sessionStatus.Count);
@@ -2,6 +2,7 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Diagnostics;
using MQTTnet.Packets;
using MQTTnet.Protocol;
using MQTTnet.Server;
@@ -12,19 +13,37 @@ namespace MQTTnet.Tests.Server
[TestClass]
public sealed class MqttSubscriptionsManager_Tests : BaseTestClass
{
MqttClientSubscriptionsManager _subscriptionsManager;
[TestInitialize]
public void TestInitialize()
{
var logger = new TestLogger();
var options = new MqttServerOptions();
var retainedMessagesManager = new MqttRetainedMessagesManager(new MqttServerEventContainer(), logger);
var eventContainer = new MqttServerEventContainer();
var session = new MqttSession(
"",
new ConcurrentDictionary<object, object>(),
options,
eventContainer,
retainedMessagesManager,
new MqttClientSessionsManager(options, retainedMessagesManager, eventContainer, logger));
_subscriptionsManager = new MqttClientSubscriptionsManager(session, new MqttServerOptions(), new MqttServerEventContainer(),
new MqttRetainedMessagesManager(new MqttServerEventContainer(), new MqttNetNullLogger()));
}
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeSingleSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "");
var result = _subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "");
Assert.IsTrue(result.IsSubscribed);
Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
}
@@ -32,16 +51,12 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeDifferentQoSSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilter { Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
sp.TopicFilters.Add(new MqttTopicFilter {Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce});
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");
var result = _subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");
Assert.IsTrue(result.IsSubscribed);
Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
}
@@ -49,17 +64,13 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeTwoTimesSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilter { Topic = "#", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
sp.TopicFilters.Add(new MqttTopicFilter { Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
sp.TopicFilters.Add(new MqttTopicFilter {Topic = "#", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce});
sp.TopicFilters.Add(new MqttTopicFilter {Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce});
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");
var result = _subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");
Assert.IsTrue(result.IsSubscribed);
Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtLeastOnce);
}
@@ -67,53 +78,29 @@ namespace MQTTnet.Tests.Server
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeSingleNoSuccess()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
Assert.IsFalse(sm.CheckSubscriptions("A/B/X", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
Assert.IsFalse(_subscriptionsManager.CheckSubscriptions("A/B/X", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
}
[TestMethod]
public async Task MqttSubscriptionsManager_SubscribeAndUnsubscribeSingle()
{
var s = CreateSession();
var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventContainer(), new MqttRetainedMessagesManager());
var sp = new MqttSubscribePacket();
sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());
await sm.Subscribe(sp, CancellationToken.None);
await _subscriptionsManager.Subscribe(sp, CancellationToken.None);
Assert.IsTrue(sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
Assert.IsTrue(_subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
var up = new MqttUnsubscribePacket();
up.TopicFilters.Add("A/B/C");
await sm.Unsubscribe(up, CancellationToken.None);
await _subscriptionsManager.Unsubscribe(up, CancellationToken.None);
Assert.IsFalse(sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
}
MqttClientSession CreateSession()
{
var logger = new TestLogger();
var options = new MqttServerOptions();
var retainedMessagesManager = new MqttRetainedMessagesManager();
var eventContainer = new MqttServerEventContainer();
return new MqttClientSession(
"",
new ConcurrentDictionary<object, object>(),
options,
eventContainer,
retainedMessagesManager,
new MqttClientSessionsManager(options, retainedMessagesManager, eventContainer, logger));
Assert.IsFalse(_subscriptionsManager.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "").IsSubscribed);
}
}
}
}
@@ -61,7 +61,7 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
if (e.Username != "UserName1")
{
@@ -19,7 +19,7 @@ namespace MQTTnet.Tests.Server
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
e.ReasonCode = MqttConnectReasonCode.ServerMoved;
e.ServerReference = "new_server";
@@ -20,7 +20,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
// Don't validate anything. Just set some session items.
e.SessionItems["can_subscribe_x"] = true;
@@ -29,7 +29,7 @@ namespace MQTTnet.Tests.Server
return Task.CompletedTask;
};
server.InterceptingClientSubscriptionAsync += e =>
server.InterceptingSubscriptionAsync += e =>
{
if (e.TopicFilter.Topic == "x")
{
@@ -42,7 +42,7 @@ namespace MQTTnet.Tests.Server
return Task.CompletedTask;
};
server.InterceptingClientPublishAsync += e =>
server.InterceptingPublishAsync += e =>
{
e.ApplicationMessage.Payload =
Encoding.UTF8.GetBytes(
@@ -80,7 +80,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.ValidatingClientConnectionAsync += e =>
server.ValidatingConnectionAsync += e =>
{
// Don't validate anything. Just set some session items.
e.SessionItems["can_subscribe_x"] = true;
@@ -91,7 +91,7 @@ namespace MQTTnet.Tests.Server
await testEnvironment.ConnectClient();
var sessionStatus = await testEnvironment.Server.GetSessionStatusAsync();
var sessionStatus = await testEnvironment.Server.GetSessionsAsync();
var session = sessionStatus.First();
Assert.AreEqual(true, session.Items["can_subscribe_x"]);
@@ -128,7 +128,7 @@ namespace MQTTnet.Tests.Server
var client = await testEnvironment.ConnectClient();
// Arrange session status tracking.
var status = await server.GetSessionStatusAsync();
var status = await server.GetSessionsAsync();
var clientStatus = status[0];
var deletedEventFired = false;
@@ -158,7 +158,7 @@ namespace MQTTnet.Tests.Server
var messageReceivedHandler = testEnvironment.CreateApplicationMessageHandler(client);
// Arrange session status tracking.
var status = await server.GetSessionStatusAsync();
var status = await server.GetSessionsAsync();
var clientStatus = status[0];
// Act: Inject the application message.
+12 -12
View File
@@ -23,8 +23,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
var clientStatus = await server.GetClientStatusAsync();
var sessionStatus = await server.GetSessionStatusAsync();
var clientStatus = await server.GetClientsAsync();
var sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(2, clientStatus.Count);
Assert.AreEqual(2, sessionStatus.Count);
@@ -37,8 +37,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
clientStatus = await server.GetClientStatusAsync();
sessionStatus = await server.GetSessionStatusAsync();
clientStatus = await server.GetClientsAsync();
sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(0, clientStatus.Count);
Assert.AreEqual(0, sessionStatus.Count);
@@ -56,7 +56,7 @@ namespace MQTTnet.Tests.Server
await Task.Delay(1000);
var clientStatus = await server.GetClientStatusAsync();
var clientStatus = await server.GetClientsAsync();
Assert.AreEqual(1, clientStatus.Count);
Assert.IsTrue(clientStatus.Any(s => s.ClientId == c1.Options.ClientId));
@@ -67,7 +67,7 @@ namespace MQTTnet.Tests.Server
Assert.IsFalse(c1.IsConnected);
clientStatus = await server.GetClientStatusAsync();
clientStatus = await server.GetClientsAsync();
Assert.AreEqual(0, clientStatus.Count);
}
@@ -87,8 +87,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
var clientStatus = await server.GetClientStatusAsync();
var sessionStatus = await server.GetSessionStatusAsync();
var clientStatus = await server.GetClientsAsync();
var sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(1, clientStatus.Count);
Assert.AreEqual(2, sessionStatus.Count);
@@ -97,8 +97,8 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
clientStatus = await server.GetClientStatusAsync();
sessionStatus = await server.GetSessionStatusAsync();
clientStatus = await server.GetClientsAsync();
sessionStatus = await server.GetSessionsAsync();
Assert.AreEqual(0, clientStatus.Count);
Assert.AreEqual(2, sessionStatus.Count);
@@ -119,7 +119,7 @@ namespace MQTTnet.Tests.Server
await c1.PublishAsync("a");
await Task.Delay(50);
var clientStatus = await server.GetClientStatusAsync();
var clientStatus = await server.GetClientsAsync();
Assert.AreEqual(i, clientStatus.First().SentApplicationMessagesCount);
Assert.AreEqual(0, clientStatus.First().ReceivedApplicationMessagesCount);
}
@@ -143,7 +143,7 @@ namespace MQTTnet.Tests.Server
await Task.Delay(500);
var clientStatus = await server.GetClientStatusAsync();
var clientStatus = await server.GetClientsAsync();
Assert.AreEqual(i, clientStatus.First().SentApplicationMessagesCount, "SAMC invalid!");
@@ -20,7 +20,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
server.InterceptingSubscriptionAsync += e =>
{
// Set the topic to "a" regards what the client wants to subscribe.
e.TopicFilter.Topic = "a";
@@ -290,7 +290,7 @@ namespace MQTTnet.Tests.Server
{
var server = await testEnvironment.StartServer();
server.InterceptingClientSubscriptionAsync += e =>
server.InterceptingSubscriptionAsync += e =>
{
if (e.TopicFilter.Topic == "not_allowed_topic")
{