using System; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.Implementations; using MQTTnet.Server; namespace MQTTnet.Tests.Server { [TestClass] public sealed class Connection_Tests : BaseTestClass { [TestMethod] public async Task Close_Idle_Connection_On_Connect() { using (var testEnvironment = CreateTestEnvironment()) { await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithDefaultCommunicationTimeout(TimeSpan.FromSeconds(1))); var client = new CrossPlatformSocket(AddressFamily.InterNetwork); await client.ConnectAsync("localhost", testEnvironment.ServerPort, CancellationToken.None); // Don't send anything. The server should close the connection. await Task.Delay(TimeSpan.FromSeconds(3)); try { var receivedBytes = await client.ReceiveAsync(new ArraySegment(new byte[10]), SocketFlags.Partial); if (receivedBytes == 0) { return; } Assert.Fail("Receive should throw an exception."); } catch (SocketException) { } } } [TestMethod] public async Task Send_Garbage() { using (var testEnvironment = CreateTestEnvironment()) { await testEnvironment.StartServer(new MqttServerOptionsBuilder().WithDefaultCommunicationTimeout(TimeSpan.FromSeconds(1))); // Send an invalid packet and ensure that the server will close the connection and stay in a waiting state // forever. This is security related. var client = new CrossPlatformSocket(AddressFamily.InterNetwork); await client.ConnectAsync("localhost", testEnvironment.ServerPort, CancellationToken.None); var buffer = Encoding.UTF8.GetBytes("Garbage"); await client.SendAsync(new ArraySegment(buffer), SocketFlags.None); await Task.Delay(TimeSpan.FromSeconds(3)); try { var receivedBytes = await client.ReceiveAsync(new ArraySegment(new byte[10]), SocketFlags.Partial); if (receivedBytes == 0) { return; } Assert.Fail("Receive should throw an exception."); } catch (SocketException) { } } } } }