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  }