mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-29 18:02:48 +08:00
Fix Unit Tests.
This commit is contained in:
@@ -228,6 +228,7 @@ namespace MQTTnet.Extensions.ManagedClient
|
|||||||
_unsubscriptions.Remove(topicFilter.Topic);
|
_unsubscriptions.Remove(topicFilter.Topic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_subscriptionsQueuedSignal.Release();
|
_subscriptionsQueuedSignal.Release();
|
||||||
|
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
@@ -305,7 +306,9 @@ namespace MQTTnet.Extensions.ManagedClient
|
|||||||
|
|
||||||
_logger.Info("Stopped");
|
_logger.Info("Stopped");
|
||||||
}
|
}
|
||||||
|
|
||||||
_reconnectSubscriptions.Clear();
|
_reconnectSubscriptions.Clear();
|
||||||
|
|
||||||
lock (_subscriptions)
|
lock (_subscriptions)
|
||||||
{
|
{
|
||||||
_subscriptions.Clear();
|
_subscriptions.Clear();
|
||||||
|
|||||||
@@ -79,6 +79,8 @@ namespace MQTTnet.Tests
|
|||||||
[TestMethod]
|
[TestMethod]
|
||||||
public async Task TimeoutAfterMemoryUsage()
|
public async Task TimeoutAfterMemoryUsage()
|
||||||
{
|
{
|
||||||
|
var initialMemory = GC.GetTotalMemory(true);
|
||||||
|
|
||||||
var tasks = Enumerable.Range(0, 100000)
|
var tasks = Enumerable.Range(0, 100000)
|
||||||
.Select(i =>
|
.Select(i =>
|
||||||
{
|
{
|
||||||
@@ -87,10 +89,10 @@ namespace MQTTnet.Tests
|
|||||||
});
|
});
|
||||||
|
|
||||||
await Task.WhenAll(tasks);
|
await Task.WhenAll(tasks);
|
||||||
AssertIsLess(3_000_000, GC.GetTotalMemory(true));
|
AssertIsLess(initialMemory + 2_000_000, GC.GetTotalMemory(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void AssertIsLess(long bound, long actual)
|
static void AssertIsLess(long bound, long actual)
|
||||||
{
|
{
|
||||||
if (bound < actual)
|
if (bound < actual)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ namespace MQTTnet.Tests
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
await client.SendAsync(MqttPingReqPacket.Instance, CancellationToken.None).ConfigureAwait(false);
|
await client.SendAsync(MqttPingReqPacket.Instance, CancellationToken.None).ConfigureAwait(false);
|
||||||
|
await client.SendAsync(MqttPingReqPacket.Instance, CancellationToken.None).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (MqttCommunicationException exception)
|
catch (MqttCommunicationException exception)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ namespace MQTTnet.Tests
|
|||||||
using (var testEnvironment = new TestEnvironment(TestContext))
|
using (var testEnvironment = new TestEnvironment(TestContext))
|
||||||
{
|
{
|
||||||
var receivedMessagesCount = 0;
|
var receivedMessagesCount = 0;
|
||||||
|
|
||||||
await testEnvironment.StartServerAsync();
|
await testEnvironment.StartServerAsync();
|
||||||
|
|
||||||
var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").WithAtMostOnceQoS().Build();
|
var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").WithAtMostOnceQoS().Build();
|
||||||
@@ -270,14 +270,17 @@ namespace MQTTnet.Tests
|
|||||||
var connectionCheckInterval = TimeSpan.FromSeconds(10);
|
var connectionCheckInterval = TimeSpan.FromSeconds(10);
|
||||||
var managedClient = await CreateManagedClientAsync(testEnvironment, null, connectionCheckInterval);
|
var managedClient = await CreateManagedClientAsync(testEnvironment, null, connectionCheckInterval);
|
||||||
var sendingClient = await testEnvironment.ConnectClientAsync();
|
var sendingClient = await testEnvironment.ConnectClientAsync();
|
||||||
|
|
||||||
await sendingClient.PublishAsync(new MqttApplicationMessage { Topic = "topic", Payload = new byte[] { 1 }, Retain = true });
|
await sendingClient.PublishAsync(new MqttApplicationMessage { Topic = "topic", Payload = new byte[] { 1 }, Retain = true });
|
||||||
|
|
||||||
await managedClient.SubscribeAsync("topic");
|
|
||||||
|
|
||||||
var subscribeTime = DateTime.UtcNow;
|
var subscribeTime = DateTime.UtcNow;
|
||||||
|
|
||||||
var messages = await SetupReceivingOfMessages(managedClient, 1);
|
var messagesTask = SetupReceivingOfMessages(managedClient, 1);
|
||||||
|
|
||||||
|
await managedClient.SubscribeAsync("topic");
|
||||||
|
|
||||||
|
var messages = await messagesTask;
|
||||||
|
|
||||||
var elapsed = DateTime.UtcNow - subscribeTime;
|
var elapsed = DateTime.UtcNow - subscribeTime;
|
||||||
Assert.IsTrue(elapsed < TimeSpan.FromSeconds(1), $"Subscriptions must be activated immediately, this one took {elapsed}");
|
Assert.IsTrue(elapsed < TimeSpan.FromSeconds(1), $"Subscriptions must be activated immediately, this one took {elapsed}");
|
||||||
Assert.AreEqual(messages.Single().Topic, "topic");
|
Assert.AreEqual(messages.Single().Topic, "topic");
|
||||||
@@ -308,7 +311,7 @@ namespace MQTTnet.Tests
|
|||||||
|
|
||||||
var clientOptions = new MqttClientOptionsBuilder()
|
var clientOptions = new MqttClientOptionsBuilder()
|
||||||
.WithTcpServer("localhost", testEnvironment.ServerPort);
|
.WithTcpServer("localhost", testEnvironment.ServerPort);
|
||||||
|
|
||||||
var receivedManagedMessages = new List<MqttApplicationMessage>();
|
var receivedManagedMessages = new List<MqttApplicationMessage>();
|
||||||
var managedClient = new ManagedMqttClient(testEnvironment.CreateClient(), new MqttNetLogger());
|
var managedClient = new ManagedMqttClient(testEnvironment.CreateClient(), new MqttNetLogger());
|
||||||
managedClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(c =>
|
managedClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(c =>
|
||||||
@@ -350,9 +353,9 @@ namespace MQTTnet.Tests
|
|||||||
}
|
}
|
||||||
|
|
||||||
async Task<ManagedMqttClient> CreateManagedClientAsync(
|
async Task<ManagedMqttClient> CreateManagedClientAsync(
|
||||||
TestEnvironment testEnvironment,
|
TestEnvironment testEnvironment,
|
||||||
IMqttClient underlyingClient = null,
|
IMqttClient underlyingClient = null,
|
||||||
TimeSpan? connectionCheckInterval = null)
|
TimeSpan? connectionCheckInterval = null)
|
||||||
{
|
{
|
||||||
await testEnvironment.StartServerAsync();
|
await testEnvironment.StartServerAsync();
|
||||||
|
|
||||||
@@ -368,8 +371,7 @@ namespace MQTTnet.Tests
|
|||||||
// at connection check intervals
|
// at connection check intervals
|
||||||
managedOptions.ConnectionCheckInterval = connectionCheckInterval ?? TimeSpan.FromSeconds(0.1);
|
managedOptions.ConnectionCheckInterval = connectionCheckInterval ?? TimeSpan.FromSeconds(0.1);
|
||||||
|
|
||||||
var managedClient =
|
var managedClient = new ManagedMqttClient(underlyingClient ?? testEnvironment.CreateClient(), new MqttNetLogger());
|
||||||
new ManagedMqttClient(underlyingClient ?? testEnvironment.CreateClient(), new MqttNetLogger());
|
|
||||||
|
|
||||||
var connected = GetConnectedTask(managedClient);
|
var connected = GetConnectedTask(managedClient);
|
||||||
|
|
||||||
@@ -401,17 +403,19 @@ namespace MQTTnet.Tests
|
|||||||
Task<List<MqttApplicationMessage>> SetupReceivingOfMessages(ManagedMqttClient managedClient, int expectedNumberOfMessages)
|
Task<List<MqttApplicationMessage>> SetupReceivingOfMessages(ManagedMqttClient managedClient, int expectedNumberOfMessages)
|
||||||
{
|
{
|
||||||
var receivedMessages = new List<MqttApplicationMessage>();
|
var receivedMessages = new List<MqttApplicationMessage>();
|
||||||
var allReceived = new TaskCompletionSource<List<MqttApplicationMessage>>();
|
var result = new TaskCompletionSource<List<MqttApplicationMessage>>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
|
|
||||||
managedClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(r =>
|
managedClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(r =>
|
||||||
{
|
{
|
||||||
receivedMessages.Add(r.ApplicationMessage);
|
receivedMessages.Add(r.ApplicationMessage);
|
||||||
|
|
||||||
if (receivedMessages.Count == expectedNumberOfMessages)
|
if (receivedMessages.Count == expectedNumberOfMessages)
|
||||||
{
|
{
|
||||||
allReceived.SetResult(receivedMessages);
|
result.TrySetResult(receivedMessages);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return allReceived.Task;
|
return result.Task;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -188,8 +188,18 @@ namespace MQTTnet.Tests.Mockups
|
|||||||
{
|
{
|
||||||
foreach (var mqttClient in _clients)
|
foreach (var mqttClient in _clients)
|
||||||
{
|
{
|
||||||
mqttClient.DisconnectAsync().GetAwaiter().GetResult();
|
try
|
||||||
mqttClient?.Dispose();
|
{
|
||||||
|
mqttClient.DisconnectAsync().GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
catch (ObjectDisposedException)
|
||||||
|
{
|
||||||
|
// This can happen when the test already disconnected the client.
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
mqttClient?.Dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Server?.StopAsync().GetAwaiter().GetResult();
|
Server?.StopAsync().GetAwaiter().GetResult();
|
||||||
|
|||||||
@@ -415,33 +415,27 @@ namespace MQTTnet.Tests
|
|||||||
public async Task Publish_Multiple_Clients()
|
public async Task Publish_Multiple_Clients()
|
||||||
{
|
{
|
||||||
var receivedMessagesCount = 0;
|
var receivedMessagesCount = 0;
|
||||||
var locked = new object();
|
|
||||||
|
|
||||||
using (var testEnvironment = new TestEnvironment(TestContext))
|
using (var testEnvironment = new TestEnvironment(TestContext))
|
||||||
{
|
{
|
||||||
await testEnvironment.StartServerAsync();
|
await testEnvironment.StartServerAsync();
|
||||||
|
|
||||||
var c1 = await testEnvironment.ConnectClientAsync();
|
var c1 = await testEnvironment.ConnectClientAsync();
|
||||||
var c2 = await testEnvironment.ConnectClientAsync();
|
var c2 = await testEnvironment.ConnectClientAsync();
|
||||||
|
var c3 = await testEnvironment.ConnectClientAsync();
|
||||||
c1.UseApplicationMessageReceivedHandler(c =>
|
|
||||||
{
|
|
||||||
lock (locked)
|
|
||||||
{
|
|
||||||
receivedMessagesCount++;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
c2.UseApplicationMessageReceivedHandler(c =>
|
c2.UseApplicationMessageReceivedHandler(c =>
|
||||||
{
|
{
|
||||||
lock (locked)
|
Interlocked.Increment(ref receivedMessagesCount);
|
||||||
{
|
});
|
||||||
receivedMessagesCount++;
|
|
||||||
}
|
c3.UseApplicationMessageReceivedHandler(c =>
|
||||||
|
{
|
||||||
|
Interlocked.Increment(ref receivedMessagesCount);
|
||||||
});
|
});
|
||||||
|
|
||||||
await c1.SubscribeAsync(new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce }).ConfigureAwait(false);
|
|
||||||
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce }).ConfigureAwait(false);
|
await c2.SubscribeAsync(new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce }).ConfigureAwait(false);
|
||||||
|
await c3.SubscribeAsync(new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce }).ConfigureAwait(false);
|
||||||
|
|
||||||
var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build();
|
var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build();
|
||||||
|
|
||||||
@@ -450,8 +444,8 @@ namespace MQTTnet.Tests
|
|||||||
await c1.PublishAsync(message).ConfigureAwait(false);
|
await c1.PublishAsync(message).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
await Task.Delay(5000);
|
SpinWait.SpinUntil(() => receivedMessagesCount == 1000, TimeSpan.FromSeconds(10));
|
||||||
|
|
||||||
Assert.AreEqual(1000, receivedMessagesCount);
|
Assert.AreEqual(1000, receivedMessagesCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user