From 7f62918c54ff4fcd0b8048851908c36377581c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Moraczy=C5=84ski?= Date: Tue, 19 Dec 2023 22:55:37 +0100 Subject: [PATCH] Add PivotUpdator tests (#6399) * Add PivotUpdater tests, cosmetic rename * whitespaces * revert class name change --- .../Synchronization/PivotUpdatorTests.cs | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/Nethermind/Nethermind.Merge.Plugin.Test/Synchronization/PivotUpdatorTests.cs diff --git a/src/Nethermind/Nethermind.Merge.Plugin.Test/Synchronization/PivotUpdatorTests.cs b/src/Nethermind/Nethermind.Merge.Plugin.Test/Synchronization/PivotUpdatorTests.cs new file mode 100644 index 00000000000..132e1f12c71 --- /dev/null +++ b/src/Nethermind/Nethermind.Merge.Plugin.Test/Synchronization/PivotUpdatorTests.cs @@ -0,0 +1,95 @@ +// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using FluentAssertions; +using NUnit.Framework; +using NSubstitute; +using Nethermind.Blockchain; +using Nethermind.Blockchain.Synchronization; +using Nethermind.Config; +using Nethermind.Core; +using Nethermind.Core.Crypto; +using Nethermind.Core.Test.Builders; +using Nethermind.Db; +using Nethermind.Logging; +using Nethermind.Merge.Plugin.Handlers; +using Nethermind.Merge.Plugin.Synchronization; +using Nethermind.Serialization.Rlp; +using Nethermind.Specs; +using Nethermind.Specs.Forks; +using Nethermind.Stats.Model; +using Nethermind.Synchronization; +using Nethermind.Synchronization.ParallelSync; +using Nethermind.Synchronization.Peers; + +namespace Nethermind.Merge.Plugin.Test.Synchronization +{ + public class PivotUpdatorTests + { + private IBlockTree? _blockTree; + private ISyncModeSelector? _syncModeSelector; + private ISyncPeerPool? _syncPeerPool; + private ISyncConfig? _syncConfig; + private IBlockCacheService? _blockCacheService; + private IBeaconSyncStrategy? _beaconSyncStrategy; + private IDb? _metadataDb; + private IBlockTree? _externalPeerBlockTree; + + [SetUp] + public void Setup() + { + Block genesisBlock = Build.A.Block.WithNumber(0).TestObject; + TestSpecProvider specProvider = new(Cancun.Instance); + specProvider.TerminalTotalDifficulty = 0; + _externalPeerBlockTree = Build.A.BlockTree(genesisBlock, specProvider) + .WithoutSettingHead + .OfChainLength(20) + .TestObject; + + ISyncPeer? fakePeer = Substitute.For(); + fakePeer.GetHeadBlockHeader(default, default).ReturnsForAnyArgs(x => _externalPeerBlockTree!.Head!.Header); + NetworkNode node = new(TestItem.PublicKeyA, "127.0.0.1", 30303, 100L); + fakePeer.Node.Returns(new Node(node)); + + _syncPeerPool = Substitute.For(); + _syncPeerPool.InitializedPeers.Returns(new[] { new PeerInfo(fakePeer) }); + + _blockTree = Substitute.For(); + _syncModeSelector = Substitute.For(); + _syncConfig = Substitute.For(); + _blockCacheService = new BlockCacheService(); + _beaconSyncStrategy = Substitute.For(); + _metadataDb = new MemDb(); + + PivotUpdator pivotUpdator = new( + _blockTree, + _syncModeSelector, + _syncPeerPool, + _syncConfig, + _blockCacheService, + _beaconSyncStrategy, + _metadataDb, + LimboLogs.Instance + ); + } + + [Test] + public void TrySetFreshPivot_SavesFinalizedHashInDb() + { + SyncModeChangedEventArgs args = new(SyncMode.FastSync, SyncMode.UpdatingPivot); + Hash256 expectedFinalizedHash = _externalPeerBlockTree!.HeadHash; + long expectedPivotBlockNumber = _externalPeerBlockTree!.Head!.Number; + _beaconSyncStrategy!.GetFinalizedHash().Returns(expectedFinalizedHash); + + _syncModeSelector!.Changed += Raise.EventWith(args); + + byte[] storedData = _metadataDb!.Get(MetadataDbKeys.UpdatedPivotData)!; + RlpStream pivotStream = new(storedData!); + long storedPivotBlockNumber = pivotStream.DecodeLong(); + Hash256 storedFinalizedHash = pivotStream.DecodeKeccak()!; + + storedFinalizedHash.Should().Be(expectedFinalizedHash); + expectedPivotBlockNumber.Should().Be(storedPivotBlockNumber); + } + } +}