public void ProcessBlock_BlockNotOnBestChain_ReorgWalletTipAfterNewTip_StartProcessingFromFork() { (ConcurrentChain LeftChain, ConcurrentChain RightChain, List <Block> LeftForkBlocks, List <Block> RightForkBlocks)result = WalletTestsHelpers.GenerateForkedChainAndBlocksWithHeight(5, KnownNetworks.StratisMain, 2); // left side chain containing the 'old' fork. ConcurrentChain leftChain = result.LeftChain; // right side chain containing the 'new' fork. Work on this. this.chain = result.RightChain; var lightWalletSyncManager = new LightWalletSyncManagerOverride(this.LoggerFactory.Object, this.walletManager.Object, this.chain, this.network, this.blockNotification.Object, this.signals.Object, this.nodeLifetime.Object, this.asyncLoopFactory.Object, this.consensusManager.Object); // set 4th block of the old chain as tip. 2 ahead of the fork thus not being on the right chain. lightWalletSyncManager.SetWalletTip(leftChain.GetBlock(result.LeftForkBlocks[3].Header.GetHash())); //process 2nd block from the right side of the fork in the list does not have same prevhash as which is loaded. Block blockToProcess = result.RightForkBlocks[1]; lightWalletSyncManager.ProcessBlock(blockToProcess); // walletmanager removes all blocks up to the fork. this.walletManager.Verify(w => w.RemoveBlocks(ExpectChainedBlock(this.chain.GetBlock(2)))); //expect the wallet tip to be set to the fork and do not start the sync to be started from that block. Assert.Equal(this.chain.GetBlock(2).HashBlock, lightWalletSyncManager.WalletTip.HashBlock); this.blockNotification.Verify(w => w.SyncFrom(It.IsAny <uint256>()), Times.Exactly(0)); // expect the block to be processed. this.walletManager.Verify(w => w.ProcessBlock(ExpectBlock(result.RightForkBlocks[1]), ExpectChainedBlock(this.chain.GetBlock(2)))); }
public void ProcessBlock_BlockNotOnBestChain_ReorgWalletTipBeforeNewTip_StartsSyncFromForkPointWithoutProcessingBlock() { var result = WalletTestsHelpers.GenerateForkedChainAndBlocksWithHeight(5, Network.StratisMain, 2); // left side chain containing the 'old' fork. var leftChain = result.LeftChain; // right side chain containing the 'new' fork. Work on this. this.chain = result.RightChain; var lightWalletSyncManager = new LightWalletSyncManagerOverride(this.LoggerFactory.Object, this.walletManager.Object, this.chain, this.network, this.blockNotification.Object, this.signals.Object, this.nodeLifetime.Object, this.asyncLoopFactory.Object); // set 4th block of the old chain as tip. 2 ahead of the fork thus not being on the right chain. lightWalletSyncManager.SetWalletTip(leftChain.GetBlock(result.LeftForkBlocks[3].Header.GetHash())); //process 5th block from the right side of the fork in the list does not have same prevhash as which is loaded. var blockToProcess = result.RightForkBlocks[4]; lightWalletSyncManager.ProcessBlock(blockToProcess); // walletmanager removes all blocks up to the fork. this.walletManager.Verify(w => w.RemoveBlocks(ExpectChainedBlock(this.chain.GetBlock(2)))); //expect the wallet tip to be set to the fork and the sync to be started from that block. Assert.Equal(this.chain.GetBlock(2).HashBlock, lightWalletSyncManager.WalletTip.HashBlock); this.blockNotification.Verify(w => w.SyncFrom(this.chain.GetBlock(2).HashBlock)); // expect no blocks to be processed. this.walletManager.Verify(w => w.ProcessBlock(It.IsAny <Block>(), It.IsAny <ChainedBlock>()), Times.Exactly(0)); }
public void ProcessBlock_NewBlock_PreviousHashSameAsWalletTip_PassesBlockToManagerWithoutReorg() { (ConcurrentChain Chain, List <Block> Blocks)result = WalletTestsHelpers.GenerateChainAndBlocksWithHeight(5, KnownNetworks.StratisMain); this.chain = result.Chain; List <Block> blocks = result.Blocks; var lightWalletSyncManager = new LightWalletSyncManagerOverride(this.LoggerFactory.Object, this.walletManager.Object, this.chain, this.network, this.blockNotification.Object, this.signals.Object, this.nodeLifetime.Object, this.asyncLoopFactory.Object, this.consensusManager.Object); lightWalletSyncManager.SetWalletTip(this.chain.GetBlock(3)); Block blockToProcess = blocks[3]; lightWalletSyncManager.ProcessBlock(blockToProcess); //4th block in the list has same prevhash as which is loaded uint256 expectedBlockHash = this.chain.GetBlock(4).Header.GetHash(); Assert.Equal(expectedBlockHash, lightWalletSyncManager.WalletTip.Header.GetHash()); this.walletManager.Verify(w => w.ProcessBlock(It.Is <Block>(b => b.GetHash() == blockToProcess.GetHash()), It.Is <ChainedHeader>(c => c.Header.GetHash() == expectedBlockHash))); }
public void ProcessBlock_NewBlock_BlockOnBestChain_WalletTipAfterNewTip_StartsSyncFromNewTip() { (ConcurrentChain Chain, List <Block> Blocks)result = WalletTestsHelpers.GenerateChainAndBlocksWithHeight(5, KnownNetworks.StratisMain); this.chain = result.Chain; List <Block> blocks = result.Blocks; var lightWalletSyncManager = new LightWalletSyncManagerOverride(this.LoggerFactory.Object, this.walletManager.Object, this.chain, this.network, this.blockNotification.Object, this.signals.Object, this.nodeLifetime.Object, this.asyncLoopFactory.Object, this.consensusManager.Object); // set 2nd block as tip lightWalletSyncManager.SetWalletTip(this.chain.GetBlock(4)); //process 4th block in the list does not have same prevhash as which is loaded Block blockToProcess = blocks[3]; lightWalletSyncManager.ProcessBlock(blockToProcess); uint256 expectedBlockHash = this.chain.GetBlock(4).Header.GetHash(); Assert.Equal(expectedBlockHash, lightWalletSyncManager.WalletTip.Header.GetHash()); this.walletManager.Verify(w => w.ProcessBlock(ExpectBlock(blocks[3]), ExpectChainedBlock(this.chain.GetBlock(4)))); }
public void ProcessBlock_NewBlock_BlockOnBestChain_WalletTipBeforeNewTip_StartsSyncFromWalletTipWithoutProcessingBlock() { (ConcurrentChain Chain, List <Block> Blocks)result = WalletTestsHelpers.GenerateChainAndBlocksWithHeight(5, Network.StratisMain); this.chain = result.Chain; List <Block> blocks = result.Blocks; var lightWalletSyncManager = new LightWalletSyncManagerOverride(this.LoggerFactory.Object, this.walletManager.Object, this.chain, this.network, this.blockNotification.Object, this.signals.Object, this.nodeLifetime.Object, this.asyncLoopFactory.Object); // set 2nd block as tip lightWalletSyncManager.SetWalletTip(this.chain.GetBlock(2)); //process 4th block in the list does not have same prevhash as which is loaded Block blockToProcess = blocks[3]; lightWalletSyncManager.ProcessBlock(blockToProcess); this.blockNotification.Verify(b => b.SyncFrom(this.chain.GetBlock(2).HashBlock)); uint256 expectedBlockHash = this.chain.GetBlock(2).Header.GetHash(); Assert.Equal(expectedBlockHash, lightWalletSyncManager.WalletTip.Header.GetHash()); this.walletManager.Verify(w => w.ProcessBlock(It.IsAny <Block>(), It.IsAny <ChainedHeader>()), Times.Exactly(0)); }