Пример #1
0
        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);
            }
        }