public async Task MqttServer_LotsOfRetainedMessages() { const int ClientCount = 100; var server = new MqttFactory().CreateMqttServer(); try { await server.StartAsync(new MqttServerOptionsBuilder().Build()); Parallel.For( 0, ClientCount, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i => { using (var client = new MqttFactory().CreateMqttClient()) { client.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("localhost").Build()) .GetAwaiter().GetResult(); for (var j = 0; j < 10; j++) { // Clear retained message. client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("r" + i) .WithPayload(new byte[0]).WithRetainFlag().Build()).GetAwaiter().GetResult(); // Set retained message. client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("r" + i) .WithPayload("value" + j).WithRetainFlag().Build()).GetAwaiter().GetResult(); } client.DisconnectAsync().GetAwaiter().GetResult(); } }); await Task.Delay(100); var retainedMessages = server.GetRetainedMessages(); Assert.AreEqual(ClientCount, retainedMessages.Count); for (var i = 0; i < ClientCount; i++) { Assert.IsTrue(retainedMessages.Any(m => m.Topic == "r" + i)); } } finally { await server.StopAsync(); } }