Merge from develop.

This commit is contained in:
Christian Kratky
2018-12-09 20:48:46 +01:00
27 changed files with 837 additions and 225 deletions
+114 -21
View File
@@ -4,6 +4,7 @@ using MQTTnet.Diagnostics;
using MQTTnet.Protocol;
using MQTTnet.Server;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -227,6 +228,39 @@ namespace MQTTnet.Core.Tests
Assert.AreEqual(2000, receivedMessagesCount);
}
[TestMethod]
public async Task MqttServer_SessionTakeover()
{
var server = new MqttFactory().CreateMqttServer();
try
{
await server.StartAsync(new MqttServerOptions());
var client1 = new MqttFactory().CreateMqttClient();
var client2 = new MqttFactory().CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("localhost")
.WithCleanSession(false)
.WithClientId("a").Build();
await client1.ConnectAsync(options);
await Task.Delay(500);
await client2.ConnectAsync(options);
await Task.Delay(500);
Assert.IsFalse(client1.IsConnected);
Assert.IsTrue(client2.IsConnected);
}
finally
{
await server.StopAsync();
}
}
private static async Task Publish(IMqttClient c1, MqttApplicationMessage message)
{
@@ -267,11 +301,6 @@ namespace MQTTnet.Core.Tests
[TestMethod]
public async Task MqttServer_HandleCleanDisconnect()
{
MqttNetGlobalLogger.LogMessagePublished += (_, e) =>
{
System.Diagnostics.Debug.WriteLine($"[{e.TraceMessage.Timestamp:s}] {e.TraceMessage.Source} {e.TraceMessage.Message}");
};
var serverAdapter = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger());
var s = new MqttFactory().CreateMqttServer(new[] { serverAdapter }, new MqttNetLogger());
@@ -304,6 +333,51 @@ namespace MQTTnet.Core.Tests
Assert.AreEqual(clientConnectedCalled, clientDisconnectedCalled);
}
[TestMethod]
public async Task MqttServer_Client_Disconnect_Without_Errors()
{
var errors = 0;
MqttNetGlobalLogger.LogMessagePublished += (_, e) =>
{
System.Diagnostics.Debug.WriteLine($"[{e.TraceMessage.Timestamp:s}] {e.TraceMessage.Source} {e.TraceMessage.Message}");
if (e.TraceMessage.Level == MqttNetLogLevel.Error)
{
errors++;
}
};
bool clientWasConnected;
var server = new MqttFactory().CreateMqttServer();
try
{
var options = new MqttServerOptionsBuilder().Build();
await server.StartAsync(options);
var client = new MqttFactory().CreateMqttClient();
var clientOptions = new MqttClientOptionsBuilder()
.WithTcpServer("localhost")
.Build();
await client.ConnectAsync(clientOptions);
clientWasConnected = true;
await client.DisconnectAsync();
await Task.Delay(500);
}
finally
{
await server.StopAsync();
}
Assert.IsTrue(clientWasConnected);
Assert.AreEqual(0, errors);
}
[TestMethod]
public async Task MqttServer_LotsOfRetainedMessages()
{
@@ -389,6 +463,8 @@ namespace MQTTnet.Core.Tests
}
await c2.DisconnectAsync();
await s.StopAsync();
}
[TestMethod]
@@ -427,7 +503,7 @@ namespace MQTTnet.Core.Tests
var serverAdapter = new TestMqttServerAdapter();
var s = new MqttFactory().CreateMqttServer(new[] { serverAdapter }, new MqttNetLogger());
var receivedMessagesCount = 0;
var receivedMessages = new List<MqttApplicationMessage>();
try
{
await s.StartAsync(new MqttServerOptions());
@@ -437,7 +513,14 @@ namespace MQTTnet.Core.Tests
await c1.DisconnectAsync();
var c2 = await serverAdapter.ConnectTestClient("c2");
c2.ApplicationMessageReceived += (_, __) => receivedMessagesCount++;
c2.ApplicationMessageReceived += (_, e) =>
{
lock (receivedMessages)
{
receivedMessages.Add(e.ApplicationMessage);
}
};
await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("retained").Build());
await Task.Delay(500);
@@ -447,7 +530,8 @@ namespace MQTTnet.Core.Tests
await s.StopAsync();
}
Assert.AreEqual(1, receivedMessagesCount);
Assert.AreEqual(1, receivedMessages.Count);
Assert.IsTrue(receivedMessages.First().Retain);
}
[TestMethod]
@@ -655,26 +739,29 @@ namespace MQTTnet.Core.Tests
[TestMethod]
public async Task MqttServer_SameClientIdConnectDisconnectEventOrder()
{
var serverAdapter = new MqttTcpServerAdapter(new MqttNetLogger().CreateChildLogger());
var s = new MqttFactory().CreateMqttServer(new[] { serverAdapter }, new MqttNetLogger());
var s = new MqttFactory().CreateMqttServer();
var connectedClient = false;
var connecteCalledBeforeConnectedClients = false;
var events = new List<string>();
s.ClientConnected += (_, __) =>
{
connecteCalledBeforeConnectedClients |= connectedClient;
connectedClient = true;
lock (events)
{
events.Add("c");
}
};
s.ClientDisconnected += (_, __) =>
{
connectedClient = false;
lock (events)
{
events.Add("d");
}
};
var clientOptions = new MqttClientOptionsBuilder()
.WithTcpServer("localhost")
.WithClientId(Guid.NewGuid().ToString())
.WithClientId("same_id")
.Build();
await s.StartAsync(new MqttServerOptions());
@@ -684,20 +771,24 @@ namespace MQTTnet.Core.Tests
await c1.ConnectAsync(clientOptions);
await Task.Delay(100);
await Task.Delay(250);
await c2.ConnectAsync(clientOptions);
await Task.Delay(100);
await Task.Delay(250);
await c1.DisconnectAsync();
await Task.Delay(250);
await c2.DisconnectAsync();
await Task.Delay(250);
await s.StopAsync();
await Task.Delay(100);
Assert.IsFalse(connecteCalledBeforeConnectedClients, "ClientConnected was called before ClientDisconnect was called");
var flow = string.Join(string.Empty, events);
Assert.AreEqual("cdcd", flow);
}
@@ -725,6 +816,8 @@ namespace MQTTnet.Core.Tests
await server.StartAsync(new MqttServerOptions());
var client3 = new MqttFactory().CreateMqttClient();
await client3.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("localhost").Build());
await server.StopAsync();
}
private class TestStorage : IMqttServerStorage