github.com/Finschia/ostracon@v1.1.5/rpc/core/consensus_test.go (about) 1 package core 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 8 cfg "github.com/Finschia/ostracon/config" 9 "github.com/Finschia/ostracon/consensus" 10 ctypes "github.com/Finschia/ostracon/rpc/core/types" 11 rpctypes "github.com/Finschia/ostracon/rpc/jsonrpc/types" 12 sm "github.com/Finschia/ostracon/state" 13 "github.com/Finschia/ostracon/state/mocks" 14 "github.com/Finschia/ostracon/types" 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 dbm "github.com/tendermint/tm-db" 18 ) 19 20 type args struct { 21 ctx *rpctypes.Context 22 heightPtr *int64 23 pagePtr *int 24 perPagePtr *int 25 } 26 27 var ( 28 height = int64(1) 29 page = 1 30 perPage = 10 31 normalArgs = args{&rpctypes.Context{}, &height, &page, &perPage} 32 invalidHeight = height + 10000 33 invalidPage = page + 10 34 invalidHeightArgs = args{&rpctypes.Context{}, &invalidHeight, &page, &perPage} 35 invalidPageArgs = args{&rpctypes.Context{}, &height, &invalidPage, &perPage} 36 noErrorFunc = func(t assert.TestingT, err error, i ...interface{}) bool { 37 return err == nil 38 } 39 errorFunc = func(t assert.TestingT, err error, i ...interface{}) bool { 40 return err != nil 41 } 42 ) 43 44 func makeTestStateStore(t *testing.T) (sm.State, func()) { 45 stateStore := sm.NewStore(dbm.NewMemDB(), sm.StoreOptions{ 46 DiscardABCIResponses: false, 47 }) 48 blockStore := &mocks.BlockStore{} 49 50 config := cfg.ResetTestRoot("rpc_core_test") 51 state, err := stateStore.LoadFromDBOrGenesisFile(config.GenesisFile()) 52 require.NoError(t, err) 53 consensusState := consensus.NewState( 54 config.Consensus, state, nil, blockStore, nil, nil) 55 consensusReactor := consensus.NewReactor(consensusState, false, false, 0) 56 57 val, _ := types.RandValidator(true, 10) 58 vals := types.NewValidatorSet([]*types.Validator{val}) 59 60 state.Validators = vals 61 err = stateStore.Save(state) 62 require.NoError(t, err) 63 64 blockStore.On("Base").Return(state.LastBlockHeight) 65 state.LastBlockHeight = state.LastBlockHeight + 1 66 blockStore.On("Height").Return(state.LastBlockHeight) 67 68 env = &Environment{} 69 env.StateStore = stateStore 70 env.BlockStore = blockStore 71 env.ConsensusReactor = consensusReactor 72 73 return state, func() { os.RemoveAll(config.RootDir) } 74 } 75 76 func TestValidators(t *testing.T) { 77 state, cleanup := makeTestStateStore(t) 78 defer cleanup() 79 80 normalResult := &ctypes.ResultValidators{ 81 Validators: state.Validators.Validators, 82 BlockHeight: height, 83 Total: len(state.Validators.Validators), 84 Count: len(state.Validators.Validators), 85 } 86 87 tests := []struct { 88 name string 89 args args 90 wantErr assert.ErrorAssertionFunc 91 want *ctypes.ResultValidators 92 }{ 93 {"success", normalArgs, noErrorFunc, normalResult}, 94 {"invalid page", invalidPageArgs, errorFunc, nil}, 95 {"invalid height", invalidHeightArgs, errorFunc, nil}, 96 } 97 for _, tt := range tests { 98 t.Run(tt.name, func(t *testing.T) { 99 got, err := Validators(tt.args.ctx, tt.args.heightPtr, tt.args.pagePtr, tt.args.perPagePtr) 100 if !tt.wantErr(t, err, fmt.Sprintf("Validators(%v, %v, %v, %v)", 101 tt.args.ctx, tt.args.heightPtr, tt.args.pagePtr, tt.args.perPagePtr)) { 102 return 103 } 104 assert.Equalf(t, tt.want, got, "Validators(%v, %v, %v, %v)", 105 tt.args.ctx, tt.args.heightPtr, tt.args.pagePtr, tt.args.perPagePtr) 106 }) 107 } 108 }