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); }
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(); }
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); }
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)); }
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); }
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); }
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); }
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); }