public void BlockDownloaded_KnownHeader_BlockIntegrityInvalidated_BansPeer_DoesNotCallCallback() { TestContext builder = GetBuildTestContext(10, useCheckpoints: false, initializeWithChainTip: true); var additionalHeaders = builder.ExtendAChain(1, builder.InitialChainTip); var headerTree = builder.ChainedHeaderToList(additionalHeaders, 1); var peer = builder.GetNetworkPeerWithConnection(); var result = builder.TestConsensusManager.ConsensusManager.HeadersPresented(peer.Object, headerTree, true); var callbackCalled = false; var callback = new Bitcoin.Consensus.OnBlockDownloadedCallback(d => { callbackCalled = true; }); // setup the callback builder.TestConsensusManager.SetupCallbackByBlocksRequestedHash(additionalHeaders.HashBlock, callback); Assert.NotNull(builder.blockPullerBlockDownloadCallback); // setup validation to fail. builder.IntegrityValidator.Setup(i => i.VerifyBlockIntegrity(additionalHeaders, additionalHeaders.Block)) .Returns(new Bitcoin.Consensus.ValidationContext() { BanDurationSeconds = 3000, Error = Bitcoin.Consensus.ConsensusErrors.BadBlockSignature }); builder.blockPullerBlockDownloadCallback(additionalHeaders.HashBlock, additionalHeaders.Block, peer.Object.Connection.Id); // expect the setup callback is not called. Assert.False(callbackCalled); builder.AssertPeerBanned(peer.Object); builder.AssertExpectedBlockSizesEmpty(); }
public void BlockDownloaded_ExpectedBlockDataBytesCalculatedCorrectly() { TestContext builder = GetBuildTestContext(10, useCheckpoints: false, initializeWithChainTip: true); builder.SetupAverageBlockSize(100); var additionalHeaders = builder.ExtendAChain(1, builder.InitialChainTip, avgBlockSize: 100); var headerTree = builder.ChainedHeaderToList(additionalHeaders, 1); var peer = builder.GetNetworkPeerWithConnection(); var result = builder.TestConsensusManager.ConsensusManager.HeadersPresented(peer.Object, headerTree, true); Assert.NotNull(builder.blockPullerBlockDownloadCallback); builder.TestConsensusManager.SetExpectedBlockDataBytes(1000); var callback1Called = false; var callback2Called = false; var callback1 = new Bitcoin.Consensus.OnBlockDownloadedCallback(d => { callback1Called = true; }); var callback2 = new Bitcoin.Consensus.OnBlockDownloadedCallback(d => { callback2Called = true; }); builder.TestConsensusManager.SetupCallbackByBlocksRequestedHash(additionalHeaders.HashBlock, callback1, callback2); builder.blockPullerBlockDownloadCallback(additionalHeaders.HashBlock, additionalHeaders.Block, peer.Object.Connection.Id); Assert.False(builder.TestConsensusManager.CallbacksByBlocksRequestedHashContainsKeyForHash(additionalHeaders.HashBlock)); Assert.Equal(900, builder.TestConsensusManager.GetExpectedBlockDataBytes()); builder.AssertExpectedBlockSizesEmpty(); Assert.True(callback1Called); Assert.True(callback2Called); }
public void BlockDownloaded_CallbackRegisteredForHash_KnownHeader_NotBlockExpected_ThrowsInvalidOperationException() { TestContext builder = GetBuildTestContext(10, useCheckpoints: false, initializeWithChainTip: true); var additionalHeaders = builder.ExtendAChain(1, builder.InitialChainTip); var headerTree = builder.ChainedHeaderToList(additionalHeaders, 1); var peer = builder.GetNetworkPeerWithConnection(); var result = builder.TestConsensusManager.ConsensusManager.HeadersPresented(peer.Object, headerTree, true); builder.TestConsensusManager.ClearExpectedBlockSizes(); var callbackCalled = false; var callback = new Bitcoin.Consensus.OnBlockDownloadedCallback(d => { callbackCalled = true; }); // setup the callback builder.TestConsensusManager.SetupCallbackByBlocksRequestedHash(additionalHeaders.HashBlock, callback); Assert.NotNull(builder.blockPullerBlockDownloadCallback); // call the blockdownloaded method from the blockpuller with a random header Assert.Throws <InvalidOperationException>(() => builder.blockPullerBlockDownloadCallback(additionalHeaders.HashBlock, null, peer.Object.Connection.Id)); // expect the setup callback is not called. Assert.False(callbackCalled); }
public void BlockDownloaded_NullBlock_CallsCallbacks() { TestContext builder = GetBuildTestContext(10, useCheckpoints: false, initializeWithChainTip: true); var additionalHeaders = builder.ExtendAChain(2, builder.InitialChainTip); var headerTree = builder.ChainedHeaderToList(additionalHeaders, 2); var peer = builder.GetNetworkPeerWithConnection(); var result = builder.TestConsensusManager.ConsensusManager.HeadersPresented(peer.Object, headerTree, true); Assert.NotNull(builder.blockPullerBlockDownloadCallback); builder.TestConsensusManager.SetExpectedBlockDataBytes(1000); var callback1Called = false; var callback2Called = false; var callback3Called = false; ChainedHeaderBlock calledWith1 = null; ChainedHeaderBlock calledWith2 = null; ChainedHeaderBlock calledWith3 = null; var callback1 = new Bitcoin.Consensus.OnBlockDownloadedCallback(d => { callback1Called = true; calledWith1 = d; }); var callback2 = new Bitcoin.Consensus.OnBlockDownloadedCallback(d => { callback2Called = true; calledWith2 = d; }); var callback3 = new Bitcoin.Consensus.OnBlockDownloadedCallback(d => { callback3Called = true; calledWith3 = d; }); builder.TestConsensusManager.SetupCallbackByBlocksRequestedHash(additionalHeaders.HashBlock, callback1, callback2); builder.TestConsensusManager.SetupCallbackByBlocksRequestedHash(additionalHeaders.Previous.HashBlock, callback3); // call for both blocks. var block = new Block(); block.ToBytes(); builder.blockPullerBlockDownloadCallback(additionalHeaders.Previous.HashBlock, block, peer.Object.Connection.Id); builder.blockPullerBlockDownloadCallback(additionalHeaders.HashBlock, block, peer.Object.Connection.Id); Assert.False(builder.TestConsensusManager.CallbacksByBlocksRequestedHashContainsKeyForHash(additionalHeaders.HashBlock)); Assert.False(builder.TestConsensusManager.CallbacksByBlocksRequestedHashContainsKeyForHash(additionalHeaders.Previous.HashBlock)); builder.AssertExpectedBlockSizesEmpty(); Assert.True(callback1Called); Assert.True(callback2Called); Assert.True(callback3Called); Assert.NotNull(calledWith1); Assert.Equal(additionalHeaders, calledWith1.ChainedHeader); Assert.NotNull(calledWith2); Assert.Equal(additionalHeaders, calledWith2.ChainedHeader); Assert.NotNull(calledWith3); Assert.Equal(additionalHeaders.Previous, calledWith3.ChainedHeader); }
public void GetOrDownloadBlocksAsync_ChainedHeaderBlockNotInCT_CallsBlockDownloadedCallbackForBlock_BlocksNotDownloaded() { TestContext builder = GetBuildTestContext(10, useCheckpoints: false); var callbackCalled = false; ChainedHeaderBlock calledWith = null; var blockDownloadedCallback = new Bitcoin.Consensus.OnBlockDownloadedCallback(d => { callbackCalled = true; calledWith = d; }); var blockHashes = new List <uint256>() { builder.InitialChainTip.HashBlock }; builder.TestConsensusManager.ConsensusManager.GetOrDownloadBlocksAsync(blockHashes, blockDownloadedCallback).GetAwaiter().GetResult(); Assert.True(callbackCalled); Assert.Null(calledWith); builder.BlockPuller.Verify(b => b.RequestBlocksDownload(It.IsAny <List <ChainedHeader> >(), It.IsAny <bool>()), Times.Exactly(0)); }