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