github.com/datachainlab/burrow@v0.25.0/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/tendermint/libs/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 return up.SetPower(v.GetPublicKey(), v.BigPower()) 24 }) 25 26 require.NoError(t, err) 27 bigPower, err := s.Power(v.GetAddress()) 28 require.NoError(t, err) 29 assert.Equal(t, power, bigPower.Uint64()) 30 31 fail := true 32 err = s.IterateValidators(func(id crypto.Addressable, power *big.Int) error { 33 fail = false 34 assert.Equal(t, v.GetPublicKey(), id.GetPublicKey()) 35 assert.Equal(t, v.GetAddress(), id.GetAddress()) 36 assert.Equal(t, v.Power, power.Uint64()) 37 return nil 38 }) 39 require.NoError(t, err) 40 require.False(t, fail, "no validators in iteration") 41 } 42 43 func TestLoadValidatorRing(t *testing.T) { 44 for commits := 1; commits < DefaultValidatorsWindowSize*7/2; commits++ { 45 t.Run(fmt.Sprintf("TestLoadValidatorRing with %d commits", commits), func(t *testing.T) { 46 testLoadValidatorRing(t, commits) 47 }) 48 } 49 } 50 51 func testLoadValidatorRing(t *testing.T, commits int) { 52 db := dbm.NewMemDB() 53 s := NewState(db) 54 55 var version int64 56 var err error 57 58 for i := 1; i <= commits; i++ { 59 err = s.writeState.SetPower(pub(i), pow(i)) 60 require.NoError(t, err) 61 _, version, err = s.commit() 62 require.NoError(t, err) 63 } 64 65 ring := s.writeState.ring 66 67 s = NewState(db) 68 err = s.writeState.forest.Load(version) 69 require.NoError(t, err) 70 71 ringOut, err := LoadValidatorRing(version, DefaultValidatorsWindowSize, s.writeState.forest.GetImmutable) 72 require.NoError(t, err) 73 require.NoError(t, ring.Equal(ringOut)) 74 } 75 76 func pow(p int) *big.Int { 77 return big.NewInt(int64(p)) 78 } 79 80 func pub(secret interface{}) crypto.PublicKey { 81 return acm.NewAccountFromSecret(fmt.Sprintf("%v", secret)).PublicKey 82 }