Beispiel #1
0
        public async Task Happy_path(long headNumber, int options)
        {
            BlockDownloader.DownloadOptions downloadOptions = (BlockDownloader.DownloadOptions)options;
            bool withReceipts = downloadOptions == BlockDownloader.DownloadOptions.DownloadWithReceipts;
            InMemoryReceiptStorage inMemoryReceiptStorage = new InMemoryReceiptStorage();
            BlockDownloader        blockDownloader        = new BlockDownloader(_blockTree, TestBlockValidator.AlwaysValid, TestSealValidator.AlwaysValid, NullSyncReport.Instance, inMemoryReceiptStorage, RopstenSpecProvider.Instance, LimboLogs.Instance);

            ISyncPeer            syncPeer             = Substitute.For <ISyncPeer>();
            Task <BlockHeader[]> buildHeadersResponse = null;

            syncPeer.GetBlockHeaders(Arg.Any <long>(), Arg.Any <int>(), Arg.Any <int>(), Arg.Any <CancellationToken>())
            .Returns(ci => buildHeadersResponse = _responseBuilder.BuildHeaderResponse(ci.ArgAt <long>(0), ci.ArgAt <int>(1), Response.AllCorrect));

            Response blockResponseOptions = Response.AllCorrect;

            if (withReceipts)
            {
                blockResponseOptions |= Response.WithTransactions;
            }

            Task <BlockBody[]> buildBlocksResponse = null;

            syncPeer.GetBlocks(Arg.Any <IList <Keccak> >(), Arg.Any <CancellationToken>())
            .Returns(ci => buildBlocksResponse = _responseBuilder.BuildBlocksResponse(ci.ArgAt <IList <Keccak> >(0), blockResponseOptions));

            syncPeer.GetReceipts(Arg.Any <IList <Keccak> >(), Arg.Any <CancellationToken>())
            .Returns(ci => _responseBuilder.BuildReceiptsResponse(buildHeadersResponse.Result, buildBlocksResponse.Result));

            PeerInfo peerInfo = new PeerInfo(syncPeer);

            peerInfo.TotalDifficulty = UInt256.MaxValue;
            peerInfo.HeadNumber      = headNumber;

            await blockDownloader.DownloadHeaders(peerInfo, SyncModeSelector.FullSyncThreshold, CancellationToken.None);

            Assert.AreEqual(Math.Max(0, headNumber - SyncModeSelector.FullSyncThreshold), _blockTree.BestSuggestedHeader.Number, "headers");

            peerInfo.HeadNumber *= 2;
            await blockDownloader.DownloadBlocks(peerInfo, 0, CancellationToken.None, downloadOptions);

            _blockTree.BestSuggestedHeader.Number.Should().Be(Math.Max(0, headNumber * 2));
            _blockTree.IsMainChain(_blockTree.BestSuggestedHeader.Hash).Should().Be(downloadOptions != BlockDownloader.DownloadOptions.DownloadAndProcess);
            inMemoryReceiptStorage.Count.Should().Be(withReceipts ? buildBlocksResponse.Result.Sum(b => b.Transactions?.Length ?? 0) : 0);
        }