public void consecutive_initiate_change_gets_finalized_and_switch_validators(ConsecutiveInitiateChangeTestParameters test) { var currentValidators = GenerateValidators(1); SetupInitialValidators(currentValidators); IAuRaValidatorProcessor validator = new ContractValidator(_validator, new MemDb(), _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _receiptsStorage, _logManager, test.StartBlockNumber); validator.SetFinalizationManager(_blockFinalizationManager); test.TryDoReorganisations(test.StartBlockNumber, out _); for (int i = 0; i < test.Current.NumberOfSteps; i++) { var blockNumber = test.Current.BlockNumber + i; if (test.TryDoReorganisations(blockNumber, out var lastChain)) { ValidateFinalizationForChain(lastChain); i = 0; blockNumber = test.Current.BlockNumber + i; } _block.Number = blockNumber; _block.Beneficiary = currentValidators[blockNumber % currentValidators.Length]; _block.Header.AuRaStep = blockNumber; _block.Hash = Keccak.Compute(blockNumber.ToString()); var txReceipts = test.GetReceipts(_block, _contractAddress, _abiEncoder, SetupAbiAddresses); _block.Bloom = new Bloom(txReceipts.SelectMany(r => r.Logs).ToArray()); Action preProcess = () => validator.PreProcess(_block); preProcess.Should().NotThrow <InvalidOperationException>(test.TestName); validator.PostProcess(_block, txReceipts); var finalizedNumber = blockNumber - validator.MinSealersForFinalization + 1; _blockFinalizationManager.BlocksFinalized += Raise.EventWith( new FinalizeEventArgs(_block.Header, Build.A.BlockHeader.WithNumber(finalizedNumber) .WithHash(Keccak.Compute(finalizedNumber.ToString())).TestObject)); currentValidators = test.GetCurrentValidators(blockNumber); var nextValidators = test.GetNextValidators(blockNumber); currentValidators.Select((a, index) => validator.IsValidSealer(a, index)).Should().AllBeEquivalentTo(true, $"Validator address is not recognized in block {blockNumber}"); nextValidators?.Except(currentValidators).Select((a, index) => validator.IsValidSealer(a, index)).Should().AllBeEquivalentTo(false); } ValidateFinalizationForChain(test.Current); }
public void consecutive_initiate_change_gets_finalized_and_switch_validators(ConsecutiveInitiateChangeTestParameters test) { var currentValidators = GenerateValidators(1); SetupInitialValidators(currentValidators); var validator = new ContractValidator(_validator, _stateProvider, _abiEncoder, _transactionProcessor, _logManager, test.StartBlockNumber); test.TryDoReorganisations(test.StartBlockNumber, out _); for (int i = 0; i < test.Current.NumberOfSteps; i++) { var blockNumber = test.Current.BlockNumber + i; if (test.TryDoReorganisations(blockNumber, out var lastChain)) { ValidateFinalizationForChain(lastChain); i = 0; blockNumber = test.Current.BlockNumber + i; } _block.Number = blockNumber; _block.Beneficiary = currentValidators[i % currentValidators.Length]; var txReceipts = test.GetReceipts(_block, _contractAddress, _abiEncoder, SetupAbiAddresses); _block.Bloom = new Bloom(txReceipts.SelectMany(r => r.Logs).ToArray()); validator.PreProcess(_block); validator.PostProcess(_block, txReceipts); currentValidators = test.GetCurrentValidators(blockNumber); var nextValidators = test.GetNextValidators(blockNumber); currentValidators.Select(a => validator.IsValidSealer(a)).Should().AllBeEquivalentTo(true, $"Validator address is not recognized in block {blockNumber}"); nextValidators?.Except(currentValidators).Select(a => validator.IsValidSealer(a)).Should().AllBeEquivalentTo(false); } ValidateFinalizationForChain(test.Current); }