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  }