public async Task Stop_And_Restart() { using (var testEnvironment = new TestEnvironment(TestContext)) { testEnvironment.IgnoreClientLogErrors = true; var server = await testEnvironment.StartServer(); await testEnvironment.ConnectClient(); await server.StopAsync(); try { await testEnvironment.ConnectClient(); Assert.Fail("Connecting should fail."); } catch (Exception) { } await server.StartAsync(new MqttServerOptionsBuilder().WithDefaultEndpointPort(testEnvironment.ServerPort).Build()); await testEnvironment.ConnectClient(); } }
public async Task Intercept_Message() { void Interceptor(MqttApplicationMessageInterceptorContext context) { context.ApplicationMessage.Payload = Encoding.ASCII.GetBytes("extended"); } using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithApplicationMessageInterceptor(Interceptor)); var c1 = await testEnvironment.ConnectClient(); var c2 = await testEnvironment.ConnectClient(); await c2.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("test").Build()); var isIntercepted = false; c2.UseApplicationMessageReceivedHandler(c => { isIntercepted = string.Compare("extended", Encoding.UTF8.GetString(c.ApplicationMessage.Payload), StringComparison.Ordinal) == 0; }); await c1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("test").Build()); await c1.DisconnectAsync(); await Task.Delay(500); Assert.IsTrue(isIntercepted); } }
public async Task Publish_With_Correct_Retain_Flag() { using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var receivedMessages = new List <MqttApplicationMessage>(); var client1 = await testEnvironment.ConnectClient(); client1.UseApplicationMessageReceivedHandler(c => { lock (receivedMessages) { receivedMessages.Add(c.ApplicationMessage); } }); await client1.SubscribeAsync("a"); var client2 = await testEnvironment.ConnectClient(); var message = new MqttApplicationMessageBuilder().WithTopic("a").WithRetainFlag().Build(); await client2.PublishAsync(message); await Task.Delay(500); Assert.AreEqual(1, receivedMessages.Count); Assert.IsFalse(receivedMessages.First().Retain); // Must be false even if set above! } }
public async Task Publish_After_Client_Connects() { using (var testEnvironment = new TestEnvironment(TestContext)) { var server = await testEnvironment.StartServer(); server.UseClientConnectedHandler(async e => { await server.PublishAsync("/test/1", "true", MqttQualityOfServiceLevel.ExactlyOnce, false); }); string receivedTopic = null; var c1 = await testEnvironment.ConnectClient(); c1.UseApplicationMessageReceivedHandler(e => { receivedTopic = e.ApplicationMessage.Topic; }); await c1.SubscribeAsync("#"); await testEnvironment.ConnectClient(); await testEnvironment.ConnectClient(); await testEnvironment.ConnectClient(); await testEnvironment.ConnectClient(); await Task.Delay(500); Assert.AreEqual("/test/1", receivedTopic); } }
async Task Execute_Success(MqttQualityOfServiceLevel qosLevel, MqttProtocolVersion protocolVersion) { using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var responseSender = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithProtocolVersion(protocolVersion)); await responseSender.SubscribeAsync("MQTTnet.RPC/+/ping", qosLevel); responseSender.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(async e => { await responseSender.PublishAsync(e.ApplicationMessage.Topic + "/response", "pong"); }); var requestSender = await testEnvironment.ConnectClient(); using (var rpcClient = new MqttRpcClient(requestSender, new MqttRpcClientOptionsBuilder().Build())) { var response = await rpcClient.ExecuteAsync(TimeSpan.FromSeconds(5), "ping", "", qosLevel); Assert.AreEqual("pong", Encoding.UTF8.GetString(response)); } } }
public async Task No_Payload() { using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var sender = await testEnvironment.ConnectClient(); var receiver = await testEnvironment.ConnectClient(); var message = new MqttApplicationMessageBuilder() .WithTopic("A"); await receiver.SubscribeAsync(new MqttClientSubscribeOptions { TopicFilters = new List <MqttTopicFilter> { new MqttTopicFilter { Topic = "#" } } }, CancellationToken.None); MqttApplicationMessage receivedMessage = null; receiver.UseApplicationMessageReceivedHandler(e => receivedMessage = e.ApplicationMessage); await sender.PublishAsync(message.Build(), CancellationToken.None); await Task.Delay(1000); Assert.IsNotNull(receivedMessage); Assert.AreEqual("A", receivedMessage.Topic); Assert.AreEqual(null, receivedMessage.Payload); } }
public async Task Publish_Multiple_Clients() { var receivedMessagesCount = 0; using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var c1 = await testEnvironment.ConnectClient(); var c2 = await testEnvironment.ConnectClient(); var c3 = await testEnvironment.ConnectClient(); c2.UseApplicationMessageReceivedHandler(c => { Interlocked.Increment(ref receivedMessagesCount); }); c3.UseApplicationMessageReceivedHandler(c => { Interlocked.Increment(ref receivedMessagesCount); }); 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(); for (var i = 0; i < 500; i++) { await c1.PublishAsync(message).ConfigureAwait(false); } SpinWait.SpinUntil(() => receivedMessagesCount == 1000, TimeSpan.FromSeconds(20)); Assert.AreEqual(1000, receivedMessagesCount); } }
public async Task Session_Takeover() { using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var options = new MqttClientOptionsBuilder() .WithCleanSession(false) .WithProtocolVersion(MqttProtocolVersion.V500) // Disconnect reason is only available in MQTT 5+ .WithClientId("a"); var client1 = await testEnvironment.ConnectClient(options); await Task.Delay(500); MqttClientDisconnectReason disconnectReason = MqttClientDisconnectReason.NormalDisconnection; client1.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(c => { disconnectReason = c.Reason; }); var client2 = await testEnvironment.ConnectClient(options); await Task.Delay(500); Assert.IsFalse(client1.IsConnected); Assert.IsTrue(client2.IsConnected); Assert.AreEqual(MqttClientDisconnectReason.SessionTakenOver, disconnectReason); } }
public async Task Will_Message_Send() { using (var testEnvironment = new TestEnvironment(TestContext)) { var receivedMessagesCount = 0; await testEnvironment.StartServer(); var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").WithAtMostOnceQoS().Build(); var clientOptions = new MqttClientOptionsBuilder().WithWillMessage(willMessage); var c1 = await testEnvironment.ConnectClient(); c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount)); await c1.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("#").Build()); var c2 = await testEnvironment.ConnectClient(clientOptions); c2.Dispose(); // Dispose will not send a DISCONNECT pattern first so the will message must be sent. await Task.Delay(1000); Assert.AreEqual(1, receivedMessagesCount); } }
public async Task Subscribe_Lots_In_Single_Request() { using (var testEnvironment = new TestEnvironment(TestContext)) { var receivedMessagesCount = 0; await testEnvironment.StartServer(); var c1 = await testEnvironment.ConnectClient(); c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount)); var optionsBuilder = new MqttClientSubscribeOptionsBuilder(); for (var i = 0; i < 500; i++) { optionsBuilder.WithTopicFilter(i.ToString(), MqttQualityOfServiceLevel.AtMostOnce); } await c1.SubscribeAsync(optionsBuilder.Build()).ConfigureAwait(false); var c2 = await testEnvironment.ConnectClient(); var messageBuilder = new MqttApplicationMessageBuilder(); for (var i = 0; i < 500; i++) { messageBuilder.WithTopic(i.ToString()); await c2.PublishAsync(messageBuilder.Build()).ConfigureAwait(false); } SpinWait.SpinUntil(() => receivedMessagesCount == 500, TimeSpan.FromSeconds(20)); Assert.AreEqual(500, receivedMessagesCount); } }
public async Task Will_Message_Do_Not_Send_On_Takeover() { using (var testEnvironment = new TestEnvironment(TestContext)) { var receivedMessagesCount = 0; await testEnvironment.StartServer(); // C1 will receive the last will! var c1 = await testEnvironment.ConnectClient(); c1.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(c => Interlocked.Increment(ref receivedMessagesCount)); await c1.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("#").Build()); // C2 has the last will defined. var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").Build(); var clientOptions = new MqttClientOptionsBuilder() .WithWillMessage(willMessage) .WithClientId("WillOwner"); var c2 = await testEnvironment.ConnectClient(clientOptions); // C3 will do the connection takeover. var c3 = await testEnvironment.ConnectClient(clientOptions); await Task.Delay(1000); Assert.AreEqual(0, receivedMessagesCount); } }
static async Task TestPublishAsync( string topic, MqttQualityOfServiceLevel qualityOfServiceLevel, string topicFilter, MqttQualityOfServiceLevel filterQualityOfServiceLevel, int expectedReceivedMessagesCount, TestContext testContext) { using (var testEnvironment = new TestEnvironment(testContext)) { var receivedMessagesCount = 0; await testEnvironment.StartServer(); var c1 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("receiver")); c1.UseApplicationMessageReceivedHandler(c => Interlocked.Increment(ref receivedMessagesCount)); await c1.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic(topicFilter).WithQualityOfServiceLevel(filterQualityOfServiceLevel).Build()); var c2 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("sender")); await c2.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(topic).WithPayload(new byte[0]).WithQualityOfServiceLevel(qualityOfServiceLevel).Build()); await c2.DisconnectAsync().ConfigureAwait(false); await Task.Delay(500); await c1.UnsubscribeAsync(topicFilter); await Task.Delay(500); Assert.AreEqual(expectedReceivedMessagesCount, receivedMessagesCount); } }
public async Task Will_Message_Do_Not_Send_On_Clean_Disconnect() { using (var testEnvironment = new TestEnvironment(TestContext)) { var receivedMessagesCount = 0; await testEnvironment.StartServer(); var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").Build(); var clientOptions = new MqttClientOptionsBuilder().WithWillMessage(willMessage); var c1 = await testEnvironment.ConnectClient(); c1.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(c => Interlocked.Increment(ref receivedMessagesCount)); await c1.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("#").Build()); var c2 = await testEnvironment.ConnectClient(clientOptions); await c2.DisconnectAsync().ConfigureAwait(false); await Task.Delay(1000); Assert.AreEqual(0, receivedMessagesCount); } }
public async Task Keep_Persistent_Session() { using (var testEnvironment = new TestEnvironment(TestContext)) { var server = await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithPersistentSessions()); var c1 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("client1").WithCleanSession(false)); var c2 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("client2").WithCleanSession(false)); await c1.DisconnectAsync(); await Task.Delay(500); var clientStatus = await server.GetClientStatusAsync(); var sessionStatus = await server.GetSessionStatusAsync(); Assert.AreEqual(1, clientStatus.Count); Assert.AreEqual(2, sessionStatus.Count); await c2.DisconnectAsync(); await Task.Delay(500); clientStatus = await server.GetClientStatusAsync(); sessionStatus = await server.GetSessionStatusAsync(); Assert.AreEqual(0, clientStatus.Count); Assert.AreEqual(2, sessionStatus.Count); } }
public async Task Preserve_Message_Order_With_Delayed_Acknowledgement() { // The messages are sent in reverse or to ensure that the delay in the handler // needs longer for the first messages and later messages may be processed earlier (if there // is an issue). const int MessagesCount = 50; using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var client1 = await testEnvironment.ConnectClient(); await client1.SubscribeAsync("x", MqttQualityOfServiceLevel.ExactlyOnce); var receivedValues = new List <int>(); Task Handler1(MqttApplicationMessageReceivedEventArgs eventArgs) { var value = int.Parse(eventArgs.ApplicationMessage.ConvertPayloadToString()); eventArgs.AutoAcknowledge = false; Task.Delay(value).ContinueWith(x => eventArgs.AcknowledgeAsync(CancellationToken.None)); System.Diagnostics.Debug.WriteLine($"received {value}"); lock (receivedValues) { receivedValues.Add(value); } return(Task.CompletedTask); } client1.UseApplicationMessageReceivedHandler(Handler1); var client2 = await testEnvironment.ConnectClient(); for (var i = MessagesCount; i > 0; i--) { await client2.PublishAsync("x", i.ToString(), MqttQualityOfServiceLevel.ExactlyOnce); } await Task.Delay(5000); for (var i = MessagesCount; i > 0; i--) { Assert.AreEqual(i, receivedValues[MessagesCount - i]); } } }
public async Task Send_Reply_For_Any_Received_Message() { using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var client1 = await testEnvironment.ConnectClient(); await client1.SubscribeAsync("request/+"); async Task Handler1(MqttApplicationMessageReceivedEventArgs eventArgs) { await client1.PublishStringAsync($"reply/{eventArgs.ApplicationMessage.Topic}"); } client1.ApplicationMessageReceivedAsync += Handler1; var client2 = await testEnvironment.ConnectClient(); await client2.SubscribeAsync("reply/#"); var replies = new List <string>(); Task Handler2(MqttApplicationMessageReceivedEventArgs eventArgs) { lock (replies) { replies.Add(eventArgs.ApplicationMessage.Topic); } return(PlatformAbstractionLayer.CompletedTask); } client2.ApplicationMessageReceivedAsync += Handler2; await Task.Delay(500); await client2.PublishStringAsync("request/a"); await client2.PublishStringAsync("request/b"); await client2.PublishStringAsync("request/c"); await Task.Delay(500); Assert.AreEqual("reply/request/a,reply/request/b,reply/request/c", string.Join(",", replies)); } }
public async Task Send_Reply_In_Message_Handler() { using (var testEnvironment = new TestEnvironment()) { await testEnvironment.StartServer(); var client1 = await testEnvironment.ConnectClient(); var client2 = await testEnvironment.ConnectClient(); await client1.SubscribeAsync("#"); await client2.SubscribeAsync("#"); var replyReceived = false; client1.ApplicationMessageReceivedAsync += e => { if (e.ApplicationMessage.Topic == "reply") { replyReceived = true; } return(PlatformAbstractionLayer.CompletedTask); }; client2.ApplicationMessageReceivedAsync += async e => { if (e.ApplicationMessage.Topic == "request") { // Use AtMostOnce here because with QoS 1 or even QoS 2 the process waits for // the ACK etc. The problem is that the SpinUntil below only waits until the // flag is set. It does not wait until the client has sent the ACK await client2.PublishStringAsync("reply"); } }; await client1.PublishStringAsync("request", null, MqttQualityOfServiceLevel.AtLeastOnce); await Task.Delay(500); SpinWait.SpinUntil(() => replyReceived, TimeSpan.FromSeconds(10)); await Task.Delay(500); Assert.IsTrue(replyReceived); } }
public async Task Disconnect_Client() { using (var testEnvironment = new TestEnvironment(TestContext)) { var server = await testEnvironment.StartServer(); var c1 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithClientId("client1")); await Task.Delay(1000); var clientStatus = await server.GetClientStatusAsync(); Assert.AreEqual(1, clientStatus.Count); Assert.IsTrue(clientStatus.Any(s => s.ClientId == c1.Options.ClientId)); await clientStatus.First().DisconnectAsync(); await Task.Delay(500); Assert.IsFalse(c1.IsConnected); clientStatus = await server.GetClientStatusAsync(); Assert.AreEqual(0, clientStatus.Count); } }
public async Task Subscribe() { using (var testEnvironment = new TestEnvironment()) { await testEnvironment.StartServer(); var client = await testEnvironment.ConnectClient(o => o.WithProtocolVersion(MqttProtocolVersion.V500)); var result = await client.SubscribeAsync(new MqttClientSubscribeOptions() { SubscriptionIdentifier = 1, TopicFilters = new List <MqttTopicFilter> { new MqttTopicFilter { Topic = "a", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce } } }); await client.DisconnectAsync(); Assert.AreEqual(1, result.Items.Count); Assert.AreEqual(MqttClientSubscribeResultCode.GrantedQoS1, result.Items[0].ResultCode); } }
public async Task No_Messages_If_No_Subscription() { using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var client = await testEnvironment.ConnectClient(); var receivedMessages = new List <MqttApplicationMessage>(); client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(async e => { await client.PublishAsync("Connected"); }); client.UseApplicationMessageReceivedHandler(c => { lock (receivedMessages) { receivedMessages.Add(c.ApplicationMessage); } }); await Task.Delay(500); await client.PublishAsync("Hello"); await Task.Delay(500); Assert.AreEqual(0, receivedMessages.Count); } }
public async Task Track_Sent_Packets() { using (var testEnvironment = new TestEnvironment(TestContext)) { var server = await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithPersistentSessions()); var c1 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder().WithNoKeepAlive()); for (var i = 1; i < 25; i++) { // At most once will send one packet to the client and the server will reply // with an additional ACK packet. await c1.PublishAsync("a", string.Empty, MqttQualityOfServiceLevel.AtLeastOnce); await Task.Delay(250); var clientStatus = await server.GetClientStatusAsync(); Assert.AreEqual(i, clientStatus.First().SentApplicationMessagesCount, "SAMC invalid!"); // + 1 because CONNECT is also counted. Assert.AreEqual(i + 1, clientStatus.First().SentPacketsCount, "SPC invalid!"); // +1 because ConnACK package is already counted. Assert.AreEqual(i + 1, clientStatus.First().ReceivedPacketsCount, "RPC invalid!"); } } }
public async Task Publish_QoS_0_Over_Period_Exceeding_KeepAlive() { using (var testEnvironment = new TestEnvironment(TestContext)) { const int KeepAlivePeriodSecs = 3; await testEnvironment.StartServer(); var options = new MqttClientOptionsBuilder().WithKeepAlivePeriod(TimeSpan.FromSeconds(KeepAlivePeriodSecs)); var client = await testEnvironment.ConnectClient(options); var message = new MqttApplicationMessageBuilder().WithTopic("a").Build(); try { // Publish messages over a time period exceeding the keep alive period. // This should not cause an exception because of, i.e. "Client disconnected". for (var count = 0; count < KeepAlivePeriodSecs * 3; ++count) { // Send Publish requests well before the keep alive period expires await client.PublishAsync(message); await Task.Delay(1000); } } catch (Exception ex) { Assert.Fail(ex.Message); } } }
public async Task Handle_Clean_Disconnect() { using (var testEnvironment = new TestEnvironment(TestContext)) { var server = await testEnvironment.StartServer(new MqttServerOptionsBuilder()); var clientConnectedCalled = 0; var clientDisconnectedCalled = 0; server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(_ => Interlocked.Increment(ref clientConnectedCalled)); server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(_ => Interlocked.Increment(ref clientDisconnectedCalled)); var c1 = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder()); await Task.Delay(1000); Assert.AreEqual(1, clientConnectedCalled); Assert.AreEqual(0, clientDisconnectedCalled); await Task.Delay(1000); await c1.DisconnectAsync(); await Task.Delay(1000); Assert.AreEqual(1, clientConnectedCalled); Assert.AreEqual(1, clientDisconnectedCalled); } }
public async Task Subscriptions_Subscribe_Only_New_Subscriptions() { using (var testEnvironment = new TestEnvironment(TestContext)) { var managedClient = await CreateManagedClientAsync(testEnvironment); var sendingClient = await testEnvironment.ConnectClient(); await managedClient.SubscribeAsync("topic"); //wait a bit for the subscription to become established await Task.Delay(500); await sendingClient.PublishAsync(new MqttApplicationMessage { Topic = "topic", Payload = new byte[] { 1 }, Retain = true }); var messages = await SetupReceivingOfMessages(managedClient, 1); Assert.AreEqual(1, messages.Count); Assert.AreEqual("topic", messages.Single().Topic); await managedClient.SubscribeAsync("anotherTopic"); await Task.Delay(500); // The subscription of the other topic must not trigger a re-subscription of the existing topic // (and thus renewed receiving of the retained message) Assert.AreEqual(1, messages.Count); } }
public async Task Client_Disconnect_Without_Errors() { using (var testEnvironment = new TestEnvironment(TestContext)) { bool clientWasConnected; var server = await testEnvironment.StartServer(new MqttServerOptionsBuilder()); try { var client = await testEnvironment.ConnectClient(new MqttClientOptionsBuilder()); clientWasConnected = true; await client.DisconnectAsync(); await Task.Delay(500); } finally { await server.StopAsync(); } Assert.IsTrue(clientWasConnected); testEnvironment.ThrowIfLogErrors(); } }
public async Task PacketIdentifier_In_Publish_Result() { using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var client = await testEnvironment.ConnectClient(); var result = await client.PublishAsync("a", "a", MqttQualityOfServiceLevel.AtMostOnce); Assert.AreEqual(null, result.PacketIdentifier); result = await client.PublishAsync("b", "b", MqttQualityOfServiceLevel.AtMostOnce); Assert.AreEqual(null, result.PacketIdentifier); result = await client.PublishAsync("a", "a", MqttQualityOfServiceLevel.AtLeastOnce); Assert.AreEqual((ushort)1, result.PacketIdentifier); result = await client.PublishAsync("b", "b", MqttQualityOfServiceLevel.AtLeastOnce); Assert.AreEqual((ushort)2, result.PacketIdentifier); result = await client.PublishAsync("a", "a", MqttQualityOfServiceLevel.ExactlyOnce); Assert.AreEqual((ushort)3, result.PacketIdentifier); result = await client.PublishAsync("b", "b", MqttQualityOfServiceLevel.ExactlyOnce); Assert.AreEqual((ushort)4, result.PacketIdentifier); } }
public async Task Reconnect() { using (var testEnvironment = new TestEnvironment(TestContext)) { var server = await testEnvironment.StartServer(); var client = await testEnvironment.ConnectClient(); await Task.Delay(500); Assert.IsTrue(client.IsConnected); await server.StopAsync(); await Task.Delay(500); Assert.IsFalse(client.IsConnected); await server.StartAsync(new MqttServerOptionsBuilder().WithDefaultEndpointPort(testEnvironment.ServerPort).Build()); await Task.Delay(500); await client.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1", testEnvironment.ServerPort).Build()); Assert.IsTrue(client.IsConnected); } }
public async Task Send_Reply_In_Message_Handler_For_Same_Client() { using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServer(); var client = await testEnvironment.ConnectClient(); await client.SubscribeAsync("#"); var replyReceived = false; client.UseApplicationMessageReceivedHandler(c => { if (c.ApplicationMessage.Topic == "request") { #pragma warning disable 4014 Task.Run(() => client.PublishAsync("reply", null, MqttQualityOfServiceLevel.AtLeastOnce)); #pragma warning restore 4014 } else { replyReceived = true; } }); await client.PublishAsync("request", null, MqttQualityOfServiceLevel.AtLeastOnce); SpinWait.SpinUntil(() => replyReceived, TimeSpan.FromSeconds(10)); Assert.IsTrue(replyReceived); } }
public async Task ManagedClients_Will_Message_Send() { using (var testEnvironment = new TestEnvironment(TestContext)) { var receivedMessagesCount = 0; await testEnvironment.StartServer(); var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").WithAtMostOnceQoS().Build(); var clientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost", testEnvironment.ServerPort) .WithWillMessage(willMessage); var dyingClient = testEnvironment.CreateClient(); var dyingManagedClient = new ManagedMqttClient(dyingClient, testEnvironment.ClientLogger); await dyingManagedClient.StartAsync(new ManagedMqttClientOptionsBuilder() .WithClientOptions(clientOptions) .Build()); var recievingClient = await testEnvironment.ConnectClient(); await recievingClient.SubscribeAsync("My/last/will"); recievingClient.UseApplicationMessageReceivedHandler(context => Interlocked.Increment(ref receivedMessagesCount)); dyingManagedClient.Dispose(); await Task.Delay(1000); Assert.AreEqual(1, receivedMessagesCount); } }
public async Task Subscriptions_Are_Published_Immediately() { using (var testEnvironment = new TestEnvironment(TestContext)) { // Use a long connection check interval to verify that the subscriptions // do not depend on the connection check interval anymore var connectionCheckInterval = TimeSpan.FromSeconds(10); var managedClient = await CreateManagedClientAsync(testEnvironment, null, connectionCheckInterval); var sendingClient = await testEnvironment.ConnectClient(); await sendingClient.PublishAsync(new MqttApplicationMessage { Topic = "topic", Payload = new byte[] { 1 }, Retain = true }); var subscribeTime = DateTime.UtcNow; var messagesTask = SetupReceivingOfMessages(managedClient, 1); await managedClient.SubscribeAsync("topic"); var messages = await messagesTask; var elapsed = DateTime.UtcNow - subscribeTime; Assert.IsTrue(elapsed < TimeSpan.FromSeconds(1), $"Subscriptions must be activated immediately, this one took {elapsed}"); Assert.AreEqual(messages.Single().Topic, "topic"); } }