Exemple #1
0
        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);
        }
Exemple #2
0
        public void GetBlockWithNumber()
        {
            BlockHeaderBuilder builder = new BlockHeaderBuilder();

            BlockHeader block = builder.Number(42).Build();

            Assert.IsNotNull(block);
            Assert.AreEqual(42, block.Number);
        }
Exemple #3
0
        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);
        }
Exemple #5
0
    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);
    }
Exemple #6
0
    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);
    }
Exemple #7
0
        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);
        }