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