Merge branch 'feature/server-project-bootstrap' into develop

This commit is contained in:
Christian Kratky
2019-03-10 19:57:32 +01:00
127 changed files with 2952 additions and 490 deletions
@@ -14,6 +14,7 @@
<ItemGroup>
<ProjectReference Include="..\..\Source\MQTTnet.Extensions.ManagedClient\MQTTnet.Extensions.ManagedClient.csproj" />
<ProjectReference Include="..\..\Source\MQTTnet.Extensions.Rpc\MQTTnet.Extensions.Rpc.csproj" />
<ProjectReference Include="..\..\Source\MQTTnet\MQTTnet.csproj" />
</ItemGroup>
@@ -4,6 +4,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using MQTTnet.Client.Publishing;
using MQTTnet.Client.Receiving;
using MQTTnet.Client.Subscribing;
using MQTTnet.Client.Unsubscribing;
using MQTTnet.Formatter;
@@ -213,13 +214,13 @@ namespace MQTTnet.Tests.MQTTv5
var receivedMessages = new List<MqttApplicationMessageReceivedEventArgs>();
await client1.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1").WithClientId("client1").WithProtocolVersion(MqttProtocolVersion.V500).Build());
client1.ApplicationMessageReceived += (s, e) =>
client1.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
{
lock (receivedMessages)
{
receivedMessages.Add(e);
}
};
});
await client1.SubscribeAsync("a");
@@ -14,7 +14,9 @@ namespace MQTTnet.Tests.Mockups
public TestMqttCommunicationAdapter Partner { get; set; }
public string Endpoint { get; }
public string Endpoint { get; } = string.Empty;
public bool IsSecureConnection { get; } = false;
public MqttPacketFormatterAdapter PacketFormatterAdapter { get; } = new MqttPacketFormatterAdapter(MqttProtocolVersion.V311);
@@ -11,7 +11,7 @@ namespace MQTTnet.Tests.Mockups
{
public class TestMqttServerAdapter : IMqttServerAdapter
{
public event EventHandler<MqttServerAdapterClientAcceptedEventArgs> ClientAccepted;
public Action<MqttServerAdapterClientAcceptedEventArgs> ClientAcceptedHandler { get; set; }
public async Task<IMqttClient> ConnectTestClient(string clientId, MqttApplicationMessage willMessage = null)
{
@@ -41,7 +41,7 @@ namespace MQTTnet.Tests.Mockups
private void FireClientAcceptedEvent(IMqttChannelAdapter adapter)
{
ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(adapter));
ClientAcceptedHandler?.Invoke(new MqttServerAdapterClientAcceptedEventArgs(adapter));
}
public Task StartAsync(IMqttServerOptions options)
@@ -1,38 +0,0 @@
using System.Threading.Tasks;
using MQTTnet.Client;
using MQTTnet.Server;
namespace MQTTnet.Tests.Mockups
{
public static class TestServerExtensions
{
/// <summary>
/// publishes a message with a client and waits in the server until a message with the same topic is received
/// </summary>
/// <returns></returns>
public static async Task PublishAndWaitForAsync(this IMqttClient client, IMqttServer server, MqttApplicationMessage message)
{
var tcs = new TaskCompletionSource<object>();
void Handler(object sender, MqttApplicationMessageReceivedEventArgs args)
{
if (args.ApplicationMessage.Topic == message.Topic)
{
tcs.SetResult(true);
}
}
server.ApplicationMessageReceived += Handler;
try
{
await client.PublishAsync(message).ConfigureAwait(false);
await tcs.Task.ConfigureAwait(false);
}
finally
{
server.ApplicationMessageReceived -= Handler;
}
}
}
}
+19 -18
View File
@@ -5,8 +5,9 @@ using System.Net.Sockets;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Client;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Client.Options;
using MQTTnet.Client.Receiving;
using MQTTnet.Exceptions;
using MQTTnet.Protocol;
using MQTTnet.Server;
@@ -45,10 +46,10 @@ namespace MQTTnet.Tests
using (var client = factory.CreateMqttClient())
{
Exception ex = null;
client.Disconnected += (s, e) =>
client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(e =>
{
ex = e.Exception;
};
});
try
{
@@ -81,9 +82,9 @@ namespace MQTTnet.Tests
var receivedValues = new List<int>();
async Task Handler1(MqttApplicationMessageHandlerContext context)
async Task Handler1(MqttApplicationMessageReceivedEventArgs eventArgs)
{
var value = int.Parse(context.ApplicationMessage.ConvertPayloadToString());
var value = int.Parse(eventArgs.ApplicationMessage.ConvertPayloadToString());
await Task.Delay(value);
lock (receivedValues)
@@ -92,7 +93,7 @@ namespace MQTTnet.Tests
}
}
client1.UseReceivedApplicationMessageHandler(Handler1);
client1.UseApplicationMessageReceivedHandler(Handler1);
var client2 = await testEnvironment.ConnectClientAsync();
for (var i = MessagesCount; i > 0; i--)
@@ -119,27 +120,27 @@ namespace MQTTnet.Tests
var client1 = await testEnvironment.ConnectClientAsync();
await client1.SubscribeAsync("request/+");
async Task Handler1(MqttApplicationMessageHandlerContext context)
async Task Handler1(MqttApplicationMessageReceivedEventArgs eventArgs)
{
await client1.PublishAsync($"reply/{context.ApplicationMessage.Topic}");
await client1.PublishAsync($"reply/{eventArgs.ApplicationMessage.Topic}");
}
client1.UseReceivedApplicationMessageHandler(Handler1);
client1.UseApplicationMessageReceivedHandler(Handler1);
var client2 = await testEnvironment.ConnectClientAsync();
await client2.SubscribeAsync("reply/#");
var replies = new List<string>();
void Handler2(MqttApplicationMessageHandlerContext context)
void Handler2(MqttApplicationMessageReceivedEventArgs eventArgs)
{
lock (replies)
{
replies.Add(context.ApplicationMessage.Topic);
replies.Add(eventArgs.ApplicationMessage.Topic);
}
}
client2.UseReceivedApplicationMessageHandler((Action<MqttApplicationMessageHandlerContext>)Handler2);
client2.UseApplicationMessageReceivedHandler((Action<MqttApplicationMessageReceivedEventArgs>)Handler2);
await Task.Delay(500);
@@ -163,7 +164,7 @@ namespace MQTTnet.Tests
var receivedMessages = new List<MqttApplicationMessage>();
var client1 = await testEnvironment.ConnectClientAsync();
client1.UseReceivedApplicationMessageHandler(c =>
client1.UseApplicationMessageReceivedHandler(c =>
{
lock (receivedMessages)
{
@@ -195,7 +196,7 @@ namespace MQTTnet.Tests
var client = testEnvironment.CreateClient();
client.Connected += async (s, e) =>
client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(async e =>
{
await client.SubscribeAsync("RCU/P1/H0001/R0003");
@@ -204,9 +205,9 @@ namespace MQTTnet.Tests
.WithTopic("RCU/P1/H0001/R0003");
await client.PublishAsync(msg.Build());
};
});
client.UseReceivedApplicationMessageHandler(c =>
client.UseApplicationMessageReceivedHandler(c =>
{
lock (receivedMessages)
{
@@ -241,7 +242,7 @@ namespace MQTTnet.Tests
var retries = 0;
async Task Handler1(MqttApplicationMessageHandlerContext context)
async Task Handler1(MqttApplicationMessageReceivedEventArgs eventArgs)
{
retries++;
@@ -249,7 +250,7 @@ namespace MQTTnet.Tests
throw new Exception("Broken!");
}
client1.UseReceivedApplicationMessageHandler(Handler1);
client1.UseApplicationMessageReceivedHandler(Handler1);
var client2 = await testEnvironment.ConnectClientAsync();
await client2.PublishAsync("x");
+1 -1
View File
@@ -59,7 +59,7 @@ namespace MQTTnet.Tests
//wait at least connect timeout or we have some log messages
var tcs = new TaskCompletionSource<object>();
managedClient.ConnectingFailed += (s, e) => tcs.TrySetResult(null);
managedClient.ConnectingFailedHandler = new ConnectingFailedHandlerDelegate(e => tcs.TrySetResult(null));
await Task.WhenAny(Task.Delay(managedClient.Options.ClientOptions.CommunicationTimeout), tcs.Task);
}
finally
+55
View File
@@ -0,0 +1,55 @@
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Tests.Mockups;
using MQTTnet.Client;
using MQTTnet.Client.Receiving;
using MQTTnet.Exceptions;
using MQTTnet.Extensions.Rpc;
using MQTTnet.Protocol;
namespace MQTTnet.Tests
{
[TestClass]
public class RPC_Tests
{
[TestMethod]
public async Task Execute_Success()
{
using (var testEnvironment = new TestEnvironment())
{
await testEnvironment.StartServerAsync();
var responseSender = await testEnvironment.ConnectClientAsync();
await responseSender.SubscribeAsync("MQTTnet.RPC/+/ping");
responseSender.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(async e =>
{
await responseSender.PublishAsync(e.ApplicationMessage.Topic + "/response", "pong");
});
var requestSender = await testEnvironment.ConnectClientAsync();
var rpcClient = new MqttRpcClient(requestSender);
var response = await rpcClient.ExecuteAsync(TimeSpan.FromSeconds(5), "ping", "", MqttQualityOfServiceLevel.AtMostOnce);
Assert.AreEqual("pong", Encoding.UTF8.GetString(response));
}
}
[TestMethod]
[ExpectedException(typeof(MqttCommunicationTimedOutException))]
public async Task Execute_Timeout()
{
using (var testEnvironment = new TestEnvironment())
{
await testEnvironment.StartServerAsync();
var requestSender = await testEnvironment.ConnectClientAsync();
var rpcClient = new MqttRpcClient(requestSender);
await rpcClient.ExecuteAsync(TimeSpan.FromSeconds(2), "ping", "", MqttQualityOfServiceLevel.AtMostOnce);
}
}
}
}
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using MQTTnet.Client.Receiving;
using MQTTnet.Server;
namespace MQTTnet.Tests
@@ -29,10 +30,10 @@ namespace MQTTnet.Tests
TaskCompletionSource<string> response = null;
receiverClient.ApplicationMessageReceived += (sender, args) =>
receiverClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(args =>
{
response?.SetResult(args.ApplicationMessage.ConvertPayloadToString());
};
});
var times = new List<TimeSpan>();
var stopwatch = Stopwatch.StartNew();
+32 -33
View File
@@ -9,7 +9,9 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
using MQTTnet.Adapter;
using MQTTnet.Client;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Client.Options;
using MQTTnet.Client.Receiving;
using MQTTnet.Protocol;
using MQTTnet.Server;
using MQTTnet.Tests.Mockups;
@@ -66,7 +68,7 @@ namespace MQTTnet.Tests
var clientOptions = new MqttClientOptionsBuilder().WithWillMessage(willMessage);
var c1 = await testEnvironment.ConnectClientAsync();
c1.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
c1.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(c => Interlocked.Increment(ref receivedMessagesCount));
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
var c2 = await testEnvironment.ConnectClientAsync(clientOptions);
@@ -92,7 +94,7 @@ namespace MQTTnet.Tests
var clientOptions = new MqttClientOptionsBuilder().WithWillMessage(willMessage);
var c1 = await testEnvironment.ConnectClientAsync();
c1.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
var c2 = await testEnvironment.ConnectClientAsync(clientOptions);
@@ -114,7 +116,7 @@ namespace MQTTnet.Tests
var server = await testEnvironment.StartServerAsync();
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("c1"));
c1.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
var c2 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("c2"));
@@ -125,10 +127,10 @@ namespace MQTTnet.Tests
Assert.AreEqual(0, receivedMessagesCount);
var subscribeEventCalled = false;
server.ClientSubscribedTopic += (_, e) =>
server.ClientSubscribedTopicHandler = new MqttServerClientSubscribedHandlerDelegate(e =>
{
subscribeEventCalled = e.TopicFilter.Topic == "a" && e.ClientId == "c1";
};
});
await c1.SubscribeAsync(new TopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
await Task.Delay(250);
@@ -139,10 +141,10 @@ namespace MQTTnet.Tests
Assert.AreEqual(1, receivedMessagesCount);
var unsubscribeEventCalled = false;
server.ClientUnsubscribedTopic += (_, e) =>
server.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(e =>
{
unsubscribeEventCalled = e.TopicFilter == "a" && e.ClientId == "c1";
};
});
await c1.UnsubscribeAsync("a");
await Task.Delay(250);
@@ -168,7 +170,7 @@ namespace MQTTnet.Tests
var receivedMessagesCount = 0;
var client = await testEnvironment.ConnectClientAsync();
client.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
client.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
var message = new MqttApplicationMessageBuilder().WithTopic("a").WithAtLeastOnceQoS().Build();
await client.SubscribeAsync(new TopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce });
@@ -194,7 +196,7 @@ namespace MQTTnet.Tests
var c1 = await testEnvironment.ConnectClientAsync();
var c2 = await testEnvironment.ConnectClientAsync();
c1.UseReceivedApplicationMessageHandler(c =>
c1.UseApplicationMessageReceivedHandler(c =>
{
lock (locked)
{
@@ -202,7 +204,7 @@ namespace MQTTnet.Tests
}
});
c2.UseReceivedApplicationMessageHandler(c =>
c2.UseApplicationMessageReceivedHandler(c =>
{
lock (locked)
{
@@ -258,12 +260,12 @@ namespace MQTTnet.Tests
var client = await testEnvironment.ConnectClientAsync();
var receivedMessages = new List<MqttApplicationMessage>();
client.Connected += async (s, e) =>
client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(async e =>
{
await client.PublishAsync("Connected");
};
});
client.UseReceivedApplicationMessageHandler(c =>
client.UseApplicationMessageReceivedHandler(c =>
{
lock (receivedMessages)
{
@@ -287,15 +289,12 @@ namespace MQTTnet.Tests
using (var testEnvironment = new TestEnvironment())
{
var server = await testEnvironment.StartServerAsync();
server.ClientConnected += async (s, e) =>
{
await server.SubscribeAsync(e.ClientId, "topic1");
};
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e => server.SubscribeAsync(e.ClientId, "topic1"));
var client = await testEnvironment.ConnectClientAsync();
var receivedMessages = new List<MqttApplicationMessage>();
client.UseReceivedApplicationMessageHandler(c =>
client.UseApplicationMessageReceivedHandler(c =>
{
lock (receivedMessages)
{
@@ -325,7 +324,7 @@ namespace MQTTnet.Tests
var disconnectCalled = 0;
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder());
c1.Disconnected += (sender, args) => disconnectCalled++;
c1.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(e => disconnectCalled++);
await Task.Delay(100);
@@ -347,8 +346,8 @@ namespace MQTTnet.Tests
var clientConnectedCalled = 0;
var clientDisconnectedCalled = 0;
server.ClientConnected += (_, __) => Interlocked.Increment(ref clientConnectedCalled);
server.ClientDisconnected += (_, __) => Interlocked.Increment(ref clientDisconnectedCalled);
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(_ => Interlocked.Increment(ref clientConnectedCalled));
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(_ => Interlocked.Increment(ref clientDisconnectedCalled));
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder());
@@ -462,7 +461,7 @@ namespace MQTTnet.Tests
var receivedMessages = 0;
var c2 = await testEnvironment.ConnectClientAsync();
c2.UseReceivedApplicationMessageHandler(c =>
c2.UseApplicationMessageReceivedHandler(c =>
{
Interlocked.Increment(ref receivedMessages);
});
@@ -500,7 +499,7 @@ namespace MQTTnet.Tests
var receivedMessagesCount = 0;
var c2 = await testEnvironment.ConnectClientAsync();
c2.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
c2.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("retained_other").Build());
await Task.Delay(500);
@@ -523,7 +522,7 @@ namespace MQTTnet.Tests
var receivedMessages = new List<MqttApplicationMessage>();
var c2 = await testEnvironment.ConnectClientAsync();
c2.UseReceivedApplicationMessageHandler(c =>
c2.UseApplicationMessageReceivedHandler(c =>
{
lock (receivedMessages)
{
@@ -558,7 +557,7 @@ namespace MQTTnet.Tests
var c2 = await testEnvironment.ConnectClientAsync();
c2.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
c2.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
await Task.Delay(200);
await c2.SubscribeAsync(new TopicFilter { Topic = "retained", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });
@@ -604,7 +603,7 @@ namespace MQTTnet.Tests
await c2.SubscribeAsync(new TopicFilterBuilder().WithTopic("test").Build());
var isIntercepted = false;
c2.UseReceivedApplicationMessageHandler(c =>
c2.UseApplicationMessageReceivedHandler(c =>
{
isIntercepted = string.Compare("extended", Encoding.UTF8.GetString(c.ApplicationMessage.Payload), StringComparison.Ordinal) == 0;
});
@@ -645,7 +644,7 @@ namespace MQTTnet.Tests
await testEnvironment.StartServerAsync(new MqttServerOptionsBuilder());
var client1 = await testEnvironment.ConnectClientAsync();
client1.UseReceivedApplicationMessageHandler(c =>
client1.UseApplicationMessageReceivedHandler(c =>
{
receivedBody = c.ApplicationMessage.Payload;
});
@@ -703,21 +702,21 @@ namespace MQTTnet.Tests
var events = new List<string>();
server.ClientConnected += (_, __) =>
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(_ =>
{
lock (events)
{
events.Add("c");
}
};
});
server.ClientDisconnected += (_, __) =>
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(_ =>
{
lock (events)
{
events.Add("d");
}
};
});
var clientOptions = new MqttClientOptionsBuilder()
.WithClientId("same_id");
@@ -888,7 +887,7 @@ namespace MQTTnet.Tests
var buffer = new StringBuilder();
client2.UseReceivedApplicationMessageHandler(c =>
client2.UseApplicationMessageReceivedHandler(c =>
{
lock (buffer)
{
@@ -952,7 +951,7 @@ namespace MQTTnet.Tests
await testEnvironment.StartServerAsync(new MqttServerOptionsBuilder());
var c1 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("receiver"));
c1.UseReceivedApplicationMessageHandler(c => Interlocked.Increment(ref receivedMessagesCount));
c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount));
await c1.SubscribeAsync(new TopicFilterBuilder().WithTopic(topicFilter).WithQualityOfServiceLevel(filterQualityOfServiceLevel).Build());
var c2 = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithClientId("sender"));