github.com/vipernet-xyz/tendermint-core@v0.32.0/rpc/client/mock/abci_test.go (about) 1 package mock_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/pkg/errors" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 12 "github.com/tendermint/tendermint/abci/example/kvstore" 13 abci "github.com/tendermint/tendermint/abci/types" 14 "github.com/tendermint/tendermint/libs/bytes" 15 "github.com/tendermint/tendermint/rpc/client" 16 "github.com/tendermint/tendermint/rpc/client/mock" 17 ctypes "github.com/tendermint/tendermint/rpc/core/types" 18 "github.com/tendermint/tendermint/types" 19 ) 20 21 func TestABCIMock(t *testing.T) { 22 assert, require := assert.New(t), require.New(t) 23 24 key, value := []byte("foo"), []byte("bar") 25 height := int64(10) 26 goodTx := types.Tx{0x01, 0xff} 27 badTx := types.Tx{0x12, 0x21} 28 29 m := mock.ABCIMock{ 30 Info: mock.Call{Error: errors.New("foobar")}, 31 Query: mock.Call{Response: abci.ResponseQuery{ 32 Key: key, 33 Value: value, 34 Height: height, 35 }}, 36 // Broadcast commit depends on call 37 BroadcastCommit: mock.Call{ 38 Args: goodTx, 39 Response: &ctypes.ResultBroadcastTxCommit{ 40 CheckTx: abci.ResponseCheckTx{Data: bytes.HexBytes("stand")}, 41 DeliverTx: abci.ResponseDeliverTx{Data: bytes.HexBytes("deliver")}, 42 }, 43 Error: errors.New("bad tx"), 44 }, 45 Broadcast: mock.Call{Error: errors.New("must commit")}, 46 } 47 48 // now, let's try to make some calls 49 _, err := m.ABCIInfo() 50 require.NotNil(err) 51 assert.Equal("foobar", err.Error()) 52 53 // query always returns the response 54 _query, err := m.ABCIQueryWithOptions("/", nil, client.ABCIQueryOptions{Prove: false}) 55 query := _query.Response 56 require.Nil(err) 57 require.NotNil(query) 58 assert.EqualValues(key, query.Key) 59 assert.EqualValues(value, query.Value) 60 assert.Equal(height, query.Height) 61 62 // non-commit calls always return errors 63 _, err = m.BroadcastTxSync(goodTx) 64 require.NotNil(err) 65 assert.Equal("must commit", err.Error()) 66 _, err = m.BroadcastTxAsync(goodTx) 67 require.NotNil(err) 68 assert.Equal("must commit", err.Error()) 69 70 // commit depends on the input 71 _, err = m.BroadcastTxCommit(badTx) 72 require.NotNil(err) 73 assert.Equal("bad tx", err.Error()) 74 bres, err := m.BroadcastTxCommit(goodTx) 75 require.Nil(err, "%+v", err) 76 assert.EqualValues(0, bres.CheckTx.Code) 77 assert.EqualValues("stand", bres.CheckTx.Data) 78 assert.EqualValues("deliver", bres.DeliverTx.Data) 79 } 80 81 func TestABCIRecorder(t *testing.T) { 82 assert, require := assert.New(t), require.New(t) 83 84 // This mock returns errors on everything but Query 85 m := mock.ABCIMock{ 86 Info: mock.Call{Response: abci.ResponseInfo{ 87 Data: "data", 88 Version: "v0.9.9", 89 }}, 90 Query: mock.Call{Error: errors.New("query")}, 91 Broadcast: mock.Call{Error: errors.New("broadcast")}, 92 BroadcastCommit: mock.Call{Error: errors.New("broadcast_commit")}, 93 } 94 r := mock.NewABCIRecorder(m) 95 96 require.Equal(0, len(r.Calls)) 97 98 _, err := r.ABCIInfo() 99 assert.Nil(err, "expected no err on info") 100 101 _, err = r.ABCIQueryWithOptions("path", bytes.HexBytes("data"), client.ABCIQueryOptions{Prove: false}) 102 assert.NotNil(err, "expected error on query") 103 require.Equal(2, len(r.Calls)) 104 105 info := r.Calls[0] 106 assert.Equal("abci_info", info.Name) 107 assert.Nil(info.Error) 108 assert.Nil(info.Args) 109 require.NotNil(info.Response) 110 ir, ok := info.Response.(*ctypes.ResultABCIInfo) 111 require.True(ok) 112 assert.Equal("data", ir.Response.Data) 113 assert.Equal("v0.9.9", ir.Response.Version) 114 115 query := r.Calls[1] 116 assert.Equal("abci_query", query.Name) 117 assert.Nil(query.Response) 118 require.NotNil(query.Error) 119 assert.Equal("query", query.Error.Error()) 120 require.NotNil(query.Args) 121 qa, ok := query.Args.(mock.QueryArgs) 122 require.True(ok) 123 assert.Equal("path", qa.Path) 124 assert.EqualValues("data", qa.Data) 125 assert.False(qa.Prove) 126 127 // now add some broadcasts (should all err) 128 txs := []types.Tx{{1}, {2}, {3}} 129 _, err = r.BroadcastTxCommit(txs[0]) 130 assert.NotNil(err, "expected err on broadcast") 131 _, err = r.BroadcastTxSync(txs[1]) 132 assert.NotNil(err, "expected err on broadcast") 133 _, err = r.BroadcastTxAsync(txs[2]) 134 assert.NotNil(err, "expected err on broadcast") 135 136 require.Equal(5, len(r.Calls)) 137 138 bc := r.Calls[2] 139 assert.Equal("broadcast_tx_commit", bc.Name) 140 assert.Nil(bc.Response) 141 require.NotNil(bc.Error) 142 assert.EqualValues(bc.Args, txs[0]) 143 144 bs := r.Calls[3] 145 assert.Equal("broadcast_tx_sync", bs.Name) 146 assert.Nil(bs.Response) 147 require.NotNil(bs.Error) 148 assert.EqualValues(bs.Args, txs[1]) 149 150 ba := r.Calls[4] 151 assert.Equal("broadcast_tx_async", ba.Name) 152 assert.Nil(ba.Response) 153 require.NotNil(ba.Error) 154 assert.EqualValues(ba.Args, txs[2]) 155 } 156 157 func TestABCIApp(t *testing.T) { 158 assert, require := assert.New(t), require.New(t) 159 app := kvstore.NewApplication() 160 m := mock.ABCIApp{app} 161 162 // get some info 163 info, err := m.ABCIInfo() 164 require.Nil(err) 165 assert.Equal(`{"size":0}`, info.Response.GetData()) 166 167 // add a key 168 key, value := "foo", "bar" 169 tx := fmt.Sprintf("%s=%s", key, value) 170 res, err := m.BroadcastTxCommit(types.Tx(tx)) 171 require.Nil(err) 172 assert.True(res.CheckTx.IsOK()) 173 require.NotNil(res.DeliverTx) 174 assert.True(res.DeliverTx.IsOK()) 175 176 // commit 177 // TODO: This may not be necessary in the future 178 if res.Height == -1 { 179 m.App.Commit() 180 } 181 182 // check the key 183 _qres, err := m.ABCIQueryWithOptions("/key", bytes.HexBytes(key), client.ABCIQueryOptions{Prove: true}) 184 qres := _qres.Response 185 require.Nil(err) 186 assert.EqualValues(value, qres.Value) 187 188 // XXX Check proof 189 }