package core import ( "fmt" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" dbm "github.com/tendermint/tm-db" abci "github.com/tendermint/tendermint/abci/types" sm "github.com/tendermint/tendermint/internal/state" tmstate "github.com/tendermint/tendermint/proto/tendermint/state" "github.com/tendermint/tendermint/rpc/coretypes" rpctypes "github.com/tendermint/tendermint/rpc/jsonrpc/types" "github.com/tendermint/tendermint/types" ) func TestBlockchainInfo(t *testing.T) { cases := []struct { min, max int64 base, height int64 limit int64 resultLength int64 wantErr bool }{ // min > max {0, 0, 0, 0, 10, 0, true}, // min set to 1 {0, 1, 0, 0, 10, 0, true}, // max set to height (0) {0, 0, 0, 1, 10, 1, false}, // max set to height (1) {2, 0, 0, 1, 10, 0, true}, // max set to height (1) {2, 1, 0, 5, 10, 0, true}, // negative {1, 10, 0, 14, 10, 10, false}, // control {-1, 10, 0, 14, 10, 0, true}, {1, -10, 0, 14, 10, 0, true}, {-9223372036854775808, -9223372036854775788, 0, 100, 20, 0, true}, // check base {1, 1, 1, 1, 1, 1, false}, {2, 5, 3, 5, 5, 3, false}, // check limit and height {1, 1, 0, 1, 10, 1, false}, {1, 1, 0, 5, 10, 1, false}, {2, 2, 0, 5, 10, 1, false}, {1, 2, 0, 5, 10, 2, false}, {1, 5, 0, 1, 10, 1, false}, {1, 5, 0, 10, 10, 5, false}, {1, 15, 0, 10, 10, 10, false}, {1, 15, 0, 15, 10, 10, false}, {1, 15, 0, 15, 20, 15, false}, {1, 20, 0, 15, 20, 15, false}, {1, 20, 0, 20, 20, 20, false}, } for i, c := range cases { caseString := fmt.Sprintf("test %d failed", i) min, max, err := filterMinMax(c.base, c.height, c.min, c.max, c.limit) if c.wantErr { require.Error(t, err, caseString) } else { require.NoError(t, err, caseString) require.Equal(t, 1+max-min, c.resultLength, caseString) } } } func TestBlockResults(t *testing.T) { results := &tmstate.ABCIResponses{ DeliverTxs: []*abci.ResponseDeliverTx{ {Code: 0, Data: []byte{0x01}, Log: "ok", GasUsed: 10}, {Code: 0, Data: []byte{0x02}, Log: "ok", GasUsed: 5}, {Code: 1, Log: "not ok", GasUsed: 0}, }, EndBlock: &abci.ResponseEndBlock{}, BeginBlock: &abci.ResponseBeginBlock{}, } env := &Environment{} env.StateStore = sm.NewStore(dbm.NewMemDB()) err := env.StateStore.SaveABCIResponses(100, results) require.NoError(t, err) env.BlockStore = mockBlockStore{height: 100} testCases := []struct { height int64 wantErr bool wantRes *coretypes.ResultBlockResults }{ {-1, true, nil}, {0, true, nil}, {101, true, nil}, {100, false, &coretypes.ResultBlockResults{ Height: 100, TxsResults: results.DeliverTxs, TotalGasUsed: 15, BeginBlockEvents: results.BeginBlock.Events, EndBlockEvents: results.EndBlock.Events, ValidatorUpdates: results.EndBlock.ValidatorUpdates, ConsensusParamUpdates: results.EndBlock.ConsensusParamUpdates, }}, } for _, tc := range testCases { res, err := env.BlockResults(&rpctypes.Context{}, &tc.height) if tc.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, tc.wantRes, res) } } } type mockBlockStore struct { height int64 } func (mockBlockStore) Base() int64 { return 1 } func (store mockBlockStore) Height() int64 { return store.height } func (store mockBlockStore) Size() int64 { return store.height } func (mockBlockStore) LoadBaseMeta() *types.BlockMeta { return nil } func (mockBlockStore) LoadBlockMeta(height int64) *types.BlockMeta { return nil } func (mockBlockStore) LoadBlock(height int64) *types.Block { return nil } func (mockBlockStore) LoadBlockByHash(hash []byte) *types.Block { return nil } func (mockBlockStore) LoadBlockPart(height int64, index int) *types.Part { return nil } func (mockBlockStore) LoadBlockCommit(height int64) *types.Commit { return nil } func (mockBlockStore) LoadSeenCommit() *types.Commit { return nil } func (mockBlockStore) PruneBlocks(height int64) (uint64, error) { return 0, nil } func (mockBlockStore) SaveBlock(block *types.Block, blockParts *types.PartSet, seenCommit *types.Commit) { }