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 }