public async Task Loose_Connection() { using (var testEnvironment = new TestEnvironment(TestContext)) { testEnvironment.ServerPort = 8364; var server = await testEnvironment.StartServerAsync(); var client = await testEnvironment.ConnectLowLevelClientAsync(o => o.WithCommunicationTimeout(TimeSpan.Zero)); await Authenticate(client).ConfigureAwait(false); await server.StopAsync(); await Task.Delay(1000); try { await client.SendAsync(MqttPingReqPacket.Instance, CancellationToken.None).ConfigureAwait(false); await client.SendAsync(MqttPingReqPacket.Instance, CancellationToken.None).ConfigureAwait(false); } catch (MqttCommunicationException exception) { Assert.IsTrue(exception.InnerException is SocketException); return; } catch { Assert.Fail("Wrong exception type thrown."); } Assert.Fail("This MUST fail"); } }
public async Task Disconnect_Client_DueTo_KeepAlive() { using (var testEnvironment = new TestEnvironment()) { await testEnvironment.StartServerAsync(); var client = await testEnvironment.ConnectLowLevelClientAsync(o => o .WithCommunicationTimeout(TimeSpan.FromSeconds(1)) .WithCommunicationTimeout(TimeSpan.Zero) .WithProtocolVersion(MqttProtocolVersion.V500)).ConfigureAwait(false); await client.SendAsync(new MqttConnectPacket { CleanSession = true, ClientId = "abc", KeepAlivePeriod = 1 }, CancellationToken.None).ConfigureAwait(false); var responsePacket = await client.ReceiveAsync(CancellationToken.None).ConfigureAwait(false); Assert.IsTrue(responsePacket is MqttConnAckPacket); for (var i = 0; i < 6; i++) { await Task.Delay(500); await client.SendAsync(MqttPingReqPacket.Instance, CancellationToken.None); responsePacket = await client.ReceiveAsync(CancellationToken.None); Assert.IsTrue(responsePacket is MqttPingRespPacket); } // If we reach this point everything works as expected (server did not close the connection // due to proper ping messages. // Now we will wait 1.1 seconds because the server MUST wait 1.5 seconds in total (See spec). await Task.Delay(1100); await client.SendAsync(MqttPingReqPacket.Instance, CancellationToken.None); responsePacket = await client.ReceiveAsync(CancellationToken.None); Assert.IsTrue(responsePacket is MqttPingRespPacket); // Now we will wait longer than 1.5 so that the server will close the connection. responsePacket = await client.ReceiveAsync(CancellationToken.None); var disconnectPacket = responsePacket as MqttDisconnectPacket; Assert.IsTrue(disconnectPacket != null); Assert.AreEqual(disconnectPacket.ReasonCode, MqttDisconnectReasonCode.KeepAliveTimeout); } }