github.com/Oyster-zx/tendermint@v0.34.24-fork/rpc/client/mock/abci_test.go (about) 1 package mock_test 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "testing" 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(context.Background()) 50 require.NotNil(err) 51 assert.Equal("foobar", err.Error()) 52 53 // query always returns the response 54 _query, err := m.ABCIQueryWithOptions(context.Background(), "/", 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(context.Background(), goodTx) 64 require.NotNil(err) 65 assert.Equal("must commit", err.Error()) 66 _, err = m.BroadcastTxAsync(context.Background(), goodTx) 67 require.NotNil(err) 68 assert.Equal("must commit", err.Error()) 69 70 // commit depends on the input 71 _, err = m.BroadcastTxCommit(context.Background(), badTx) 72 require.NotNil(err) 73 assert.Equal("bad tx", err.Error()) 74 bres, err := m.BroadcastTxCommit(context.Background(), 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(context.Background()) 99 assert.Nil(err, "expected no err on info") 100 101 _, err = r.ABCIQueryWithOptions( 102 context.Background(), 103 "path", 104 bytes.HexBytes("data"), 105 client.ABCIQueryOptions{Prove: false}, 106 ) 107 assert.NotNil(err, "expected error on query") 108 require.Equal(2, len(r.Calls)) 109 110 info := r.Calls[0] 111 assert.Equal("abci_info", info.Name) 112 assert.Nil(info.Error) 113 assert.Nil(info.Args) 114 require.NotNil(info.Response) 115 ir, ok := info.Response.(*ctypes.ResultABCIInfo) 116 require.True(ok) 117 assert.Equal("data", ir.Response.Data) 118 assert.Equal("v0.9.9", ir.Response.Version) 119 120 query := r.Calls[1] 121 assert.Equal("abci_query", query.Name) 122 assert.Nil(query.Response) 123 require.NotNil(query.Error) 124 assert.Equal("query", query.Error.Error()) 125 require.NotNil(query.Args) 126 qa, ok := query.Args.(mock.QueryArgs) 127 require.True(ok) 128 assert.Equal("path", qa.Path) 129 assert.EqualValues("data", qa.Data) 130 assert.False(qa.Prove) 131 132 // now add some broadcasts (should all err) 133 txs := []types.Tx{{1}, {2}, {3}} 134 _, err = r.BroadcastTxCommit(context.Background(), txs[0]) 135 assert.NotNil(err, "expected err on broadcast") 136 _, err = r.BroadcastTxSync(context.Background(), txs[1]) 137 assert.NotNil(err, "expected err on broadcast") 138 _, err = r.BroadcastTxAsync(context.Background(), txs[2]) 139 assert.NotNil(err, "expected err on broadcast") 140 141 require.Equal(5, len(r.Calls)) 142 143 bc := r.Calls[2] 144 assert.Equal("broadcast_tx_commit", bc.Name) 145 assert.Nil(bc.Response) 146 require.NotNil(bc.Error) 147 assert.EqualValues(bc.Args, txs[0]) 148 149 bs := r.Calls[3] 150 assert.Equal("broadcast_tx_sync", bs.Name) 151 assert.Nil(bs.Response) 152 require.NotNil(bs.Error) 153 assert.EqualValues(bs.Args, txs[1]) 154 155 ba := r.Calls[4] 156 assert.Equal("broadcast_tx_async", ba.Name) 157 assert.Nil(ba.Response) 158 require.NotNil(ba.Error) 159 assert.EqualValues(ba.Args, txs[2]) 160 } 161 162 func TestABCIApp(t *testing.T) { 163 assert, require := assert.New(t), require.New(t) 164 app := kvstore.NewApplication() 165 m := mock.ABCIApp{app} 166 167 // get some info 168 info, err := m.ABCIInfo(context.Background()) 169 require.Nil(err) 170 assert.Equal(`{"size":0}`, info.Response.GetData()) 171 172 // add a key 173 key, value := "foo", "bar" 174 tx := fmt.Sprintf("%s=%s", key, value) 175 res, err := m.BroadcastTxCommit(context.Background(), types.Tx(tx)) 176 require.Nil(err) 177 assert.True(res.CheckTx.IsOK()) 178 require.NotNil(res.DeliverTx) 179 assert.True(res.DeliverTx.IsOK()) 180 181 // commit 182 // TODO: This may not be necessary in the future 183 if res.Height == -1 { 184 m.App.Commit() 185 } 186 187 // check the key 188 _qres, err := m.ABCIQueryWithOptions( 189 context.Background(), 190 "/key", 191 bytes.HexBytes(key), 192 client.ABCIQueryOptions{Prove: true}, 193 ) 194 qres := _qres.Response 195 require.Nil(err) 196 assert.EqualValues(value, qres.Value) 197 198 // XXX Check proof 199 }