/// <summary> /// Changes sync mode expectations. /// </summary> /// <param name="onMode">Only change on this mode.</param> /// <param name="expectations">Expectations to change.</param> /// <param name="add">Mode to add.</param> /// <param name="remove">Should remove <see cref="when"/> modes.</param> /// <param name="when">When <see cref="add"/> mode should be added, can be removed based on <see cref="remove"/>.</param> /// <returns>Changed expectations.</returns> private SyncMode ChangeSyncMode(BeaconSync onMode, SyncMode expectations, SyncMode add, bool remove, params SyncMode[] when) { if (_mode == onMode) { if (expectations == SyncMode.None) { expectations |= add; } else { foreach (SyncMode removeMode in when) { if ((expectations & removeMode) != 0) { if (remove) { expectations &= ~removeMode; } expectations |= add; } } } } return(expectations); }
public Context( IBlockTree?blockTree = null, ISyncConfig?syncConfig = null, IBeaconPivot?beaconPivot = null, IDb?metadataDb = null, IMergeConfig?mergeConfig = null) { if (blockTree == null) { IDb blockInfoDb = new MemDb(); Block genesis = Build.A.Block.Genesis.TestObject; BlockTree = new BlockTree(new MemDb(), new MemDb(), blockInfoDb, new ChainLevelInfoRepository(blockInfoDb), MainnetSpecProvider.Instance, NullBloomStorage.Instance, LimboLogs.Instance); BlockTree.SuggestBlock(genesis); } else { BlockTree = blockTree; } ISyncPeerPool peerPool = Substitute.For <ISyncPeerPool>(); ISyncReport report = Substitute.For <ISyncReport>(); MeasuredProgress measuredProgress = new MeasuredProgress(); report.BeaconHeaders.Returns(measuredProgress); report.HeadersInQueue.Returns(measuredProgress); MemDb stateDb = new(); _syncConfig = syncConfig ?? new SyncConfig(); _mergeConfig = mergeConfig ?? new MergeConfig(); _metadataDb = metadataDb ?? new MemDb(); PoSSwitcher poSSwitcher = new(_mergeConfig, _syncConfig, _metadataDb, blockTree !, MainnetSpecProvider.Instance, LimboLogs.Instance); ProgressTracker progressTracker = new(BlockTree, stateDb, LimboLogs.Instance); SyncProgressResolver syncProgressResolver = new( BlockTree, NullReceiptStorage.Instance, stateDb, new TrieStore(stateDb, LimboLogs.Instance), progressTracker, _syncConfig, LimboLogs.Instance); TotalDifficultyBetterPeerStrategy bestPeerStrategy = new (LimboLogs.Instance); BeaconPivot = beaconPivot ?? new BeaconPivot(_syncConfig, _metadataDb, BlockTree, LimboLogs.Instance); BeaconSync = new(BeaconPivot, BlockTree, _syncConfig, new BlockCacheService(), LimboLogs.Instance); ISyncModeSelector selector = new MultiSyncModeSelector(syncProgressResolver, peerPool, _syncConfig, BeaconSync, bestPeerStrategy, LimboLogs.Instance); Feed = new BeaconHeadersSyncFeed(poSSwitcher, selector, blockTree, peerPool, _syncConfig, report, BeaconPivot, _mergeConfig, new NoopInvalidChainTracker(), LimboLogs.Instance); }
/// <summary> /// Test suite for beacon sync. /// </summary> /// <param name="needToWaitForHeaders">Do we need to wait for headers before other sync.</param> /// <param name="mode">Beacon mode we will be in.</param> public MultiSyncModeSelectorBeaconTests(bool needToWaitForHeaders, BeaconSync mode) : base(needToWaitForHeaders) { _mode = mode; }