public void IsValid_ValidChainedBlock_IsValid() { // Arrange var blockHeaderToValidate = new BlockHeaderBuilder() .WithIndex(2) .WithPreviousBlockHash(UInt256.Parse("0xd42561e3d30e15be6400b6df2f328e02d2bf6354c41dce433bc57687c82144bf")) .Build(); var lastBlockHeader = new BlockHeaderBuilder() .WithHash(UInt256.Parse("0xd42561e3d30e15be6400b6df2f328e02d2bf6354c41dce433bc57687c82144bf")) .WithIndex(1) .Build(); this.AutoMockContainer .GetMock <IBlockchainContext>() .SetupGet(x => x.LastBlockHeader) .Returns(lastBlockHeader); var testee = this.AutoMockContainer.Create <BlockHeaderValidator>(); // Act var result = testee.IsValid(blockHeaderToValidate); // Assert Assert.IsTrue(result); }
public void GetBlockWithNumber() { BlockHeaderBuilder builder = new BlockHeaderBuilder(); BlockHeader block = builder.Number(42).Build(); Assert.IsNotNull(block); Assert.AreEqual(42, block.Number); }
public void GetBlockZero() { BlockHeaderBuilder builder = new BlockHeaderBuilder(); BlockHeader block = builder.Build(); Assert.IsNotNull(block); Assert.AreEqual(0, block.Number); }
public async Task Persist_ValidBlock_BlockIsPersisted() { // Arrange var blockHeaderToPersist = new BlockHeaderBuilder() .WithIndex(2) .Build(); var lastBlockHeader = new BlockHeaderBuilder() .WithIndex(1) .Build(); var blockHeaderValidatorMock = this.AutoMockContainer.GetMock <IBlockHeaderValidator>(); blockHeaderValidatorMock .Setup(x => x.IsValid(blockHeaderToPersist)) .Returns(true); var blockContextMock = this.AutoMockContainer.GetMock <IBlockchainContext>(); blockContextMock .SetupGet(x => x.LastBlockHeader) .Returns(lastBlockHeader); var blockHeaderSignerMock = this.AutoMockContainer.GetMock <ISigner <BlockHeader> >(); var blockRepository = this.AutoMockContainer.GetMock <IBlockRepository>(); var testee = this.AutoMockContainer.Create <BlockHeaderPersister>(); // Act var persistedBlocks = (await testee.Persist(blockHeaderToPersist)).ToList(); // Assert persistedBlocks .Should() .HaveCount(1); persistedBlocks .Single() .Should() .BeEquivalentTo(blockHeaderToPersist); blockHeaderSignerMock.Verify(x => x.Sign(blockHeaderToPersist), Times.Once); blockHeaderValidatorMock.Verify(x => x.IsValid(blockHeaderToPersist), Times.Once); blockRepository.Verify(x => x.AddBlockHeader(blockHeaderToPersist), Times.Once); blockContextMock.VerifySet(x => x.LastBlockHeader = blockHeaderToPersist, Times.Once); }
public void givenAnInvalidBlock_ifParentIsNotPostMerge_thenLastValidHashShouldBeZero() { IBlockFinder blockFinder = Substitute.For <IBlockFinder>(); IBlockCacheService blockCacheService = new BlockCacheService(); Keccak invalidBlock = Keccak.Compute("A"); BlockHeader parentBlockHeader = new BlockHeaderBuilder().TestObject; blockCacheService.BlockCache[parentBlockHeader.Hash] = new Block(parentBlockHeader); IPoSSwitcher poSSwitcher = Substitute.For <IPoSSwitcher>(); poSSwitcher.IsPostMerge(parentBlockHeader).Returns(false); _tracker = new(poSSwitcher, blockFinder, blockCacheService, new TestLogManager()); // Small max section size, to make sure things propagate correctly _tracker.OnInvalidBlock(invalidBlock, parentBlockHeader.Hash); AssertInvalid(invalidBlock, Keccak.Zero); }
public void givenAnInvalidBlock_WithUnknownParent_thenGetParentFromCache() { IBlockFinder blockFinder = Substitute.For <IBlockFinder>(); IBlockCacheService blockCacheService = new BlockCacheService(); BlockHeader parentBlockHeader = new BlockHeaderBuilder() .TestObject; BlockHeader blockHeader = new BlockHeaderBuilder() .WithParentHash(parentBlockHeader.Hash).TestObject; blockCacheService.BlockCache[blockHeader.Hash] = new Block(blockHeader); blockCacheService.BlockCache[parentBlockHeader.Hash] = new Block(parentBlockHeader); IPoSSwitcher alwaysPos = Substitute.For <IPoSSwitcher>(); alwaysPos.IsPostMerge(Arg.Any <BlockHeader>()).Returns(true); _tracker = new(alwaysPos, blockFinder, blockCacheService, new TestLogManager()); // Small max section size, to make sure things propagate correctly _tracker.OnInvalidBlock(blockHeader.Hash, null); AssertInvalid(blockHeader.Hash, parentBlockHeader.Hash); }
public void IsValid_InvalidGenesisBlockAndNoLastBlockHeader_IsNotInvalid() { // Arrange var blockHeaderToValidate = new BlockHeaderBuilder() .WithHash(UInt256.Parse("0xd42561e3d30e15be6400b6df2f328e02d2bf6354c41dce433bc57687c82144bf")) .WithIndex(1) .Build(); var genesisBlock = new BlockBuilder() .BuildGenerisBlock(); this.AutoMockContainer .GetMock <IGenesisBuilder>() .Setup(x => x.Build()) .Returns(genesisBlock); var testee = this.AutoMockContainer.Create <BlockHeaderValidator>(); // Act var result = testee.IsValid(blockHeaderToValidate); // Assert Assert.IsFalse(result); }
public async Task Persist_InvalidGenesisBlock_BlockIsNotPersisted() { // Arrange var blockHeaderToPersist = new BlockHeaderBuilder() .Build(); var blockHeaderValidatorMock = this.AutoMockContainer.GetMock <IBlockHeaderValidator>(); blockHeaderValidatorMock .Setup(x => x.IsValid(blockHeaderToPersist)) .Returns(false); var blockContextMock = this.AutoMockContainer.GetMock <IBlockchainContext>(); blockContextMock .SetupGet(x => x.LastBlockHeader) .Returns(default(BlockHeader)); var blockHeaderSignerMock = this.AutoMockContainer.GetMock <ISigner <BlockHeader> >(); var blockRepository = this.AutoMockContainer.GetMock <IBlockRepository>(); var testee = this.AutoMockContainer.Create <BlockHeaderPersister>(); // Act var persistedBlocks = (await testee.Persist(blockHeaderToPersist)).ToList(); // Assert persistedBlocks .Should() .BeEmpty(); blockHeaderSignerMock.Verify(x => x.Sign(blockHeaderToPersist), Times.Once); blockHeaderValidatorMock.Verify(x => x.IsValid(blockHeaderToPersist), Times.Once); blockRepository.Verify(x => x.AddBlockHeader(blockHeaderToPersist), Times.Never); blockContextMock.VerifySet(x => x.LastBlockHeader = blockHeaderToPersist, Times.Never); }