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