public void when_creating_stream_then_becomes_ready()
        {
            var configuration = new MqttConfiguration();
            var stream        = new PrivateStream(configuration);

            Assert.True(!stream.IsDisposed);
        }
        public async Task when_sending_payload_with_identifier_then_receives_on_same_identifier()
        {
            var configuration = new MqttConfiguration();
            var stream        = new PrivateStream(configuration);

            var clientReceived = 0;
            var clientReceiver = stream
                                 .Receive(EndpointIdentifier.Client)
                                 .Subscribe(payload => {
                clientReceived++;
            });

            var serverReceived = 0;
            var serverReceiver = stream
                                 .Receive(EndpointIdentifier.Server)
                                 .Subscribe(payload => {
                serverReceived++;
            });

            stream.Send(new byte[255], EndpointIdentifier.Client);
            stream.Send(new byte[100], EndpointIdentifier.Client);
            stream.Send(new byte[30], EndpointIdentifier.Client);
            stream.Send(new byte[10], EndpointIdentifier.Server);
            stream.Send(new byte[500], EndpointIdentifier.Server);
            stream.Send(new byte[5], EndpointIdentifier.Server);

            await Task.Delay(TimeSpan.FromMilliseconds(1000));

            Assert.Equal(3, clientReceived);
            Assert.Equal(3, serverReceived);
        }
        public async Task when_sending_payload_with_identifier_then_receives_on_same_identifier()
        {
            MqttConfiguration configuration = new MqttConfiguration();
            PrivateStream     stream        = new PrivateStream(configuration);

            int         clientReceived = 0;
            IDisposable clientReceiver = stream
                                         .Receive(EndpointIdentifier.Client)
                                         .Subscribe(payload =>
            {
                clientReceived++;
            });

            int         serverReceived = 0;
            IDisposable serverReceiver = stream
                                         .Receive(EndpointIdentifier.Server)
                                         .Subscribe(payload =>
            {
                serverReceived++;
            });

            stream.Send(new byte[255], EndpointIdentifier.Client);
            stream.Send(new byte[100], EndpointIdentifier.Client);
            stream.Send(new byte[30], EndpointIdentifier.Client);
            stream.Send(new byte[10], EndpointIdentifier.Server);
            stream.Send(new byte[500], EndpointIdentifier.Server);
            stream.Send(new byte[5], EndpointIdentifier.Server);

            await Task.Delay(TimeSpan.FromMilliseconds(1000));

            3.Should().Be(clientReceived);
            3.Should().Be(serverReceived);
        }
        public async Task when_sending_packet_then_stream_receives_successfully()
        {
            var configuration = new MqttConfiguration();
            var stream        = new PrivateStream(configuration);
            var channel       = new PrivateChannel(stream, EndpointIdentifier.Client, configuration);

            var packetsReceived = 0;

            stream
            .Receive(EndpointIdentifier.Client)
            .Subscribe(packet => {
                packetsReceived++;
            });

            await channel.SendAsync(new byte[255]);

            await channel.SendAsync(new byte[10]);

            await channel.SendAsync(new byte[34]);

            await channel.SendAsync(new byte[100]);

            await channel.SendAsync(new byte[50]);

            await Task.Delay(TimeSpan.FromMilliseconds(1000));

            Assert.Equal(5, packetsReceived);
        }
        public void when_disposing_stream_then_becomes_not_ready()
        {
            MqttConfiguration configuration = new MqttConfiguration();
            PrivateStream     stream        = new PrivateStream(configuration);

            stream.Dispose();

            Assert.True(stream.IsDisposed);
        }
        public void when_disposing_channel_then_became_disconnected()
        {
            var configuration = new MqttConfiguration();
            var stream        = new PrivateStream(configuration);
            var channel       = new PrivateChannel(stream, EndpointIdentifier.Server, configuration);

            channel.Dispose();

            Assert.False(channel.IsConnected);
        }
        public void when_creating_channel_with_stream_ready_then_it_is_connected()
        {
            var configuration = new MqttConfiguration();
            var stream        = new PrivateStream(configuration);
            var channel       = new PrivateChannel(stream, EndpointIdentifier.Client, configuration);

            Assert.True(channel.IsConnected);
            Assert.NotNull(channel.ReceiverStream);
            Assert.NotNull(channel.SenderStream);
        }
        public void when_creating_channel_with_stream_disposed_then_fails()
        {
            var configuration = new MqttConfiguration();
            var stream        = new PrivateStream(configuration);

            stream.Dispose();

            var ex = Assert.Throws <ObjectDisposedException> (() => new PrivateChannel(stream, EndpointIdentifier.Client, configuration));

            Assert.NotNull(ex);
        }
        public async Task when_sending_to_stream_then_channel_receives_successfully()
        {
            MqttConfiguration configuration = new MqttConfiguration();
            PrivateStream     stream        = new PrivateStream(configuration);
            PrivateChannel    channel       = new PrivateChannel(stream, EndpointIdentifier.Server, configuration);

            int packetsReceived = 0;

            channel.ReceiverStream.Subscribe(packet =>
            {
                packetsReceived++;
            });

            stream.Send(new byte[255], EndpointIdentifier.Client);
            stream.Send(new byte[10], EndpointIdentifier.Client);
            stream.Send(new byte[34], EndpointIdentifier.Client);
            stream.Send(new byte[100], EndpointIdentifier.Client);
            stream.Send(new byte[50], EndpointIdentifier.Client);

            await Task.Delay(TimeSpan.FromMilliseconds(1000));

            5.Should().Be(packetsReceived);
        }