github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/bft/state/store_test.go (about)

     1  package state_test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	cfg "github.com/gnolang/gno/tm2/pkg/bft/config"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  
    12  	sm "github.com/gnolang/gno/tm2/pkg/bft/state"
    13  	"github.com/gnolang/gno/tm2/pkg/bft/types"
    14  	dbm "github.com/gnolang/gno/tm2/pkg/db"
    15  	"github.com/gnolang/gno/tm2/pkg/db/memdb"
    16  )
    17  
    18  func TestStoreLoadValidators(t *testing.T) {
    19  	t.Parallel()
    20  
    21  	stateDB := memdb.NewMemDB()
    22  	val, _ := types.RandValidator(true, 10)
    23  	vals := types.NewValidatorSet([]*types.Validator{val})
    24  
    25  	// 1) LoadValidators loads validators using a height where they were last changed
    26  	sm.SaveValidatorsInfo(stateDB, 1, 1, vals)
    27  	sm.SaveValidatorsInfo(stateDB, 2, 1, vals)
    28  	loadedVals, err := sm.LoadValidators(stateDB, 2)
    29  	require.NoError(t, err)
    30  	assert.NotZero(t, loadedVals.Size())
    31  
    32  	// 2) LoadValidators loads validators using a checkpoint height
    33  
    34  	// TODO(melekes): REMOVE in 0.33 release
    35  	// https://github.com/tendermint/classic/issues/3543
    36  	// for releases prior to v0.31.4, it uses last height changed
    37  	valInfo := &sm.ValidatorsInfo{
    38  		LastHeightChanged: sm.ValSetCheckpointInterval,
    39  	}
    40  	stateDB.Set(sm.CalcValidatorsKey(sm.ValSetCheckpointInterval), valInfo.Bytes())
    41  	assert.NotPanics(t, func() {
    42  		sm.SaveValidatorsInfo(stateDB, sm.ValSetCheckpointInterval+1, 1, vals)
    43  		loadedVals, err := sm.LoadValidators(stateDB, sm.ValSetCheckpointInterval+1)
    44  		if err != nil {
    45  			t.Fatal(err)
    46  		}
    47  		if loadedVals.Size() == 0 {
    48  			t.Fatal("Expected validators to be non-empty")
    49  		}
    50  	})
    51  	// ENDREMOVE
    52  
    53  	sm.SaveValidatorsInfo(stateDB, sm.ValSetCheckpointInterval, 1, vals)
    54  
    55  	loadedVals, err = sm.LoadValidators(stateDB, sm.ValSetCheckpointInterval)
    56  	require.NoError(t, err)
    57  	assert.NotZero(t, loadedVals.Size())
    58  }
    59  
    60  func BenchmarkLoadValidators(b *testing.B) {
    61  	const valSetSize = 100
    62  
    63  	config, genesisFile := cfg.ResetTestRoot("state_")
    64  	defer os.RemoveAll(config.RootDir)
    65  	dbType := dbm.BackendType(config.DBBackend)
    66  	stateDB, err := dbm.NewDB("state", dbType, config.DBDir())
    67  	require.NoError(b, err)
    68  
    69  	state, err := sm.LoadStateFromDBOrGenesisFile(stateDB, genesisFile)
    70  	require.NoError(b, err)
    71  	state.Validators = genValSet(valSetSize)
    72  	state.NextValidators = state.Validators.CopyIncrementProposerPriority(1)
    73  	sm.SaveState(stateDB, state)
    74  
    75  	for i := 10; i < 10000000000; i *= 10 { // 10, 100, 1000, ...
    76  		i := i
    77  		sm.SaveValidatorsInfo(stateDB, int64(i), state.LastHeightValidatorsChanged, state.NextValidators)
    78  
    79  		b.Run(fmt.Sprintf("height=%d", i), func(b *testing.B) {
    80  			for n := 0; n < b.N; n++ {
    81  				_, err := sm.LoadValidators(stateDB, int64(i))
    82  				if err != nil {
    83  					b.Fatal(err)
    84  				}
    85  			}
    86  		})
    87  	}
    88  }