예제 #1
0
        public void Can_stop()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(SyncBatchSize.Max);

            When.Syncing
            .Stop();
        }
예제 #2
0
        public void Can_reorg_on_hint_block_message()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(3);

            SyncPeerMock peerB = new SyncPeerMock("B");

            peerB.AddBlocksUpTo(3);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .AfterPeerIsAdded(peerB)
            .Wait()
            .After(() => peerB.AddBlocksUpTo(6))
            .AfterHintBlockMessage(peerB.HeadBlock, peerB)
            .BestSuggestedHeaderIs(peerB.HeadHeader).Stop();
        }
예제 #3
0
        public void Can_sync_more_than_a_batch()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(SyncBatchSize.Max * 3);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .BestSuggestedHeaderIs(peerA.HeadHeader).Stop();
        }
예제 #4
0
        public void Can_sync_with_one_peer_straight_and_extend_chain()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(3);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .BestSuggestedHeaderIs(peerA.HeadHeader).Stop();
        }
예제 #5
0
        public void Will_remove_peer_when_init_fails()
        {
            SyncPeerMock peerA = new SyncPeerMock("A", true, true);

            peerA.AddBlocksUpTo(1);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .WaitAMoment()
            .PeerCountIs(0).Stop();
        }
예제 #6
0
        public void Will_not_add_same_peer_twice()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(1);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .AfterPeerIsAdded(peerA)
            .WaitUntilInitialized()
            .PeerCountIs(1)
            .BestSuggestedBlockHasNumber(1).Stop();
        }
예제 #7
0
        public void Will_not_reorganize_more_than_max_reorg_length()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(BlockDownloader.MaxReorganizationLength + 1);

            SyncPeerMock peerB = new SyncPeerMock("B");

            peerB.AddBlocksUpTo(BlockDownloader.MaxReorganizationLength + 2, 0, 1);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .BestSuggestedHeaderIs(peerA.HeadHeader)
            .AfterPeerIsAdded(peerB)
            .BestSuggestedHeaderIs(peerA.HeadHeader).Stop();
        }
예제 #8
0
        public void Will_not_reorganize_on_same_chain_length()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(10);

            SyncPeerMock peerB = new SyncPeerMock("B");

            peerB.AddBlocksUpTo(10, 0, 1);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .BestSuggestedHeaderIs(peerA.HeadHeader)
            .AfterPeerIsAdded(peerB)
            .BestSuggestedHeaderIs(peerA.HeadHeader).Stop();
        }
예제 #9
0
        public void Can_reorg_based_on_total_difficulty()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(10);

            SyncPeerMock peerB = new SyncPeerMock("B");

            peerB.AddHighDifficultyBlocksUpTo(6, 0, 1);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .BestSuggestedHeaderIs(peerA.HeadHeader)
            .AfterPeerIsAdded(peerB)
            .BestSuggestedHeaderIs(peerB.HeadHeader).Stop();
        }
예제 #10
0
        public void Can_reorg_on_add_peer()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(SyncBatchSize.Max);

            SyncPeerMock peerB = new SyncPeerMock("B");

            peerB.AddBlocksUpTo(SyncBatchSize.Max * 2, 0, 1);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .BestSuggestedHeaderIs(peerA.HeadHeader)
            .AfterPeerIsAdded(peerB)
            .BestSuggestedHeaderIs(peerB.HeadHeader).Stop();
        }
예제 #11
0
        public void Can_sync_when_best_peer_is_timing_out()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(1);

            SyncPeerMock badPeer = new SyncPeerMock("B", false, false, true);

            badPeer.AddBlocksUpTo(20);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(badPeer)
            .WaitUntilInitialized()
            .AfterPeerIsAdded(peerA)
            .BestSuggestedBlockHasNumber(1).Stop();
        }
예제 #12
0
        public void Will_inform_connecting_peer_about_the_alternative_branch_with_same_difficulty()
        {
            if (_synchronizerType == SynchronizerType.Fast)
            {
                return;
            }

            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(2);

            SyncPeerMock peerB = new SyncPeerMock("B");

            peerB.AddBlocksUpTo(2, 0, 1);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .BestSuggestedBlockHasNumber(2)
            .AfterPeerIsAdded(peerB)
            .WaitUntilInitialized()
            .Stop();

            Assert.AreNotEqual(peerB.HeadBlock.Hash, peerA.HeadBlock.Hash);

            Block peerBNewBlock = null;

            SpinWait.SpinUntil(() =>
            {
                bool receivedBlock = peerB.ReceivedBlocks.TryPeek(out peerBNewBlock);
                return(receivedBlock && peerBNewBlock.Hash == peerA.HeadBlock.Hash);
            }, WaitTime);

            if (_synchronizerType == SynchronizerType.Eth2Merge)
            {
                Assert.IsNull(peerBNewBlock);
                Assert.AreNotEqual(peerB.HeadBlock.Hash, peerA.HeadBlock.Hash);
            }
            else
            {
                Assert.AreEqual(peerBNewBlock?.Header.Hash !, peerA.HeadBlock.Hash);
            }
        }
예제 #13
0
        public void Can_extend_chain_on_hint_block_when_high_difficulty_low_number()
        {
            SyncPeerMock peerA = new SyncPeerMock("A");

            peerA.AddBlocksUpTo(10);

            SyncPeerMock peerB = new SyncPeerMock("B");

            peerB.AddHighDifficultyBlocksUpTo(5, 0, 1);

            When.Syncing
            .AfterProcessingGenesis()
            .AfterPeerIsAdded(peerA)
            .Wait()
            .AfterPeerIsAdded(peerB)
            .Wait()
            .After(() => peerB.AddHighDifficultyBlocksUpTo(6, 0, 1))
            .AfterHintBlockMessage(peerB.HeadBlock, peerB)
            .BestSuggestedHeaderIs(peerB.HeadHeader).Stop();
        }