public async Task Can_Process_DeltaHeightRequest_Correctly()
        {
            var deltaHeightRequestMessage = new LatestDeltaHashRequest();

            var fakeContext  = Substitute.For <IChannelHandlerContext>();
            var channeledAny = new ObserverDto(fakeContext,
                                               deltaHeightRequestMessage.ToProtocolMessage(PeerIdHelper.GetPeerId(),
                                                                                           CorrelationId.GenerateCorrelationId()));
            var observableStream = new[] { channeledAny }.ToObservable(_testScheduler);

            _deltaHeightRequestObserver.StartObserving(observableStream);

            _testScheduler.Start();

            var hash = MultiHash.ComputeHash(new byte[32]);
            var cid = new Cid {
                Hash = hash
            };

            await fakeContext.Channel.ReceivedWithAnyArgs(1)
            .WriteAndFlushAsync(new LatestDeltaHashResponse
            {
                DeltaIndex = new DeltaIndex {
                    Cid = cid.ToArray().ToByteString(), Height = 100
                }
            }.ToProtocolMessage(PeerIdHelper.GetPeerId(), CorrelationId.GenerateCorrelationId()))
            .ConfigureAwait(false);

            _subbedLogger.ReceivedWithAnyArgs(1);
        }
示例#2
0
        public async Task Subscribe_To_Message_Stream_Should_Return_VersionRequest()
        {
            await _rpcServer.StartAsync();

            VersionRequest returnedVersionRequest = null;
            var            targetVersionRequest   = new VersionRequest {
                Query = true
            };

            var protocolMessage =
                targetVersionRequest.ToProtocolMessage(_peerId, CorrelationId.GenerateCorrelationId());

            var observerDto = new ObserverDto(_channelHandlerContext, protocolMessage);

            _rpcServer.MessageStream
            .Where(x => x.Payload != null && x.Payload.TypeUrl == typeof(VersionRequest).ShortenedProtoFullName())
            .SubscribeOn(_testScheduler)
            .Subscribe(request => returnedVersionRequest = request.Payload.FromProtocolMessage <VersionRequest>());

            _mockSocketReplySubject.OnNext(observerDto);

            _testScheduler.Start();

            targetVersionRequest.Should().Be(returnedVersionRequest);
        }
        /// <summary>
        ///     Reads the channel once accepted and pushed into a stream.
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="message"></param>
        protected override void ChannelRead0(IChannelHandlerContext ctx, ProtocolMessage message)
        {
            Logger.Verbose("Received {message}", message);
            var contextAny = new ObserverDto(ctx, message);

            _messageSubject.OnNext(contextAny);
            ctx.FireChannelRead(message);
        }
示例#4
0
        //Force test scheduler for testing streams
        public static IObservable <IObserverDto <ProtocolMessage> > CreateStreamWithMessage(IChannelHandlerContext fakeContext,
                                                                                            TestScheduler testScheduler,
                                                                                            ProtocolMessage response)
        {
            var channeledAny = new ObserverDto(fakeContext, response);
            var messageStream = new[] { channeledAny }.ToObservable(testScheduler);

            return(messageStream);
        }
        public async Task Can_Process_GetNeighbourRequest_Correctly()
        {
            // mock a random set of peers
            var randomPeers = new List <Peer>
            {
                new Peer {
                    PeerId = PeerIdHelper.GetPeerId("peer1"), LastSeen = DateTime.Now
                },
                new Peer {
                    PeerId = PeerIdHelper.GetPeerId("peer2"), LastSeen = DateTime.Now
                },
                new Peer {
                    PeerId = PeerIdHelper.GetPeerId("peer3"), LastSeen = DateTime.Now
                },
                new Peer {
                    PeerId = PeerIdHelper.GetPeerId("peer4"), LastSeen = DateTime.Now
                },
                new Peer {
                    PeerId = PeerIdHelper.GetPeerId("peer5"), LastSeen = DateTime.Now
                },
                new Peer {
                    PeerId = PeerIdHelper.GetPeerId("peer6")
                }
            };

            // add them to the mocked repository, and set return expectation
            AddMockPeerToDbAndSetReturnExpectation(randomPeers, _subbedPeerRepository);

            var peerSettings            = _peerId.ToSubstitutedPeerSettings();
            var neighbourRequestHandler = new GetNeighbourRequestObserver(peerSettings,
                                                                          _subbedPeerRepository,
                                                                          _subbedLogger
                                                                          );

            var peerNeighbourRequestMessage = new PeerNeighborsRequest();

            var fakeContext  = Substitute.For <IChannelHandlerContext>();
            var channeledAny = new ObserverDto(fakeContext,
                                               peerNeighbourRequestMessage.ToProtocolMessage(PeerIdHelper.GetPeerId(),
                                                                                             CorrelationId.GenerateCorrelationId()));
            var observableStream = new[] { channeledAny }.ToObservable(_testScheduler);

            neighbourRequestHandler.StartObserving(observableStream);

            var peerNeighborsResponseMessage = new PeerNeighborsResponse();

            for (var i = 0; i < 5; i++)
            {
                peerNeighborsResponseMessage.Peers.Add(PeerIdHelper.GetPeerId());
            }

            _testScheduler.Start();

            await fakeContext.Channel.ReceivedWithAnyArgs(1)
            .WriteAndFlushAsync(
                peerNeighborsResponseMessage.ToProtocolMessage(_peerId, CorrelationId.GenerateCorrelationId()));
        }
示例#6
0
        public async Task Can_Process_PingRequest_Correctly()
        {
            var pingRequestMessage = new PingRequest();

            var fakeContext = Substitute.For <IChannelHandlerContext>();
            var channeledAny = new ObserverDto(fakeContext, pingRequestMessage.ToProtocolMessage(PeerIdHelper.GetPeerId(), CorrelationId.GenerateCorrelationId()));
            var observableStream = new[] { channeledAny }.ToObservable(_testScheduler);

            _pingRequestObserver.StartObserving(observableStream);

            _testScheduler.Start();

            await fakeContext.Channel.ReceivedWithAnyArgs(1)
            .WriteAndFlushAsync(new PingResponse().ToProtocolMessage(PeerIdHelper.GetPeerId(), CorrelationId.GenerateCorrelationId()));

            _subbedLogger.ReceivedWithAnyArgs(1);
        }
        public async Task Can_Process_DeltaHeightRequest_Correctly()
        {
            var fakeContext = Substitute.For <IChannelHandlerContext>();
            var deltaHistoryRequestMessage = new DeltaHistoryRequest();

            var channeledAny = new ObserverDto(fakeContext,
                                               deltaHistoryRequestMessage.ToProtocolMessage(PeerIdHelper.GetPeerId(),
                                                                                            CorrelationId.GenerateCorrelationId()
                                                                                            )
                                               );

            var observableStream = new[] { channeledAny }.ToObservable(_testScheduler);

            _deltaHistoryRequestObserver.StartObserving(observableStream);
            _testScheduler.Start();

            var response = new DeltaHistoryResponse();
            var hp            = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("keccak-256"));
            var lastDeltaHash = hp.ComputeMultiHash(ByteUtil.GenerateRandomByteArray(32));

            for (uint x = 0; x < 10; x++)
            {
                var delta = new Delta
                {
                    PreviousDeltaDfsHash = lastDeltaHash.Digest.ToByteString()
                };

                var index = new DeltaIndex
                {
                    Height = 10,
                    Cid    = delta.ToByteString()
                };

                response.DeltaIndex.Add(index);
                lastDeltaHash = hp.ComputeMultiHash(ByteUtil.GenerateRandomByteArray(32));
            }

            await fakeContext.Channel.ReceivedWithAnyArgs(1)
            .WriteAndFlushAsync(response.ToProtocolMessage(PeerIdHelper.GetPeerId(), CorrelationId.GenerateCorrelationId())).ConfigureAwait(false);

            _subbedLogger.ReceivedWithAnyArgs(1);
        }
示例#8
0
        public async Task SubscribeToResponse_Without_Response_Handler_Should_Throw_Exception()
        {
            var nodeRpcClientFactory = new RpcClientFactory(_channelFactory, _clientEventLoopGroupFactory,
                                                            new List <IRpcResponseObserver>());
            var nodeRpcClient = await nodeRpcClientFactory.GetClientAsync(null, _rpcClientConfig);

            var targetVersionResponse = new VersionResponse {
                Version = "1.2.3.4"
            };
            var protocolMessage =
                targetVersionResponse.ToProtocolMessage(_peerIdentifier, CorrelationId.GenerateCorrelationId());
            var observerDto = new ObserverDto(_channelHandlerContext, protocolMessage);

            Assert.Throws <ResponseHandlerDoesNotExistException>(() =>
            {
                _mockSocketReplySubject.OnNext(observerDto);
                nodeRpcClient.SubscribeToResponse <VersionResponse>(response => { });
                _testScheduler.Start();
            });
        }
示例#9
0
        public async Task SubscribeToResponse_Should_Not_Return_Invalid_Response()
        {
            var nodeRpcClientFactory = new RpcClientFactory(_channelFactory, _clientEventLoopGroupFactory,
                                                            new List <IRpcResponseObserver> {
                new GetVersionResponseObserver(_logger)
            });
            var nodeRpcClient = await nodeRpcClientFactory.GetClientAsync(null, _rpcClientConfig);

            var receivedResponse      = false;
            var targetVersionResponse = new VersionResponse {
                Version = "1.2.3.4"
            };
            var protocolMessage =
                targetVersionResponse.ToProtocolMessage(_peerIdentifier, CorrelationId.GenerateCorrelationId());
            var observerDto = new ObserverDto(_channelHandlerContext, protocolMessage);

            _mockSocketReplySubject.OnNext(observerDto);
            nodeRpcClient.SubscribeToResponse <GetDeltaResponse>(response => receivedResponse = true);
            _testScheduler.Start();

            receivedResponse.Should().BeFalse();
        }