github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/state/validators_test.go (about) 1 package state 2 3 import ( 4 "fmt" 5 "math/big" 6 "testing" 7 8 "github.com/hyperledger/burrow/acm" 9 "github.com/hyperledger/burrow/acm/validator" 10 "github.com/hyperledger/burrow/crypto" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 dbm "github.com/tendermint/tm-db" 14 ) 15 16 func TestValidatorsReadWrite(t *testing.T) { 17 s := NewState(dbm.NewMemDB()) 18 19 power := uint64(32432) 20 v := validator.FromAccount(acm.NewAccountFromSecret("foobar"), power) 21 22 _, _, err := s.Update(func(up Updatable) error { 23 _, err := up.SetPower(v.GetPublicKey(), v.BigPower()) 24 return err 25 }) 26 27 require.NoError(t, err) 28 bigPower, err := s.Power(v.GetAddress()) 29 require.NoError(t, err) 30 assert.Equal(t, power, bigPower.Uint64()) 31 32 fail := true 33 err = s.IterateValidators(func(id crypto.Addressable, power *big.Int) error { 34 fail = false 35 assert.Equal(t, v.GetPublicKey(), id.GetPublicKey()) 36 assert.Equal(t, v.GetAddress(), id.GetAddress()) 37 assert.Equal(t, v.Power, power.Uint64()) 38 return nil 39 }) 40 require.NoError(t, err) 41 require.False(t, fail, "no validators in iteration") 42 } 43 44 func TestLoadValidatorRing(t *testing.T) { 45 for commits := 1; commits < DefaultValidatorsWindowSize*7/2; commits++ { 46 t.Run(fmt.Sprintf("TestLoadValidatorRing with %d commits", commits), func(t *testing.T) { 47 testLoadValidatorRing(t, commits) 48 }) 49 } 50 } 51 52 func testLoadValidatorRing(t *testing.T, commits int) { 53 db := dbm.NewMemDB() 54 s := NewState(db) 55 56 var version int64 57 var err error 58 59 // we need to add a larger staked entity first 60 // to prevent unbalancing the validator set 61 _, err = s.writeState.SetPower(pub(0), pow(1000)) 62 require.NoError(t, err) 63 _, version, err = s.commit() 64 require.NoError(t, err) 65 66 for i := 1; i <= commits; i++ { 67 _, err = s.writeState.SetPower(pub(i), pow(i)) 68 require.NoError(t, err) 69 _, version, err = s.commit() 70 require.NoError(t, err) 71 } 72 73 ring := s.writeState.ring 74 75 s = NewState(db) 76 err = s.writeState.forest.Load(version) 77 require.NoError(t, err) 78 79 ringOut, err := LoadValidatorRing(version, DefaultValidatorsWindowSize, s.writeState.forest.GetImmutable) 80 require.NoError(t, err) 81 require.NoError(t, ring.Equal(ringOut)) 82 } 83 84 func pow(p int) *big.Int { 85 return big.NewInt(int64(p)) 86 } 87 88 func pub(secret interface{}) *crypto.PublicKey { 89 return acm.NewAccountFromSecret(fmt.Sprintf("%v", secret)).PublicKey 90 }