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()));
        }
        public void TryMatchResponseAsync_Should_Not_Match_On_Wrong_Response_Type()
        {
            var matchingRequest = PendingRequests[2].Content;
            var matchingRequestWithWrongType =
                new PeerNeighborsResponse().ToProtocolMessage(matchingRequest.PeerId,
                                                              matchingRequest.CorrelationId.ToCorrelationId());

            new Action(() => CorrelationManager.TryMatchResponse(matchingRequestWithWrongType))
            .Should().Throw <InvalidDataException>()
            .And.Message.Should().Contain(PeerNeighborsResponse.Descriptor.ShortenedFullName());
        }
        public async Task Can_receive_PeerNeighborsResponse()
        {
            var pingRequestHandler = new TestMessageObserver <PeerNeighborsResponse>(_logger);
            var neighbourIds       = "abc".Select(i => PeerIdHelper.GetPeerId(i.ToString()));
            var responseContent    = new PeerNeighborsResponse();

            responseContent.Peers.AddRange(neighbourIds);

            var response = responseContent.ToProtocolMessage(_pid, _guid);

            await InitialisePeerServiceAndSendMessage(pingRequestHandler, response).ConfigureAwait(false);

            pingRequestHandler.SubstituteObserver.Received(1).OnNext(Arg.Any <PeerNeighborsResponse>());
            var call = pingRequestHandler.SubstituteObserver.ReceivedCalls().Single();

            ((PeerNeighborsResponse)call.GetArguments()[0]).Peers
            .Should().BeEquivalentTo(responseContent.Peers);
        }
        public void Observer_Can_Process_GetNeighbourResponse_Correctly()
        {
            var testScheduler = new TestScheduler();

            var peers = new[]
            {
                PeerIdHelper.GetPeerId(),
                PeerIdHelper.GetPeerId(),
                PeerIdHelper.GetPeerId()
            };

            var peerNeighborsResponse = new PeerNeighborsResponse
            {
                Peers =
                {
                    peers
                }
            };
            var protocolMessage =
                peerNeighborsResponse.ToProtocolMessage(PeerIdHelper.GetPeerId("sender"),
                                                        CorrelationId.GenerateCorrelationId());

            var peerNeighborsResponseObserver = Substitute.For <IObserver <IPeerClientMessageDto> >();

            var messageStream = MessageStreamHelper.CreateStreamWithMessage(_fakeContext, testScheduler,
                                                                            protocolMessage);

            _observer.StartObserving(messageStream);

            using (_observer.MessageStream.Subscribe(peerNeighborsResponseObserver.OnNext))
            {
                testScheduler.Start();

                peerNeighborsResponseObserver.Received(1)
                .OnNext(Arg.Is <IPeerClientMessageDto>(p => test(p.Message, peers[0])));
                peerNeighborsResponseObserver.Received(1)
                .OnNext(Arg.Is <IPeerClientMessageDto>(p => test(p.Message, peers[1])));
                peerNeighborsResponseObserver.Received(1)
                .OnNext(Arg.Is <IPeerClientMessageDto>(p => test(p.Message, peers[2])));
            }
        }