Пример #1
0
        public async Task Can_send_get_block_headers_message_if_peer_block_header_height_is_different()
        {
            // Arrange
            var blockHeader = new BlockHeader()
            {
                Index = 1,
                Hash  = UInt256.Zero
            };

            var blockchainMock = this.AutoMockContainer.GetMock <IBlockchain>();

            blockchainMock
            .SetupGet(x => x.LastBlockHeader)
            .Returns(blockHeader);

            var verAckMessage = new VerAckMessage();
            var version       = new VersionPayload();
            var peerMock      = AutoMockContainer.GetMock <IPeer>();

            peerMock.SetupProperty(x => x.Version, version);
            version.CurrentBlockIndex = 2;

            var messageHandler = AutoMockContainer.Get <VerAckMessageHandler>();

            // Act
            await messageHandler.Handle(verAckMessage, peerMock.Object);

            // Assert
            // TODO: This need to evaluate correctly that the right GetBlockHeadersMessage is been generated.
            peerMock.Verify(x => x.Send(It.IsAny <GetBlockHeadersMessage>()), Times.Once);
        }
Пример #2
0
        public async Task Handle_VerAckMessageReceived_PeerIsReady()
        {
            // Arrange
            var verAckMessage = new VerAckMessage();
            var version       = new VersionPayload
            {
                CurrentBlockIndex = 1
            };
            var peerMock = AutoMockContainer.GetMock <IPeer>();

            peerMock.SetupProperty(x => x.IsReady, false);
            peerMock.SetupProperty(x => x.Version, version);

            var expectedLastBlockHeader = new BlockHeader(HeaderType.Header)
            {
                Index = 1
            };

            this.AutoMockContainer
            .GetMock <IBlockchainContext>()
            .SetupGet(x => x.LastBlockHeader)
            .Returns(expectedLastBlockHeader);

            var messageHandler = AutoMockContainer.Get <VerAckMessageHandler>();

            // Act
            await messageHandler.Handle(verAckMessage, peerMock.Object);

            // Assert
            peerMock.Object.IsReady
            .Should()
            .BeTrue();
        }
Пример #3
0
        public async Task Can_activate_peer_on_verack_receiving()
        {
            // Arrange
            var blockchain = new NullBlockchain();

            AutoMockContainer.Register <IBlockchain>(blockchain);

            var verAckMessage = new VerAckMessage();
            var version       = new VersionPayload();
            var peerMock      = AutoMockContainer.GetMock <IPeer>();

            peerMock.SetupProperty(x => x.IsReady, false);
            peerMock.SetupProperty(x => x.Version, version);

            blockchain.LastBlockHeader.Index = 1;
            version.CurrentBlockIndex        = 1;

            var messageHandler = AutoMockContainer.Get <VerAckMessageHandler>();

            // Act
            await messageHandler.Handle(verAckMessage, peerMock.Object);

            // Assert
            peerMock.Object.IsReady.Should().BeTrue();
        }
        public static Mock <IPeer> SetupFakeHandshake(this Mock <IPeer> peerMock)
        {
            var versionMessage = default(VersionMessage);

            peerMock
            .Setup(x => x.Send(It.IsAny <VersionMessage>()))
            .Callback <Message>(msg => versionMessage = (VersionMessage)msg)
            .Returns(Task.CompletedTask);

            peerMock
            .Setup(x => x.Receive <VersionMessage>())
            .Returns(() => Task.FromResult(versionMessage));

            var verAckMessage = new VerAckMessage();

            peerMock
            .Setup(x => x.Send(new VerAckMessage()))
            .Returns(Task.CompletedTask);

            peerMock
            .Setup(x => x.Receive <VerAckMessage>())
            .Returns(Task.FromResult(verAckMessage));

            return(peerMock);
        }
Пример #5
0
        private static void FakeHandshake(Mock <IPeer> peerMock)
        {
            var versionMessage = default(VersionMessage);

            peerMock.Setup(x => x.Send(It.IsAny <VersionMessage>()))
            .Callback <VersionMessage>(msg => versionMessage = msg)
            .Returns(Task.CompletedTask);

            peerMock.Setup(x => x.Receive <VersionMessage>())
            .Returns(() => Task.FromResult(versionMessage));

            var verAckMessage = new VerAckMessage();

            peerMock.Setup(x => x.Send(new VerAckMessage()))
            .Returns(Task.CompletedTask);

            peerMock.Setup(x => x.Receive <VerAckMessage>())
            .Returns(Task.FromResult(verAckMessage));
        }
Пример #6
0
        public async Task Can_serialize_and_deserialize_messages()
        {
            // Arrange
            var           tcpProtocol           = AutoMockContainer.Create <ProtocolV1>();
            var           expectedVerAckMessage = new VerAckMessage();
            VerAckMessage actualVerAckMessage;

            // Act
            using (var memory = new MemoryStream())
            {
                await tcpProtocol.SendMessageAsync(memory, expectedVerAckMessage, CancellationToken.None);

                memory.Seek(0, SeekOrigin.Begin);
                actualVerAckMessage = (VerAckMessage)await tcpProtocol.ReceiveMessageAsync(memory, CancellationToken.None);
            }

            // Asset
            actualVerAckMessage.Should().NotBeNull();
            actualVerAckMessage.Command.Should().Be(expectedVerAckMessage.Command);
        }
Пример #7
0
        public async Task Handle_LastLocalBlockIndex1LastPeerBlockIndex2_GetBlockMessageSend()
        {
            // Arrange
            const uint currentBlockIndex = 2;

            var blockHeader = new BlockHeader
            {
                Index = 1,
                Hash  = UInt256.Zero
            };

            var blockchainContextMock = this.AutoMockContainer.GetMock <IBlockchainContext>();

            blockchainContextMock
            .SetupGet(x => x.LastBlockHeader)
            .Returns(blockHeader);
            blockchainContextMock
            .SetupGet(x => x.NeedPeerSync)
            .Returns(true);

            var verAckMessage = new VerAckMessage();
            var version       = new VersionPayload();
            var peerMock      = AutoMockContainer.GetMock <IPeer>();

            peerMock.SetupProperty(x => x.Version, version);
            version.CurrentBlockIndex = currentBlockIndex;

            var messageHandler = AutoMockContainer.Get <VerAckMessageHandler>();

            // Act
            await messageHandler.Handle(verAckMessage, peerMock.Object);

            // Assert
            blockchainContextMock.Verify(x => x.SetPeerCurrentBlockIndex(currentBlockIndex));
            // TODO #410: This need to evaluate correctly that the right GetBlockHeadersMessage is been generated.
            peerMock.Verify(x => x.Send(It.IsAny <GetBlockHeadersMessage>()), Times.Once);
        }
Пример #8
0
        public async Task SendReceiveMessage_VerAckMessageSent_VerAckMessageReveivedIsEquivalent()
        {
            var     sendedVerAckMessage = new VerAckMessage();
            Message receivedMessage;

            var testee = this.AutoMockContainer.Create <ProtocolV2>();

            using (var memoryStream = new MemoryStream())
            {
                await testee.SendMessageAsync(memoryStream, sendedVerAckMessage, CancellationToken.None);

                memoryStream.Seek(0, SeekOrigin.Begin);

                receivedMessage = await testee.ReceiveMessageAsync(memoryStream, CancellationToken.None);
            }

            receivedMessage
            .Should()
            .BeOfType <VerAckMessage>()
            .And
            .NotBeNull()
            .And
            .BeEquivalentTo(sendedVerAckMessage);
        }
Пример #9
0
        public async Task Can_send_get_block_headers_message_if_peer_block_header_height_is_different()
        {
            // Arrange
            var blockchain = new NullBlockchain();

            AutoMockContainer.Register <IBlockchain>(blockchain);

            var verAckMessage = new VerAckMessage();
            var version       = new VersionPayload();
            var peerMock      = AutoMockContainer.GetMock <IPeer>();

            peerMock.SetupProperty(x => x.Version, version);

            blockchain.LastBlockHeader.Index = 1;
            version.CurrentBlockIndex        = 2;

            var messageHandler = AutoMockContainer.Get <VerAckMessageHandler>();

            // Act
            await messageHandler.Handle(verAckMessage, peerMock.Object);

            // Assert
            peerMock.Verify(x => x.Send(It.IsAny <GetBlockHeadersMessage>()), Times.Once);
        }
 Task SendVerAckAsync(NetworkStream stream, IPEndPoint remote)
 {
     var message = new VerAckMessage().Serialize();
     return stream.WriteAsync(message, 0, message.Length);
 }