diff --git a/state/execution_test.go b/state/execution_test.go new file mode 100644 index 000000000..7e0b7332b --- /dev/null +++ b/state/execution_test.go @@ -0,0 +1,90 @@ +package state + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/tendermint/abci/example/dummy" + crypto "github.com/tendermint/go-crypto" + dbm "github.com/tendermint/go-db" + cfg "github.com/tendermint/tendermint/config/tendermint_test" + "github.com/tendermint/tendermint/mempool" + "github.com/tendermint/tendermint/proxy" + txindexer "github.com/tendermint/tendermint/state/tx/indexer" + "github.com/tendermint/tendermint/types" +) + +var ( + privKey = crypto.GenPrivKeyEd25519FromSecret([]byte("execution_test")) + chainID = "execution_chain" + testPartSize = 65536 + nTxsPerBlock = 10 +) + +func TestApplyBlock(t *testing.T) { + cc := proxy.NewLocalClientCreator(dummy.NewDummyApplication()) + config := cfg.ResetConfig("execution_test_") + proxyApp := proxy.NewAppConns(config, cc, nil) + _, err := proxyApp.Start() + require.Nil(t, err) + defer proxyApp.Stop() + mempool := mempool.NewMempool(config, proxyApp.Mempool()) + + state := state() + indexer := &dummyIndexer{0} + state.TxIndexer = indexer + + // make block + block := makeBlock(1, state) + + err = state.ApplyBlock(nil, proxyApp.Consensus(), block, block.MakePartSet(testPartSize).Header(), mempool) + + require.Nil(t, err) + assert.Equal(t, nTxsPerBlock, indexer.Indexed) // test indexing works + + // TODO check state and mempool +} + +//---------------------------------------------------------------------------- + +// make some bogus txs +func txsFunc(blockNum int) (txs []types.Tx) { + for i := 0; i < nTxsPerBlock; i++ { + txs = append(txs, types.Tx([]byte{byte(blockNum), byte(i)})) + } + return txs +} + +func state() *State { + return MakeGenesisState(dbm.NewMemDB(), &types.GenesisDoc{ + ChainID: chainID, + Validators: []types.GenesisValidator{ + types.GenesisValidator{privKey.PubKey(), 10000, "test"}, + }, + AppHash: nil, + }) +} + +func makeBlock(num int, state *State) *types.Block { + prevHash := state.LastBlockID.Hash + prevParts := types.PartSetHeader{} + valHash := state.Validators.Hash() + prevBlockID := types.BlockID{prevHash, prevParts} + block, _ := types.MakeBlock(num, chainID, txsFunc(num), new(types.Commit), + prevBlockID, valHash, state.AppHash, testPartSize) + return block +} + +// dummyIndexer increments counter every time we index transaction. +type dummyIndexer struct { + Indexed int +} + +func (indexer *dummyIndexer) Tx(hash string) (*types.TxResult, error) { + return nil, nil +} +func (indexer *dummyIndexer) Batch(batch *txindexer.Batch) error { + indexer.Indexed += batch.Size() + return nil +}