예제 #1
0
        public ObservableChannelTests()
        {
            _channel = Substitute.For <IChannel>();
            var messageSubject = new ReplaySubject <IObserverDto <ProtocolMessage> >(1);

            _messageStream     = messageSubject.AsObservable();
            _observableChannel = new ObservableChannel(_messageStream, _channel);
        }
예제 #2
0
        public static IObservableChannel MockObservableChannel(IObservable <IObserverDto <ProtocolMessage> > replaySubject)
        {
            var mockChannel       = Substitute.For <IChannel>();
            var mockEventStream   = replaySubject.AsObservable();
            var observableChannel = new ObservableChannel(mockEventStream, mockChannel);

            return(observableChannel);
        }
예제 #3
0
        public RpcClientTests()
        {
            _testScheduler         = new TestScheduler();
            _logger                = Substitute.For <ILogger>();
            _peerIdentifier        = PeerIdHelper.GetPeerId("Test");
            _channelHandlerContext = Substitute.For <IChannelHandlerContext>();

            _channelFactory = Substitute.For <ITcpClientChannelFactory>();
            _clientEventLoopGroupFactory = Substitute.For <ITcpClientEventLoopGroupFactory>();

            _mockSocketReplySubject = new ReplaySubject <IObserverDto <ProtocolMessage> >(1, _testScheduler);
            var mockChannel       = Substitute.For <IChannel>();
            var mockEventStream   = _mockSocketReplySubject.AsObservable();
            var observableChannel = new ObservableChannel(mockEventStream, mockChannel);

            _channelFactory.BuildChannelAsync(_clientEventLoopGroupFactory, Arg.Any <IPAddress>(), Arg.Any <int>(),
                                              Arg.Any <X509Certificate2>()).Returns(observableChannel);

            _rpcClientConfig             = Substitute.For <IRpcClientConfig>();
            _rpcClientConfig.HostAddress = IPAddress.Any;
            _rpcClientConfig.NodeId      = "0";
            _rpcClientConfig.PfxFileName = "pfx";
            _rpcClientConfig.Port        = 9000;
        }
예제 #4
0
        void ObserveOutputIdle(bool writer)
        {
            TimeSpan       writerIdleTime = this.zeroSecond;
            TimeSpan       allIdleTime    = this.zeroSecond;
            IdleStateEvent expected;

            if (writer)
            {
                writerIdleTime = TimeSpan.FromSeconds(5);
                expected       = IdleStateEvent.FirstWriterIdleStateEvent;
            }
            else
            {
                allIdleTime = TimeSpan.FromSeconds(5);
                expected    = IdleStateEvent.FirstAllIdleStateEvent;
            }

            var idleStateHandler = new TestableIdleStateHandler(
                true, this.zeroSecond, writerIdleTime, allIdleTime);

            var events  = new List <object>();
            var handler = new TestEventChannelInboundHandlerAdapter(events);

            var channel = new ObservableChannel(idleStateHandler, handler);

            try
            {
                // We're writing 3 messages that will be consumed at different rates!
                channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(new byte[] { 1 }));
                channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(new byte[] { 2 }));
                channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(new byte[] { 3 }));
                channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(new byte[5 * 1024]));

                // Establish a baseline. We're not consuming anything and let it idle once.
                idleStateHandler.TickRun();
                Assert.Single(events);
                Assert.Same(expected, events[0]);
                events.Clear();

                // Our ticker should be at second 5
                Assert.Equal(TimeSpan.FromSeconds(5), idleStateHandler.Tick);

                // Consume one message in 4 seconds, then be idle for 2 seconds,
                // then run the task and we shouldn't get an IdleStateEvent because
                // we haven't been idle for long enough!
                idleStateHandler.DoTick(TimeSpan.FromSeconds(4));
                AssertNotNullAndRelease(channel.Consume());

                idleStateHandler.TickRun(TimeSpan.FromSeconds(2));
                Assert.Empty(events);
                Assert.Equal(TimeSpan.FromSeconds(11), idleStateHandler.Tick); // 5s + 4s + 2s

                // Consume one message in 3 seconds, then be idle for 4 seconds,
                // then run the task and we shouldn't get an IdleStateEvent because
                // we haven't been idle for long enough!
                idleStateHandler.DoTick(TimeSpan.FromSeconds(3));
                AssertNotNullAndRelease(channel.Consume());

                idleStateHandler.TickRun(TimeSpan.FromSeconds(4));
                Assert.Empty(events);
                Assert.Equal(TimeSpan.FromSeconds(18), idleStateHandler.Tick); // 11s + 3s + 4s

                // Don't consume a message and be idle for 5 seconds.
                // We should get an IdleStateEvent!
                idleStateHandler.TickRun(TimeSpan.FromSeconds(5));
                Assert.Single(events);
                Assert.Equal(TimeSpan.FromSeconds(23), idleStateHandler.Tick); // 18s + 5s
                events.Clear();

                // Consume one message in 2 seconds, then be idle for 1 seconds,
                // then run the task and we shouldn't get an IdleStateEvent because
                // we haven't been idle for long enough!
                idleStateHandler.DoTick(TimeSpan.FromSeconds(2));
                AssertNotNullAndRelease(channel.Consume());

                idleStateHandler.TickRun(TimeSpan.FromSeconds(1));
                Assert.Empty(events);
                Assert.Equal(TimeSpan.FromSeconds(26), idleStateHandler.Tick); // 23s + 2s + 1s

                // Consume part of the message every 2 seconds, then be idle for 1 seconds,
                // then run the task and we should get an IdleStateEvent because the first trigger
                idleStateHandler.DoTick(TimeSpan.FromSeconds(2));
                AssertNotNullAndRelease(channel.ConsumePart(1024));
                idleStateHandler.DoTick(TimeSpan.FromSeconds(2));
                AssertNotNullAndRelease(channel.ConsumePart(1024));
                idleStateHandler.TickRun(TimeSpan.FromSeconds(1));
                Assert.Single(events);
                Assert.Equal(TimeSpan.FromSeconds(31), idleStateHandler.Tick); // 26s + 2s + 2s + 1s
                events.Clear();

                // Consume part of the message every 2 seconds, then be idle for 1 seconds,
                // then consume all the rest of the message, then run the task and we shouldn't
                // get an IdleStateEvent because the data is flowing and we haven't been idle for long enough!
                idleStateHandler.DoTick(TimeSpan.FromSeconds(2));
                AssertNotNullAndRelease(channel.ConsumePart(1024));
                idleStateHandler.DoTick(TimeSpan.FromSeconds(2));
                AssertNotNullAndRelease(channel.ConsumePart(1024));
                idleStateHandler.TickRun(TimeSpan.FromSeconds(1));
                Assert.Empty(events);
                Assert.Equal(TimeSpan.FromSeconds(36), idleStateHandler.Tick); // 31s + 2s + 2s + 1s
                idleStateHandler.DoTick(TimeSpan.FromSeconds(2));
                AssertNotNullAndRelease(channel.ConsumePart(1024));

                // There are no messages left! Advance the ticker by 3 seconds,
                // attempt a consume() but it will be null, then advance the
                // ticker by an another 2 seconds and we should get an IdleStateEvent
                // because we've been idle for 5 seconds.
                idleStateHandler.DoTick(TimeSpan.FromSeconds(3));
                Assert.Null(channel.Consume());

                idleStateHandler.TickRun(TimeSpan.FromSeconds(2));
                Assert.Single(events);
                Assert.Equal(TimeSpan.FromSeconds(43), idleStateHandler.Tick); // 36s + 2s + 3s + 2s

                // q.e.d.
            }
            finally
            {
                channel.FinishAndReleaseAll();
            }
        }