diff --git a/src/Nethermind/Nethermind.Merge.Plugin.Test/Synchronization/MergePeerAllocationStrategyTests.cs b/src/Nethermind/Nethermind.Merge.Plugin.Test/Synchronization/MergePeerAllocationStrategyTests.cs index 7895ea555db..f0a8ad39af0 100644 --- a/src/Nethermind/Nethermind.Merge.Plugin.Test/Synchronization/MergePeerAllocationStrategyTests.cs +++ b/src/Nethermind/Nethermind.Merge.Plugin.Test/Synchronization/MergePeerAllocationStrategyTests.cs @@ -15,15 +15,89 @@ // along with the Nethermind. If not, see . // +using Nethermind.Blockchain; +using Nethermind.Blockchain.Synchronization; +using Nethermind.Consensus; +using Nethermind.Core.Crypto; +using Nethermind.Core.Test.Builders; +using Nethermind.Int256; +using Nethermind.Logging; +using Nethermind.Merge.Plugin.Synchronization; +using Nethermind.Stats; +using Nethermind.Stats.Model; +using Nethermind.Synchronization.Blocks; +using Nethermind.Synchronization.Peers; +using Nethermind.Synchronization.Peers.AllocationStrategies; +using NSubstitute; using NUnit.Framework; namespace Nethermind.Merge.Plugin.Test.Synchronization; public class MergePeerAllocationStrategyTests { + [Test] public void Should_allocate_by_totalDifficulty_before_the_merge() { + ulong[] totalDifficulties = {1,3,2}; + int[] averageSpeed = {5,8,10}; + PublicKey[] publicKeys = {TestItem.PublicKeyA, TestItem.PublicKeyB, TestItem.PublicKeyC}; + PeerInfo[] peers = new PeerInfo[3]; + INodeStatsManager _nodeStatsManager = Substitute.For(); + for (int i = 0; i < 3; i++) + { + ISyncPeer syncPeer = Substitute.For(); + syncPeer.IsInitialized.Returns(true); + Node node = new Node(publicKeys[i], "192.168.1.18", i); + syncPeer.Node.Returns(node); + syncPeer.TotalDifficulty.Returns(new UInt256(totalDifficulties[i])); + peers[i] = new PeerInfo(syncPeer); + INodeStats nodeStats = Substitute.For(); + nodeStats.GetAverageTransferSpeed(Arg.Any()).Returns(averageSpeed[i]); + _nodeStatsManager.GetOrAdd(peers[i].SyncPeer.Node).Returns(nodeStats); + } + IPoSSwitcher poSSwitcher = Substitute.For(); + poSSwitcher.TerminalTotalDifficulty.Returns(new UInt256(5)); + poSSwitcher.HasEverReachedTerminalBlock().Returns(false); + poSSwitcher.TransitionFinished.Returns(false); + IPeerAllocationStrategy mergePeerAllocationStrategy = + (new MergeBlocksSyncPeerAllocationStrategyFactory(poSSwitcher, Substitute.For())).Create(new BlocksRequest()); + IBlockTree _blockTree = Substitute.For(); + PeerInfo? info = mergePeerAllocationStrategy.Allocate(null, peers, _nodeStatsManager, _blockTree); + Assert.AreEqual(info,peers[1]); // peer with highest total difficulty } + + [Test] + public void Should_allocate_by_speed_post_merge() + { + ulong[] totalDifficulties = {1,3,2}; + int[] averageSpeed = {5,8,10}; + PublicKey[] publicKeys = {TestItem.PublicKeyA, TestItem.PublicKeyB, TestItem.PublicKeyC}; + PeerInfo[] peers = new PeerInfo[3]; + INodeStatsManager _nodeStatsManager = Substitute.For(); + for (int i = 0; i < 3; i++) + { + ISyncPeer syncPeer = Substitute.For(); + syncPeer.IsInitialized.Returns(true); + Node node = new Node(publicKeys[i], "192.168.1.18", i); + syncPeer.Node.Returns(node); + syncPeer.TotalDifficulty.Returns(new UInt256(totalDifficulties[i])); + peers[i] = new PeerInfo(syncPeer); + peers[i].HeadNumber.Returns(1); + INodeStats nodeStats = Substitute.For(); + nodeStats.GetAverageTransferSpeed(Arg.Any()).Returns(averageSpeed[i]); + _nodeStatsManager.GetOrAdd(peers[i].SyncPeer.Node).Returns(nodeStats); + } + IPoSSwitcher poSSwitcher = Substitute.For(); + poSSwitcher.TerminalTotalDifficulty.Returns(new UInt256(1)); + poSSwitcher.HasEverReachedTerminalBlock().Returns(true); + IPeerAllocationStrategy mergePeerAllocationStrategy = + (new MergeBlocksSyncPeerAllocationStrategyFactory(poSSwitcher, Substitute.For())).Create(new BlocksRequest()); + IBlockTree _blockTree = Substitute.For(); + PeerInfo? info = mergePeerAllocationStrategy.Allocate(null, peers, _nodeStatsManager, _blockTree); + + Assert.AreEqual(info,peers[2]); // peer with highest highest speed + } + }