public async Task Can_resync_if_missed_a_block() { _remoteBlockTree = Build.A.BlockTree(_genesisBlock).OfChainLength(QueueBasedSyncManager.MaxBatchSize).TestObject; ISynchronizationPeer peer = new SynchronizationPeerMock(_remoteBlockTree); SemaphoreSlim semaphore = new SemaphoreSlim(0); _manager.SyncEvent += (sender, args) => { if (args.SyncStatus == SyncStatus.Completed || args.SyncStatus == SyncStatus.Failed) { semaphore.Release(1); } }; _manager.Start(); Task addPeerTask = _manager.AddPeer(peer); Task firstToComplete = await Task.WhenAny(addPeerTask, Task.Delay(_standardTimeoutUnit)); Assert.AreSame(addPeerTask, firstToComplete); BlockTreeBuilder.ExtendTree(_remoteBlockTree, QueueBasedSyncManager.MaxBatchSize * 2); _manager.AddNewBlock(_remoteBlockTree.RetrieveHeadBlock(), peer.NodeId); semaphore.Wait(_standardTimeoutUnit); semaphore.Wait(_standardTimeoutUnit); Assert.AreEqual(QueueBasedSyncManager.MaxBatchSize * 2 - 1, (int)_blockTree.BestSuggested.Number); }
private void Handle(NewBlockMessage newBlock) { _sync.AddNewBlock(newBlock.Block, P2PSession.RemoteNodeId); }