using System; using System.Threading.Tasks; using MQTTnet.Core.Adapter; using MQTTnet.Core.Server; using MQTTnet.Core.Client; namespace MQTTnet.Core.Tests { public class TestMqttServerAdapter : IMqttServerAdapter { public event EventHandler ClientAccepted; public async Task ConnectTestClient(IMqttServer server, string clientId, MqttApplicationMessage willMessage = null) { var adapterA = new TestMqttCommunicationAdapter(); var adapterB = new TestMqttCommunicationAdapter(); adapterA.Partner = adapterB; adapterB.Partner = adapterA; var client = new MqttClient( new TestMqttCommunicationAdapterFactory(adapterA), new TestLogger(), new MqttPacketDispatcher(new TestLogger())); var connected = WaitForClientToConnect(server, clientId); FireClientAcceptedEvent(adapterB); var options = new MqttClientOptions { ClientId = clientId, WillMessage = willMessage, ChannelOptions = new MqttClientTcpOptions() }; await client.ConnectAsync(options); await connected; return client; } private static Task WaitForClientToConnect(IMqttServer s, string clientId) { var tcs = new TaskCompletionSource(); void Handler(object sender, Server.MqttClientConnectedEventArgs args) { if (args.Client.ClientId == clientId) { s.ClientConnected -= Handler; tcs.SetResult(null); } } s.ClientConnected += Handler; return tcs.Task; } private void FireClientAcceptedEvent(IMqttCommunicationAdapter adapter) { ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(adapter)); } public Task StartAsync(MqttServerOptions options) { return Task.FromResult(0); } public Task StopAsync() { return Task.FromResult(0); } } }