public void nonconsecutive_non_producing_preProcess_loads_pending_validators_from_receipts(int lastLevelFinalized, int initialValidatorsIndex, int?expectedBlockValidators) { IEnumerable <Block> GetAllBlocks(BlockTree bt) { var block = bt.FindBlock(bt.Head.Hash, BlockTreeLookupOptions.None); while (block != null) { yield return(block); block = bt.FindBlock(block.ParentHash, BlockTreeLookupOptions.None); } } var validators = TestItem.Addresses[initialValidatorsIndex * 10]; var inMemoryReceiptStorage = new InMemoryReceiptStorage(); var blockTreeBuilder = Build.A.BlockTree().WithTransactions(inMemoryReceiptStorage, RopstenSpecProvider.Instance, delegate(Block block, Transaction transaction) { byte i = 0; return(new[] { Build.A.LogEntry.WithAddress(_contractAddress) .WithData(new[] { (byte)(block.Number * 10 + i++) }) .WithTopics(ValidatorContract.Definition.initiateChangeEventHash, block.ParentHash) .TestObject }); }) .OfChainLength(9, 0, 0, validators); var blockTree = blockTreeBuilder.TestObject; SetupInitialValidators(blockTree.Head, validators); IAuRaValidatorProcessor validator = new ContractValidator(_validator, _db, _stateProvider, _abiEncoder, _transactionProcessor, blockTree, inMemoryReceiptStorage, _logManager, 1); validator.SetFinalizationManager(_blockFinalizationManager); _abiEncoder.Decode(ValidatorContract.Definition.addressArrayResult, Arg.Any <byte[]>()) .Returns(c => { var addressIndex = c.Arg <byte[]>()[0]; return(new object[] { new Address[] { TestItem.Addresses[addressIndex] } }); }); _blockFinalizationManager.GetLastLevelFinalizedBy(blockTree.Head.ParentHash).Returns(lastLevelFinalized); validator.PreProcess(blockTree.FindBlock(blockTree.Head.Hash, BlockTreeLookupOptions.None)); byte[] expectedPendingValidatorsBytes = Rlp.OfEmptySequence.Bytes; if (expectedBlockValidators.HasValue) { var block = GetAllBlocks(blockTree).First(b => b.Number == expectedBlockValidators.Value); var pendingValidators = new ContractValidator.PendingValidators(block.Number, block.Hash, new [] { TestItem.Addresses[block.Number * 10] }); expectedPendingValidatorsBytes = Rlp.Encode(pendingValidators).Bytes; } _db.Received()[ContractValidator.PendingValidatorsKey.Bytes] = Arg.Is <byte[]>(r => r.SequenceEqual(expectedPendingValidatorsBytes)); }
public void initializes_pendingValidators_from_db() { var blockNumber = 10; var validators = TestItem.Addresses.Take(10).ToArray(); var blockHash = Keccak.Compute("Test"); var pendingValidators = new ContractValidator.PendingValidators(blockNumber, blockHash, validators); var rlp = Rlp.Encode(pendingValidators); _db[ContractValidator.PendingValidatorsKey.Bytes].Returns(rlp.Bytes); IAuRaValidatorProcessor validator = new ContractValidator(_validator, _db, _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _receiptsStorage, _logManager, 1); validator.SetFinalizationManager(_blockFinalizationManager); _blockFinalizationManager.BlocksFinalized += Raise.EventWith(new FinalizeEventArgs(_block.Header, Build.A.BlockHeader.WithNumber(blockNumber).WithHash(blockHash).TestObject)); validators.Select((v, i) => validator.IsValidSealer(v, i)).Should().AllBeEquivalentTo(true); }