using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.Adapter; using MQTTnet.Diagnostics; using MQTTnet.Server; using MQTTnet.Server.Status; namespace MQTTnet.Tests { [TestClass] public class MqttKeepAliveMonitor_Tests { [TestMethod] public void KeepAlive_Timeout() { var clientSession = new TestClientSession(); var monitor = new MqttClientKeepAliveMonitor(clientSession, new MqttNetLogger().CreateChildLogger()); Assert.AreEqual(0, clientSession.StopCalledCount); monitor.Start(1, CancellationToken.None); Assert.AreEqual(0, clientSession.StopCalledCount); Thread.Sleep(2000); // Internally the keep alive timeout is multiplied with 1.5 as per protocol specification. Assert.AreEqual(1, clientSession.StopCalledCount); } [TestMethod] public void KeepAlive_NoTimeout() { var clientSession = new TestClientSession(); var monitor = new MqttClientKeepAliveMonitor(clientSession, new MqttNetLogger().CreateChildLogger()); Assert.AreEqual(0, clientSession.StopCalledCount); monitor.Start(1, CancellationToken.None); Assert.AreEqual(0, clientSession.StopCalledCount); // Simulate traffic. Thread.Sleep(1000); // Internally the keep alive timeout is multiplied with 1.5 as per protocol specification. monitor.PacketReceived(); Thread.Sleep(1000); monitor.PacketReceived(); Thread.Sleep(1000); Assert.AreEqual(0, clientSession.StopCalledCount); Thread.Sleep(2000); Assert.AreEqual(1, clientSession.StopCalledCount); } private class TestClientSession : IMqttClientSession { public string ClientId { get; } public int StopCalledCount { get; private set; } public void FillStatus(MqttClientStatus status) { throw new NotSupportedException(); } public void EnqueueApplicationMessage(MqttClientConnection senderClientSession, MqttApplicationMessage applicationMessage) { throw new NotSupportedException(); } public void ClearPendingApplicationMessages() { throw new NotSupportedException(); } public Task RunAsync(MqttApplicationMessage willMessage, int keepAlivePeriod, IMqttChannelAdapter adapter) { throw new NotSupportedException(); } public Task StopAsync() { StopCalledCount++; return Task.FromResult(0); } public Task SubscribeAsync(IList topicFilters) { throw new NotSupportedException(); } public Task UnsubscribeAsync(IList topicFilters) { throw new NotSupportedException(); } public void Dispose() { } } } }