Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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));
        }