bring back old keeper_test

This commit is contained in:
rigelrozanski 2018-05-10 19:20:16 -04:00
parent ee9fe541f4
commit 0ad2cc0dc7
1 changed files with 315 additions and 274 deletions

View File

@ -23,128 +23,128 @@ var (
}
)
// This function tests GetValidator, GetValidators, setValidator, removeValidator
func TestValidator(t *testing.T) {
// This function tests GetCandidate, GetCandidates, setCandidate, removeCandidate
func TestCandidate(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
//construct the validators
var validators [3]Validator
//construct the candidates
var candidates [3]Candidate
amts := []int64{9, 8, 7}
for i, amt := range amts {
validators[i] = NewValidator(addrVals[i], pks[i], Description{})
validators[i].BondedShares = sdk.NewRat(amt)
validators[i].DelegatorShares = sdk.NewRat(amt)
candidates[i] = NewCandidate(addrVals[i], pks[i], Description{})
candidates[i].BondedShares = sdk.NewRat(amt)
candidates[i].DelegatorShares = sdk.NewRat(amt)
}
// check the empty keeper first
_, found := keeper.GetValidator(ctx, addrVals[0])
_, found := keeper.GetCandidate(ctx, addrVals[0])
assert.False(t, found)
resCands := keeper.GetValidators(ctx, 100)
resCands := keeper.GetCandidates(ctx, 100)
assert.Zero(t, len(resCands))
// set and retrieve a record
keeper.setValidator(ctx, validators[0])
resCand, found := keeper.GetValidator(ctx, addrVals[0])
keeper.setCandidate(ctx, candidates[0])
resCand, found := keeper.GetCandidate(ctx, addrVals[0])
require.True(t, found)
assert.True(t, validators[0].equal(resCand), "%v \n %v", resCand, validators[0])
assert.True(t, candidates[0].equal(resCand), "%v \n %v", resCand, candidates[0])
// modify a records, save, and retrieve
validators[0].DelegatorShares = sdk.NewRat(99)
keeper.setValidator(ctx, validators[0])
resCand, found = keeper.GetValidator(ctx, addrVals[0])
candidates[0].DelegatorShares = sdk.NewRat(99)
keeper.setCandidate(ctx, candidates[0])
resCand, found = keeper.GetCandidate(ctx, addrVals[0])
require.True(t, found)
assert.True(t, validators[0].equal(resCand))
assert.True(t, candidates[0].equal(resCand))
// also test that the address has been added to address list
resCands = keeper.GetValidators(ctx, 100)
resCands = keeper.GetCandidates(ctx, 100)
require.Equal(t, 1, len(resCands))
assert.Equal(t, addrVals[0], resCands[0].Address)
// add other validators
keeper.setValidator(ctx, validators[1])
keeper.setValidator(ctx, validators[2])
resCand, found = keeper.GetValidator(ctx, addrVals[1])
// add other candidates
keeper.setCandidate(ctx, candidates[1])
keeper.setCandidate(ctx, candidates[2])
resCand, found = keeper.GetCandidate(ctx, addrVals[1])
require.True(t, found)
assert.True(t, validators[1].equal(resCand), "%v \n %v", resCand, validators[1])
resCand, found = keeper.GetValidator(ctx, addrVals[2])
assert.True(t, candidates[1].equal(resCand), "%v \n %v", resCand, candidates[1])
resCand, found = keeper.GetCandidate(ctx, addrVals[2])
require.True(t, found)
assert.True(t, validators[2].equal(resCand), "%v \n %v", resCand, validators[2])
resCands = keeper.GetValidators(ctx, 100)
assert.True(t, candidates[2].equal(resCand), "%v \n %v", resCand, candidates[2])
resCands = keeper.GetCandidates(ctx, 100)
require.Equal(t, 3, len(resCands))
assert.True(t, validators[0].equal(resCands[0]), "%v \n %v", resCands[0], validators[0])
assert.True(t, validators[1].equal(resCands[1]), "%v \n %v", resCands[1], validators[1])
assert.True(t, validators[2].equal(resCands[2]), "%v \n %v", resCands[2], validators[2])
assert.True(t, candidates[0].equal(resCands[0]), "%v \n %v", resCands[0], candidates[0])
assert.True(t, candidates[1].equal(resCands[1]), "%v \n %v", resCands[1], candidates[1])
assert.True(t, candidates[2].equal(resCands[2]), "%v \n %v", resCands[2], candidates[2])
// remove a record
keeper.removeValidator(ctx, validators[1].Address)
_, found = keeper.GetValidator(ctx, addrVals[1])
keeper.removeCandidate(ctx, candidates[1].Address)
_, found = keeper.GetCandidate(ctx, addrVals[1])
assert.False(t, found)
}
// tests GetDelegation, GetDelegations, SetDelegation, removeDelegation, GetBonds
// tests GetDelegatorBond, GetDelegatorBonds, SetDelegatorBond, removeDelegatorBond, GetBonds
func TestBond(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
//construct the validators
//construct the candidates
amts := []int64{9, 8, 7}
var validators [3]Validator
var candidates [3]Candidate
for i, amt := range amts {
validators[i] = NewValidator(addrVals[i], pks[i], Description{})
validators[i].BondedShares = sdk.NewRat(amt)
validators[i].DelegatorShares = sdk.NewRat(amt)
candidates[i] = NewCandidate(addrVals[i], pks[i], Description{})
candidates[i].BondedShares = sdk.NewRat(amt)
candidates[i].DelegatorShares = sdk.NewRat(amt)
}
// first add a validators[0] to delegate too
keeper.setValidator(ctx, validators[0])
// first add a candidates[0] to delegate too
keeper.setCandidate(ctx, candidates[0])
bond1to1 := Delegation{
bond1to1 := DelegatorBond{
DelegatorAddr: addrDels[0],
ValidatorAddr: addrVals[0],
CandidateAddr: addrVals[0],
Shares: sdk.NewRat(9),
}
// check the empty keeper first
_, found := keeper.GetDelegation(ctx, addrDels[0], addrVals[0])
_, found := keeper.GetDelegatorBond(ctx, addrDels[0], addrVals[0])
assert.False(t, found)
// set and retrieve a record
keeper.setDelegation(ctx, bond1to1)
resBond, found := keeper.GetDelegation(ctx, addrDels[0], addrVals[0])
keeper.setDelegatorBond(ctx, bond1to1)
resBond, found := keeper.GetDelegatorBond(ctx, addrDels[0], addrVals[0])
assert.True(t, found)
assert.True(t, bond1to1.equal(resBond))
// modify a records, save, and retrieve
bond1to1.Shares = sdk.NewRat(99)
keeper.setDelegation(ctx, bond1to1)
resBond, found = keeper.GetDelegation(ctx, addrDels[0], addrVals[0])
keeper.setDelegatorBond(ctx, bond1to1)
resBond, found = keeper.GetDelegatorBond(ctx, addrDels[0], addrVals[0])
assert.True(t, found)
assert.True(t, bond1to1.equal(resBond))
// add some more records
keeper.setValidator(ctx, validators[1])
keeper.setValidator(ctx, validators[2])
bond1to2 := Delegation{addrDels[0], addrVals[1], sdk.NewRat(9), 0}
bond1to3 := Delegation{addrDels[0], addrVals[2], sdk.NewRat(9), 1}
bond2to1 := Delegation{addrDels[1], addrVals[0], sdk.NewRat(9), 2}
bond2to2 := Delegation{addrDels[1], addrVals[1], sdk.NewRat(9), 3}
bond2to3 := Delegation{addrDels[1], addrVals[2], sdk.NewRat(9), 4}
keeper.setDelegation(ctx, bond1to2)
keeper.setDelegation(ctx, bond1to3)
keeper.setDelegation(ctx, bond2to1)
keeper.setDelegation(ctx, bond2to2)
keeper.setDelegation(ctx, bond2to3)
keeper.setCandidate(ctx, candidates[1])
keeper.setCandidate(ctx, candidates[2])
bond1to2 := DelegatorBond{addrDels[0], addrVals[1], sdk.NewRat(9), 0}
bond1to3 := DelegatorBond{addrDels[0], addrVals[2], sdk.NewRat(9), 1}
bond2to1 := DelegatorBond{addrDels[1], addrVals[0], sdk.NewRat(9), 2}
bond2to2 := DelegatorBond{addrDels[1], addrVals[1], sdk.NewRat(9), 3}
bond2to3 := DelegatorBond{addrDels[1], addrVals[2], sdk.NewRat(9), 4}
keeper.setDelegatorBond(ctx, bond1to2)
keeper.setDelegatorBond(ctx, bond1to3)
keeper.setDelegatorBond(ctx, bond2to1)
keeper.setDelegatorBond(ctx, bond2to2)
keeper.setDelegatorBond(ctx, bond2to3)
// test all bond retrieve capabilities
resBonds := keeper.GetDelegations(ctx, addrDels[0], 5)
resBonds := keeper.GetDelegatorBonds(ctx, addrDels[0], 5)
require.Equal(t, 3, len(resBonds))
assert.True(t, bond1to1.equal(resBonds[0]))
assert.True(t, bond1to2.equal(resBonds[1]))
assert.True(t, bond1to3.equal(resBonds[2]))
resBonds = keeper.GetDelegations(ctx, addrDels[0], 3)
resBonds = keeper.GetDelegatorBonds(ctx, addrDels[0], 3)
require.Equal(t, 3, len(resBonds))
resBonds = keeper.GetDelegations(ctx, addrDels[0], 2)
resBonds = keeper.GetDelegatorBonds(ctx, addrDels[0], 2)
require.Equal(t, 2, len(resBonds))
resBonds = keeper.GetDelegations(ctx, addrDels[1], 5)
resBonds = keeper.GetDelegatorBonds(ctx, addrDels[1], 5)
require.Equal(t, 3, len(resBonds))
assert.True(t, bond2to1.equal(resBonds[0]))
assert.True(t, bond2to2.equal(resBonds[1]))
@ -159,76 +159,76 @@ func TestBond(t *testing.T) {
assert.True(t, bond2to3.equal(allBonds[5]))
// delete a record
keeper.removeDelegation(ctx, bond2to3)
_, found = keeper.GetDelegation(ctx, addrDels[1], addrVals[2])
keeper.removeDelegatorBond(ctx, bond2to3)
_, found = keeper.GetDelegatorBond(ctx, addrDels[1], addrVals[2])
assert.False(t, found)
resBonds = keeper.GetDelegations(ctx, addrDels[1], 5)
resBonds = keeper.GetDelegatorBonds(ctx, addrDels[1], 5)
require.Equal(t, 2, len(resBonds))
assert.True(t, bond2to1.equal(resBonds[0]))
assert.True(t, bond2to2.equal(resBonds[1]))
// delete all the records from delegator 2
keeper.removeDelegation(ctx, bond2to1)
keeper.removeDelegation(ctx, bond2to2)
_, found = keeper.GetDelegation(ctx, addrDels[1], addrVals[0])
keeper.removeDelegatorBond(ctx, bond2to1)
keeper.removeDelegatorBond(ctx, bond2to2)
_, found = keeper.GetDelegatorBond(ctx, addrDels[1], addrVals[0])
assert.False(t, found)
_, found = keeper.GetDelegation(ctx, addrDels[1], addrVals[1])
_, found = keeper.GetDelegatorBond(ctx, addrDels[1], addrVals[1])
assert.False(t, found)
resBonds = keeper.GetDelegations(ctx, addrDels[1], 5)
resBonds = keeper.GetDelegatorBonds(ctx, addrDels[1], 5)
require.Equal(t, 0, len(resBonds))
}
// TODO seperate out into multiple tests
func TestGetValidatorsBonded(t *testing.T) {
func TestGetValidators(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
// initialize some validators into the state
// initialize some candidates into the state
amts := []int64{0, 100, 1, 400, 200}
n := len(amts)
var validators [5]Validator
var candidates [5]Candidate
for i, amt := range amts {
validators[i] = NewValidator(addrs[i], pks[i], Description{})
validators[i].BondedShares = sdk.NewRat(amt)
validators[i].DelegatorShares = sdk.NewRat(amt)
keeper.setValidator(ctx, validators[i])
candidates[i] = NewCandidate(addrs[i], pks[i], Description{})
candidates[i].BondedShares = sdk.NewRat(amt)
candidates[i].DelegatorShares = sdk.NewRat(amt)
keeper.setCandidate(ctx, candidates[i])
}
// first make sure everything made it in to the validator group
validators := keeper.GetValidatorsBondedByPower(ctx)
validators := keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n)
assert.Equal(t, sdk.NewRat(400), validators[0].Power, "%v", validators)
assert.Equal(t, sdk.NewRat(200), validators[1].Power, "%v", validators)
assert.Equal(t, sdk.NewRat(100), validators[2].Power, "%v", validators)
assert.Equal(t, sdk.NewRat(1), validators[3].Power, "%v", validators)
assert.Equal(t, sdk.NewRat(0), validators[4].Power, "%v", validators)
assert.Equal(t, validators[3].Address, validators[0].Address, "%v", validators)
assert.Equal(t, validators[4].Address, validators[1].Address, "%v", validators)
assert.Equal(t, validators[1].Address, validators[2].Address, "%v", validators)
assert.Equal(t, validators[2].Address, validators[3].Address, "%v", validators)
assert.Equal(t, validators[0].Address, validators[4].Address, "%v", validators)
assert.Equal(t, candidates[3].Address, validators[0].Address, "%v", validators)
assert.Equal(t, candidates[4].Address, validators[1].Address, "%v", validators)
assert.Equal(t, candidates[1].Address, validators[2].Address, "%v", validators)
assert.Equal(t, candidates[2].Address, validators[3].Address, "%v", validators)
assert.Equal(t, candidates[0].Address, validators[4].Address, "%v", validators)
// test a basic increase in voting power
validators[3].BondedShares = sdk.NewRat(500)
keeper.setValidator(ctx, validators[3])
validators = keeper.GetValidatorsBondedByPower(ctx)
candidates[3].BondedShares = sdk.NewRat(500)
keeper.setCandidate(ctx, candidates[3])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n)
assert.Equal(t, sdk.NewRat(500), validators[0].Power, "%v", validators)
assert.Equal(t, validators[3].Address, validators[0].Address, "%v", validators)
assert.Equal(t, candidates[3].Address, validators[0].Address, "%v", validators)
// test a decrease in voting power
validators[3].BondedShares = sdk.NewRat(300)
keeper.setValidator(ctx, validators[3])
validators = keeper.GetValidatorsBondedByPower(ctx)
candidates[3].BondedShares = sdk.NewRat(300)
keeper.setCandidate(ctx, candidates[3])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n)
assert.Equal(t, sdk.NewRat(300), validators[0].Power, "%v", validators)
assert.Equal(t, candidates[3].Address, validators[0].Address, "%v", validators)
assert.Equal(t, candidates[4].Address, validators[1].Address, "%v", validators)
// test equal voting power, different age
validators[3].BondedShares = sdk.NewRat(200)
candidates[3].BondedShares = sdk.NewRat(200)
ctx = ctx.WithBlockHeight(10)
keeper.setValidator(ctx, validators[3])
validators = keeper.GetValidatorsBondedByPower(ctx)
keeper.setCandidate(ctx, candidates[3])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n)
assert.Equal(t, sdk.NewRat(200), validators[0].Power, "%v", validators)
assert.Equal(t, sdk.NewRat(200), validators[1].Power, "%v", validators)
@ -239,8 +239,8 @@ func TestGetValidatorsBonded(t *testing.T) {
// no change in voting power - no change in sort
ctx = ctx.WithBlockHeight(20)
keeper.setValidator(ctx, validators[4])
validators = keeper.GetValidatorsBondedByPower(ctx)
keeper.setCandidate(ctx, candidates[4])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n)
assert.Equal(t, candidates[3].Address, validators[0].Address, "%v", validators)
assert.Equal(t, candidates[4].Address, validators[1].Address, "%v", validators)
@ -252,8 +252,8 @@ func TestGetValidatorsBonded(t *testing.T) {
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n)
ctx = ctx.WithBlockHeight(30)
keeper.setValidator(ctx, validators[4])
validators = keeper.GetValidatorsBondedByPower(ctx)
keeper.setCandidate(ctx, candidates[4])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n, "%v", validators)
assert.Equal(t, candidates[3].Address, validators[0].Address, "%v", validators)
assert.Equal(t, candidates[4].Address, validators[1].Address, "%v", validators)
@ -271,17 +271,17 @@ func TestGetValidatorsEdgeCases(t *testing.T) {
// initialize some candidates into the state
amts := []int64{0, 100, 400, 400, 200}
n := len(amts)
var validators [5]Validator
var candidates [5]Candidate
for i, amt := range amts {
validators[i] = NewValidator(addrs[i], pks[i], Description{})
validators[i].BondedShares = sdk.NewRat(amt)
validators[i].DelegatorShares = sdk.NewRat(amt)
keeper.setValidator(ctx, validators[i])
candidates[i] = NewCandidate(addrs[i], pks[i], Description{})
candidates[i].BondedShares = sdk.NewRat(amt)
candidates[i].DelegatorShares = sdk.NewRat(amt)
keeper.setCandidate(ctx, candidates[i])
}
validators[0].BondedShares = sdk.NewRat(500)
keeper.setValidator(ctx, validators[0])
validators := keeper.GetValidatorsBondedByPower(ctx)
candidates[0].BondedShares = sdk.NewRat(500)
keeper.setCandidate(ctx, candidates[0])
validators := keeper.getValidatorsOrdered(ctx)
require.Equal(t, uint16(len(validators)), params.MaxValidators)
require.Equal(t, candidates[0].Address, validators[0].Address, "%v", validators)
// candidate 3 was set before candidate 4
@ -314,7 +314,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) {
require.Equal(t, candidates[2].Address, validators[1].Address, "%v", validators)
candidate, exists := keeper.GetCandidate(ctx, candidates[3].Address)
require.Equal(t, exists, true)
require.Equal(t, validator.BondHeight, int64(40))
require.Equal(t, candidate.ValidatorBondHeight, int64(40))
// If two candidates both increase to the same voting power in the same block,
// the one with the first transaction should take precedence (become a validator).
@ -327,299 +327,339 @@ func TestGetValidatorsEdgeCases(t *testing.T) {
keeper.setCandidate(ctx, candidates[2])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, uint16(len(validators)), params.MaxValidators)
require.Equal(t, validators[0].Address, validators[0].Address, "%v", validators)
require.Equal(t, validators[1].Address, validators[1].Address, "%v", validators)
validators[1].BondedShares = sdk.NewRat(1100)
validators[2].BondedShares = sdk.NewRat(1100)
keeper.setValidator(ctx, validators[2])
keeper.setValidator(ctx, validators[1])
validators = keeper.GetValidatorsBondedByPower(ctx)
require.Equal(t, candidates[0].Address, validators[0].Address, "%v", validators)
require.Equal(t, candidates[1].Address, validators[1].Address, "%v", validators)
candidates[1].BondedShares = sdk.NewRat(1100)
candidates[2].BondedShares = sdk.NewRat(1100)
keeper.setCandidate(ctx, candidates[2])
keeper.setCandidate(ctx, candidates[1])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, uint16(len(validators)), params.MaxValidators)
require.Equal(t, validators[0].Address, validators[0].Address, "%v", validators)
require.Equal(t, validators[2].Address, validators[1].Address, "%v", validators)
require.Equal(t, candidates[0].Address, validators[0].Address, "%v", validators)
require.Equal(t, candidates[2].Address, validators[1].Address, "%v", validators)
// reset assets / heights
params.MaxValidators = 100
keeper.setParams(ctx, params)
validators[0].BondedShares = sdk.NewRat(0)
validators[1].BondedShares = sdk.NewRat(100)
validators[2].BondedShares = sdk.NewRat(1)
validators[3].BondedShares = sdk.NewRat(300)
validators[4].BondedShares = sdk.NewRat(200)
candidates[0].BondedShares = sdk.NewRat(0)
candidates[1].BondedShares = sdk.NewRat(100)
candidates[2].BondedShares = sdk.NewRat(1)
candidates[3].BondedShares = sdk.NewRat(300)
candidates[4].BondedShares = sdk.NewRat(200)
ctx = ctx.WithBlockHeight(0)
keeper.setValidator(ctx, validators[0])
keeper.setValidator(ctx, validators[1])
keeper.setValidator(ctx, validators[2])
keeper.setValidator(ctx, validators[3])
keeper.setValidator(ctx, validators[4])
keeper.setCandidate(ctx, candidates[0])
keeper.setCandidate(ctx, candidates[1])
keeper.setCandidate(ctx, candidates[2])
keeper.setCandidate(ctx, candidates[3])
keeper.setCandidate(ctx, candidates[4])
// test a swap in voting power
validators[0].BondedShares = sdk.NewRat(600)
keeper.setValidator(ctx, validators[0])
validators = keeper.GetValidatorsBondedByPower(ctx)
candidates[0].BondedShares = sdk.NewRat(600)
keeper.setCandidate(ctx, candidates[0])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n)
assert.Equal(t, sdk.NewRat(600), validators[0].Power, "%v", validators)
assert.Equal(t, validators[0].Address, validators[0].Address, "%v", validators)
assert.Equal(t, candidates[0].Address, validators[0].Address, "%v", validators)
assert.Equal(t, sdk.NewRat(300), validators[1].Power, "%v", validators)
assert.Equal(t, validators[3].Address, validators[1].Address, "%v", validators)
assert.Equal(t, candidates[3].Address, validators[1].Address, "%v", validators)
// test the max validators term
params = keeper.GetParams(ctx)
n = 2
params.MaxValidators = uint16(n)
keeper.setParams(ctx, params)
validators = keeper.GetValidatorsBondedByPower(ctx)
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, len(validators), n)
assert.Equal(t, sdk.NewRat(600), validators[0].Power, "%v", validators)
assert.Equal(t, validators[0].Address, validators[0].Address, "%v", validators)
assert.Equal(t, candidates[0].Address, validators[0].Address, "%v", validators)
assert.Equal(t, sdk.NewRat(300), validators[1].Power, "%v", validators)
assert.Equal(t, validators[3].Address, validators[1].Address, "%v", validators)
assert.Equal(t, candidates[3].Address, validators[1].Address, "%v", validators)
}
// clear the tracked changes to the validator set
func TestClearValidatorsTendermintUpdates(t *testing.T) {
func TestClearAccUpdateValidators(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
amts := []int64{100, 400, 200}
validators := make([]Validator, len(amts))
candidates := make([]Candidate, len(amts))
for i, amt := range amts {
validators[i] = NewValidator(addrs[i], pks[i], Description{})
validators[i].BondedShares = sdk.NewRat(amt)
validators[i].DelegatorShares = sdk.NewRat(amt)
keeper.setValidator(ctx, validators[i])
candidates[i] = NewCandidate(addrs[i], pks[i], Description{})
candidates[i].BondedShares = sdk.NewRat(amt)
candidates[i].DelegatorShares = sdk.NewRat(amt)
keeper.setCandidate(ctx, candidates[i])
}
acc := keeper.getValidatorsTendermintUpdates(ctx)
acc := keeper.getAccUpdateValidators(ctx)
assert.Equal(t, len(amts), len(acc))
keeper.clearValidatorsTendermintUpdates(ctx)
acc = keeper.getValidatorsTendermintUpdates(ctx)
keeper.clearAccUpdateValidators(ctx)
acc = keeper.getAccUpdateValidators(ctx)
assert.Equal(t, 0, len(acc))
}
// test the mechanism which keeps track of a validator set change
func TestGetValidatorsTendermintUpdates(t *testing.T) {
func TestGetAccUpdateValidators(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
params := defaultParams()
params.MaxValidators = 4
keeper.setParams(ctx, params)
// TODO eliminate use of validatorsIn here
// TODO eliminate use of candidatesIn here
// tests could be clearer if they just
// created the validator at time of use
// created the candidate at time of use
// and were labelled by power in the comments
// outlining in each test
amts := []int64{10, 11, 12, 13, 1}
var validatorsIn [5]Validator
var candidatesIn [5]Candidate
for i, amt := range amts {
validatorsIn[i] = NewValidator(addrs[i], pks[i], Description{})
validatorsIn[i].BondedShares = sdk.NewRat(amt)
validatorsIn[i].DelegatorShares = sdk.NewRat(amt)
candidatesIn[i] = NewCandidate(addrs[i], pks[i], Description{})
candidatesIn[i].BondedShares = sdk.NewRat(amt)
candidatesIn[i].DelegatorShares = sdk.NewRat(amt)
}
// test from nothing to something
// validator set: {} -> {c1, c3}
// candidate set: {} -> {c1, c3}
// validator set: {} -> {c1, c3}
// accUpdate set: {} -> {c1, c3}
assert.Equal(t, 0, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 0, len(keeper.GetValidatorsBonded(ctx)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
assert.Equal(t, 0, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 0, len(keeper.GetValidators(ctx)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
keeper.setValidator(ctx, validatorsIn[1])
keeper.setValidator(ctx, validatorsIn[3])
keeper.setCandidate(ctx, candidatesIn[1])
keeper.setCandidate(ctx, candidatesIn[3])
vals := keeper.GetValidatorsBondedByPower(ctx) // to init recent validator set
vals := keeper.getValidatorsOrdered(ctx) // to init recent validator set
require.Equal(t, 2, len(vals))
acc := keeper.getValidatorsTendermintUpdates(ctx)
acc := keeper.getAccUpdateValidators(ctx)
require.Equal(t, 2, len(acc))
validators := keeper.GetValidators(ctx, 5)
require.Equal(t, 2, len(validators))
assert.Equal(t, validators[0].validator().abciValidator(keeper.cdc), acc[0])
assert.Equal(t, validators[1].validator().abciValidator(keeper.cdc), acc[1])
assert.True(t, validators[0].validator().equal(vals[1]))
assert.True(t, validators[1].validator().equal(vals[0]))
candidates := keeper.GetCandidates(ctx, 5)
require.Equal(t, 2, len(candidates))
assert.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0])
assert.Equal(t, candidates[1].validator().abciValidator(keeper.cdc), acc[1])
assert.True(t, candidates[0].validator().equal(vals[1]))
assert.True(t, candidates[1].validator().equal(vals[0]))
// test identical,
// validator set: {c1, c3} -> {c1, c3}
// candidate set: {c1, c3} -> {c1, c3}
// accUpdate set: {} -> {}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 2, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 2, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
keeper.setValidator(ctx, validators[0])
keeper.setValidator(ctx, validators[1])
keeper.setCandidate(ctx, candidates[0])
keeper.setCandidate(ctx, candidates[1])
require.Equal(t, 2, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
require.Equal(t, 2, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
// test single value change
// validator set: {c1, c3} -> {c1', c3}
// candidate set: {c1, c3} -> {c1', c3}
// accUpdate set: {} -> {c1'}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 2, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 2, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
validators[0].BondedShares = sdk.NewRat(600)
keeper.setValidator(ctx, validators[0])
candidates[0].BondedShares = sdk.NewRat(600)
keeper.setCandidate(ctx, candidates[0])
validators = keeper.GetValidators(ctx, 5)
require.Equal(t, 2, len(validators))
assert.True(t, validators[0].BondedShares.Equal(sdk.NewRat(600)))
acc = keeper.getValidatorsTendermintUpdates(ctx)
candidates = keeper.GetCandidates(ctx, 5)
require.Equal(t, 2, len(candidates))
assert.True(t, candidates[0].BondedShares.Equal(sdk.NewRat(600)))
acc = keeper.getAccUpdateValidators(ctx)
require.Equal(t, 1, len(acc))
assert.Equal(t, validators[0].validator().abciValidator(keeper.cdc), acc[0])
assert.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0])
// test multiple value change
// validator set: {c1, c3} -> {c1', c3'}
// candidate set: {c1, c3} -> {c1', c3'}
// accUpdate set: {c1, c3} -> {c1', c3'}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 2, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 2, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
validators[0].BondedShares = sdk.NewRat(200)
validators[1].BondedShares = sdk.NewRat(100)
keeper.setValidator(ctx, validators[0])
keeper.setValidator(ctx, validators[1])
candidates[0].BondedShares = sdk.NewRat(200)
candidates[1].BondedShares = sdk.NewRat(100)
keeper.setCandidate(ctx, candidates[0])
keeper.setCandidate(ctx, candidates[1])
acc = keeper.getValidatorsTendermintUpdates(ctx)
acc = keeper.getAccUpdateValidators(ctx)
require.Equal(t, 2, len(acc))
validators = keeper.GetValidators(ctx, 5)
require.Equal(t, 2, len(validators))
require.Equal(t, validators[0].validator().abciValidator(keeper.cdc), acc[0])
require.Equal(t, validators[1].validator().abciValidator(keeper.cdc), acc[1])
candidates = keeper.GetCandidates(ctx, 5)
require.Equal(t, 2, len(candidates))
require.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0])
require.Equal(t, candidates[1].validator().abciValidator(keeper.cdc), acc[1])
// test validtor added at the beginning
// validator set: {c1, c3} -> {c0, c1, c3}
// candidate set: {c1, c3} -> {c0, c1, c3}
// accUpdate set: {} -> {c0}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 2, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 2, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
keeper.setValidator(ctx, validatorsIn[0])
acc = keeper.getValidatorsTendermintUpdates(ctx)
keeper.setCandidate(ctx, candidatesIn[0])
acc = keeper.getAccUpdateValidators(ctx)
require.Equal(t, 1, len(acc))
validators = keeper.GetValidators(ctx, 5)
require.Equal(t, 3, len(validators))
assert.Equal(t, validators[0].validator().abciValidator(keeper.cdc), acc[0])
candidates = keeper.GetCandidates(ctx, 5)
require.Equal(t, 3, len(candidates))
assert.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0])
// test validator added at the middle
// validator set: {c0, c1, c3} -> {c0, c1, c2, c3}
// candidate set: {c0, c1, c3} -> {c0, c1, c2, c3]
// accUpdate set: {} -> {c2}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 3, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 3, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
keeper.setValidator(ctx, validatorsIn[2])
acc = keeper.getValidatorsTendermintUpdates(ctx)
keeper.setCandidate(ctx, candidatesIn[2])
acc = keeper.getAccUpdateValidators(ctx)
require.Equal(t, 1, len(acc))
validators = keeper.GetValidators(ctx, 5)
require.Equal(t, 4, len(validators))
assert.Equal(t, validators[2].validator().abciValidator(keeper.cdc), acc[0])
candidates = keeper.GetCandidates(ctx, 5)
require.Equal(t, 4, len(candidates))
assert.Equal(t, candidates[2].validator().abciValidator(keeper.cdc), acc[0])
// test validator added at the end but not inserted in the valset
// validator set: {c0, c1, c2, c3} -> {c0, c1, c2, c3, c4}
// test candidate added at the end but not inserted in the valset
// candidate set: {c0, c1, c2, c3} -> {c0, c1, c2, c3, c4}
// validator set: {c0, c1, c2, c3} -> {c0, c1, c2, c3}
// accUpdate set: {} -> {}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 4, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidatorsBonded(ctx)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 4, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidators(ctx)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
keeper.setValidator(ctx, validatorsIn[4])
keeper.setCandidate(ctx, candidatesIn[4])
assert.Equal(t, 5, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidatorsBonded(ctx)))
require.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx))) // max validator number is 4
assert.Equal(t, 5, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidators(ctx)))
require.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx))) // max validator number is 4
// test validator change its power but still not in the valset
// validator set: {c0, c1, c2, c3, c4} -> {c0, c1, c2, c3, c4}
// test candidate change its power but still not in the valset
// candidate set: {c0, c1, c2, c3, c4} -> {c0, c1, c2, c3, c4}
// validator set: {c0, c1, c2, c3} -> {c0, c1, c2, c3}
// accUpdate set: {} -> {}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 5, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidatorsBonded(ctx)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 5, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidators(ctx)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
validatorsIn[4].BondedShares = sdk.NewRat(1)
keeper.setValidator(ctx, validatorsIn[4])
candidatesIn[4].BondedShares = sdk.NewRat(1)
keeper.setCandidate(ctx, candidatesIn[4])
assert.Equal(t, 5, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidatorsBonded(ctx)))
require.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx))) // max validator number is 4
assert.Equal(t, 5, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidators(ctx)))
require.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx))) // max validator number is 4
// test validator change its power and become a validator (pushing out an existing)
// validator set: {c0, c1, c2, c3, c4} -> {c0, c1, c2, c3, c4}
// test candidate change its power and become a validator (pushing out an existing)
// candidate set: {c0, c1, c2, c3, c4} -> {c0, c1, c2, c3, c4}
// validator set: {c0, c1, c2, c3} -> {c1, c2, c3, c4}
// accUpdate set: {} -> {c0, c4}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 5, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidatorsBonded(ctx)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 5, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidators(ctx)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
validatorsIn[4].BondedShares = sdk.NewRat(1000)
keeper.setValidator(ctx, validatorsIn[4])
candidatesIn[4].BondedShares = sdk.NewRat(1000)
keeper.setCandidate(ctx, candidatesIn[4])
validators = keeper.GetValidators(ctx, 5)
require.Equal(t, 5, len(validators))
vals = keeper.GetValidatorsBondedByPower(ctx)
candidates = keeper.GetCandidates(ctx, 5)
require.Equal(t, 5, len(candidates))
vals = keeper.getValidatorsOrdered(ctx)
require.Equal(t, 4, len(vals))
assert.Equal(t, validatorsIn[1].Address, vals[1].Address)
assert.Equal(t, validatorsIn[2].Address, vals[3].Address)
assert.Equal(t, validatorsIn[3].Address, vals[2].Address)
assert.Equal(t, validatorsIn[4].Address, vals[0].Address)
assert.Equal(t, candidatesIn[1].Address, vals[1].Address)
assert.Equal(t, candidatesIn[2].Address, vals[3].Address)
assert.Equal(t, candidatesIn[3].Address, vals[2].Address)
assert.Equal(t, candidatesIn[4].Address, vals[0].Address)
acc = keeper.getValidatorsTendermintUpdates(ctx)
acc = keeper.getAccUpdateValidators(ctx)
require.Equal(t, 2, len(acc), "%v", acc)
assert.Equal(t, validatorsIn[0].PubKey.Bytes(), acc[0].PubKey)
assert.Equal(t, candidatesIn[0].PubKey.Bytes(), acc[0].PubKey)
assert.Equal(t, int64(0), acc[0].Power)
assert.Equal(t, vals[0].abciValidator(keeper.cdc), acc[1])
// test from something to nothing
// validator set: {c0, c1, c2, c3, c4} -> {}
// candidate set: {c0, c1, c2, c3, c4} -> {}
// validator set: {c1, c2, c3, c4} -> {}
// accUpdate set: {} -> {c1, c2, c3, c4}
keeper.clearValidatorsTendermintUpdates(ctx)
assert.Equal(t, 5, len(keeper.GetValidators(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidatorsBonded(ctx)))
assert.Equal(t, 0, len(keeper.getValidatorsTendermintUpdates(ctx)))
keeper.clearAccUpdateValidators(ctx)
assert.Equal(t, 5, len(keeper.GetCandidates(ctx, 5)))
assert.Equal(t, 4, len(keeper.GetValidators(ctx)))
assert.Equal(t, 0, len(keeper.getAccUpdateValidators(ctx)))
keeper.removeValidator(ctx, validatorsIn[0].Address)
keeper.removeValidator(ctx, validatorsIn[1].Address)
keeper.removeValidator(ctx, validatorsIn[2].Address)
keeper.removeValidator(ctx, validatorsIn[3].Address)
keeper.removeValidator(ctx, validatorsIn[4].Address)
keeper.removeCandidate(ctx, candidatesIn[0].Address)
keeper.removeCandidate(ctx, candidatesIn[1].Address)
keeper.removeCandidate(ctx, candidatesIn[2].Address)
keeper.removeCandidate(ctx, candidatesIn[3].Address)
keeper.removeCandidate(ctx, candidatesIn[4].Address)
vals = keeper.GetValidatorsBondedByPower(ctx)
vals = keeper.getValidatorsOrdered(ctx)
assert.Equal(t, 0, len(vals), "%v", vals)
validators = keeper.GetValidators(ctx, 5)
require.Equal(t, 0, len(validators))
acc = keeper.getValidatorsTendermintUpdates(ctx)
candidates = keeper.GetCandidates(ctx, 5)
require.Equal(t, 0, len(candidates))
acc = keeper.getAccUpdateValidators(ctx)
require.Equal(t, 4, len(acc))
assert.Equal(t, validatorsIn[1].PubKey.Bytes(), acc[0].PubKey)
assert.Equal(t, validatorsIn[2].PubKey.Bytes(), acc[1].PubKey)
assert.Equal(t, validatorsIn[3].PubKey.Bytes(), acc[2].PubKey)
assert.Equal(t, validatorsIn[4].PubKey.Bytes(), acc[3].PubKey)
assert.Equal(t, candidatesIn[1].PubKey.Bytes(), acc[0].PubKey)
assert.Equal(t, candidatesIn[2].PubKey.Bytes(), acc[1].PubKey)
assert.Equal(t, candidatesIn[3].PubKey.Bytes(), acc[2].PubKey)
assert.Equal(t, candidatesIn[4].PubKey.Bytes(), acc[3].PubKey)
assert.Equal(t, int64(0), acc[0].Power)
assert.Equal(t, int64(0), acc[1].Power)
assert.Equal(t, int64(0), acc[2].Power)
assert.Equal(t, int64(0), acc[3].Power)
}
// test if is a validator from the last update
func TestIsValidator(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
amts := []int64{9, 8, 7, 10, 6}
var candidatesIn [5]Candidate
for i, amt := range amts {
candidatesIn[i] = NewCandidate(addrVals[i], pks[i], Description{})
candidatesIn[i].BondedShares = sdk.NewRat(amt)
candidatesIn[i].DelegatorShares = sdk.NewRat(amt)
}
// test that an empty validator set doesn't have any validators
validators := keeper.getValidatorsOrdered(ctx)
assert.Equal(t, 0, len(validators))
// get the validators for the first time
keeper.setCandidate(ctx, candidatesIn[0])
keeper.setCandidate(ctx, candidatesIn[1])
validators = keeper.getValidatorsOrdered(ctx)
require.Equal(t, 2, len(validators))
assert.True(t, candidatesIn[0].validator().equal(validators[0]))
c1ValWithCounter := candidatesIn[1].validator()
c1ValWithCounter.Counter = int16(1)
assert.True(t, c1ValWithCounter.equal(validators[1]))
// test a basic retrieve of something that should be a recent validator
assert.True(t, keeper.IsValidator(ctx, candidatesIn[0].PubKey))
assert.True(t, keeper.IsValidator(ctx, candidatesIn[1].PubKey))
// test a basic retrieve of something that should not be a recent validator
assert.False(t, keeper.IsValidator(ctx, candidatesIn[2].PubKey))
// remove that validator, but don't retrieve the recent validator group
keeper.removeCandidate(ctx, candidatesIn[0].Address)
// test that removed validator is not considered a recent validator
assert.False(t, keeper.IsValidator(ctx, candidatesIn[0].PubKey))
}
// test if is a validator from the last update
func TestGetTotalPrecommitVotingPower(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
amts := []int64{10000, 1000, 100, 10, 1}
var validatorsIn [5]Validator
var candidatesIn [5]Candidate
for i, amt := range amts {
validatorsIn[i] = NewValidator(addrVals[i], pks[i], Description{})
validatorsIn[i].BondedShares = sdk.NewRat(amt)
validatorsIn[i].DelegatorShares = sdk.NewRat(amt)
keeper.setValidator(ctx, validatorsIn[i])
candidatesIn[i] = NewCandidate(addrVals[i], pks[i], Description{})
candidatesIn[i].BondedShares = sdk.NewRat(amt)
candidatesIn[i].DelegatorShares = sdk.NewRat(amt)
keeper.setCandidate(ctx, candidatesIn[i])
}
// test that an empty validator set doesn't have any validators
validators := keeper.GetValidatorsBonded(ctx)
validators := keeper.GetValidators(ctx)
assert.Equal(t, 5, len(validators))
totPow := keeper.GetTotalPrecommitVotingPower(ctx)
@ -664,6 +704,7 @@ func TestPool(t *testing.T) {
resPool = keeper.GetPool(ctx)
assert.True(t, expPool.equal(resPool))
}
<<<<<<< HEAD
func TestValidatorsetKeeper(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)