github.com/Finschia/finschia-sdk@v0.48.1/types/result_test.go (about) 1 package types_test 2 3 import ( 4 "encoding/hex" 5 "fmt" 6 "strings" 7 "testing" 8 9 "github.com/golang/protobuf/proto" 10 "github.com/stretchr/testify/require" 11 "github.com/stretchr/testify/suite" 12 abci "github.com/tendermint/tendermint/abci/types" 13 14 ocabci "github.com/Finschia/ostracon/abci/types" 15 "github.com/Finschia/ostracon/libs/bytes" 16 ctypes "github.com/Finschia/ostracon/rpc/core/types" 17 18 "github.com/Finschia/finschia-sdk/codec" 19 "github.com/Finschia/finschia-sdk/testutil/testdata" 20 sdk "github.com/Finschia/finschia-sdk/types" 21 ) 22 23 type resultTestSuite struct { 24 suite.Suite 25 } 26 27 func TestResultTestSuite(t *testing.T) { 28 suite.Run(t, new(resultTestSuite)) 29 } 30 31 func (s *resultTestSuite) SetupSuite() { 32 s.T().Parallel() 33 } 34 35 func (s *resultTestSuite) TestParseABCILog() { 36 logs := `[{"log":"","msg_index":1,"success":true}]` 37 res, err := sdk.ParseABCILogs(logs) 38 39 s.Require().NoError(err) 40 s.Require().Len(res, 1) 41 s.Require().Equal(res[0].Log, "") 42 s.Require().Equal(res[0].MsgIndex, uint32(1)) 43 } 44 45 func (s *resultTestSuite) TestABCIMessageLog() { 46 cdc := codec.NewLegacyAmino() 47 48 const maxIter = 5 49 50 tests := []struct { 51 emptyLog bool 52 emptyType bool 53 emptyKey bool 54 emptyValue bool 55 }{ 56 {false, false, false, false}, 57 {true, false, false, false}, 58 {false, true, false, false}, 59 {false, false, true, false}, 60 {false, false, false, true}, 61 {false, false, true, true}, 62 {false, true, false, true}, 63 {false, true, true, false}, 64 {true, false, false, true}, 65 {true, false, true, false}, 66 {true, true, false, false}, 67 {false, true, true, true}, 68 {true, false, true, true}, 69 {true, true, false, true}, 70 {true, true, true, false}, 71 {true, true, true, true}, 72 } 73 74 for _, tt := range tests { 75 msgLogs := sdk.ABCIMessageLogs{} 76 for numMsgs := 0; numMsgs < maxIter; numMsgs++ { 77 for i := 0; i < numMsgs; i++ { 78 events := sdk.Events{} 79 for numEvents := 0; numEvents < maxIter; numEvents++ { 80 for j := 0; j < numEvents; j++ { 81 var attributes []sdk.Attribute 82 for numAttributes := 0; numAttributes < maxIter; numAttributes++ { 83 for i := 0; i < numAttributes; i++ { 84 key := "" 85 value := "" 86 if !tt.emptyKey { 87 key = fmt.Sprintf("key%d", i) 88 } 89 if !tt.emptyValue { 90 value = fmt.Sprintf("value%d", i) 91 } 92 attributes = append(attributes, sdk.NewAttribute(key, value)) 93 } 94 } 95 typeStr := "" 96 if !tt.emptyType { 97 typeStr = fmt.Sprintf("type%d", i) 98 } 99 events = append(events, sdk.NewEvent(typeStr, attributes...)) 100 } 101 } 102 103 log := "" 104 if !tt.emptyLog { 105 log = fmt.Sprintf("log%d", i) 106 } 107 msgLogs = append(msgLogs, sdk.NewABCIMessageLog(uint32(i), log, events)) 108 } 109 } 110 bz, err := cdc.MarshalJSON(msgLogs) 111 112 s.Require().NoError(err) 113 s.Require().Equal(string(bz), msgLogs.String()) 114 } 115 116 var msgLogs sdk.ABCIMessageLogs 117 s.Require().Equal("", msgLogs.String()) 118 } 119 120 func (s *resultTestSuite) TestNewSearchTxsResult() { 121 got := sdk.NewSearchTxsResult(150, 20, 2, 20, []*sdk.TxResponse{}) 122 s.Require().Equal(&sdk.SearchTxsResult{ 123 TotalCount: 150, 124 Count: 20, 125 PageNumber: 2, 126 PageTotal: 8, 127 Limit: 20, 128 Txs: []*sdk.TxResponse{}, 129 }, got) 130 } 131 132 func (s *resultTestSuite) TestResponseResultTx() { 133 deliverTxResult := abci.ResponseDeliverTx{ 134 Codespace: "codespace", 135 Code: 1, 136 Data: []byte("data"), 137 Log: `[]`, 138 Info: "info", 139 GasWanted: 100, 140 GasUsed: 90, 141 } 142 resultTx := &ctypes.ResultTx{ 143 Hash: bytes.HexBytes([]byte("test")), 144 Height: 10, 145 Index: 1, 146 TxResult: deliverTxResult, 147 } 148 logs, err := sdk.ParseABCILogs(`[]`) 149 150 s.Require().NoError(err) 151 152 want := &sdk.TxResponse{ 153 TxHash: "74657374", 154 Height: 10, 155 Codespace: "codespace", 156 Code: 1, 157 Data: strings.ToUpper(hex.EncodeToString([]byte("data"))), 158 RawLog: `[]`, 159 Logs: logs, 160 Info: "info", 161 GasWanted: 100, 162 GasUsed: 90, 163 Tx: nil, 164 Timestamp: "timestamp", 165 } 166 167 s.Require().Equal(want, sdk.NewResponseResultTx(resultTx, nil, "timestamp")) 168 s.Require().Equal((*sdk.TxResponse)(nil), sdk.NewResponseResultTx(nil, nil, "timestamp")) 169 s.Require().Equal(`code: 1 170 codespace: codespace 171 data: "64617461" 172 events: [] 173 gas_used: "90" 174 gas_wanted: "100" 175 height: "10" 176 info: info 177 logs: [] 178 raw_log: '[]' 179 timestamp: timestamp 180 tx: null 181 txhash: "74657374" 182 `, sdk.NewResponseResultTx(resultTx, nil, "timestamp").String()) 183 s.Require().True(sdk.TxResponse{}.Empty()) 184 s.Require().False(want.Empty()) 185 186 resultBroadcastTx := &ctypes.ResultBroadcastTx{ 187 Code: 1, 188 Codespace: "codespace", 189 Data: []byte("data"), 190 Log: `[]`, 191 Hash: bytes.HexBytes([]byte("test")), 192 } 193 194 s.Require().Equal(&sdk.TxResponse{ 195 Code: 1, 196 Codespace: "codespace", 197 Data: "64617461", 198 RawLog: `[]`, 199 Logs: logs, 200 TxHash: "74657374", 201 }, sdk.NewResponseFormatBroadcastTx(resultBroadcastTx)) 202 s.Require().Equal((*sdk.TxResponse)(nil), sdk.NewResponseFormatBroadcastTx(nil)) 203 } 204 205 func (s *resultTestSuite) TestResponseFormatBroadcastTxCommit() { 206 // test nil 207 s.Require().Equal((*sdk.TxResponse)(nil), sdk.NewResponseFormatBroadcastTxCommit(nil)) 208 209 logs, err := sdk.ParseABCILogs(`[]`) 210 s.Require().NoError(err) 211 212 // test checkTx 213 checkTxResult := &ctypes.ResultBroadcastTxCommit{ 214 Height: 10, 215 Hash: bytes.HexBytes([]byte("test")), 216 CheckTx: ocabci.ResponseCheckTx{ 217 Code: 90, 218 Data: nil, 219 Log: `[]`, 220 Info: "info", 221 GasWanted: 99, 222 GasUsed: 100, 223 Codespace: "codespace", 224 Events: []abci.Event{ 225 { 226 Type: "message", 227 Attributes: []abci.EventAttribute{ 228 { 229 Key: []byte("action"), 230 Value: []byte("foo"), 231 Index: true, 232 }, 233 }, 234 }, 235 }, 236 }, 237 } 238 deliverTxResult := &ctypes.ResultBroadcastTxCommit{ 239 Height: 10, 240 Hash: bytes.HexBytes([]byte("test")), 241 DeliverTx: abci.ResponseDeliverTx{ 242 Code: 90, 243 Data: nil, 244 Log: `[]`, 245 Info: "info", 246 GasWanted: 99, 247 GasUsed: 100, 248 Codespace: "codespace", 249 Events: []abci.Event{ 250 { 251 Type: "message", 252 Attributes: []abci.EventAttribute{ 253 { 254 Key: []byte("action"), 255 Value: []byte("foo"), 256 Index: true, 257 }, 258 }, 259 }, 260 }, 261 }, 262 } 263 want := &sdk.TxResponse{ 264 Height: 10, 265 TxHash: "74657374", 266 Codespace: "codespace", 267 Code: 90, 268 Data: "", 269 RawLog: `[]`, 270 Logs: logs, 271 Info: "info", 272 GasWanted: 99, 273 GasUsed: 100, 274 Events: []abci.Event{ 275 { 276 Type: "message", 277 Attributes: []abci.EventAttribute{ 278 { 279 Key: []byte("action"), 280 Value: []byte("foo"), 281 Index: true, 282 }, 283 }, 284 }, 285 }, 286 } 287 288 s.Require().Equal(want, sdk.NewResponseFormatBroadcastTxCommit(checkTxResult)) 289 s.Require().Equal(want, sdk.NewResponseFormatBroadcastTxCommit(deliverTxResult)) 290 } 291 292 func TestWrapServiceResult(t *testing.T) { 293 ctx := sdk.Context{} 294 295 res, err := sdk.WrapServiceResult(ctx, nil, fmt.Errorf("test")) 296 require.Nil(t, res) 297 require.NotNil(t, err) 298 299 res, err = sdk.WrapServiceResult(ctx, nil, nil) 300 require.NotNil(t, res) 301 require.Nil(t, err) 302 require.Empty(t, res.Events) 303 304 ctx = ctx.WithEventManager(sdk.NewEventManager()) 305 ctx.EventManager().EmitEvent(sdk.NewEvent("test")) 306 res, err = sdk.WrapServiceResult(ctx, nil, nil) 307 require.NotNil(t, res) 308 require.Nil(t, err) 309 require.Len(t, res.Events, 1) 310 311 spot := testdata.Dog{Name: "spot"} 312 res, err = sdk.WrapServiceResult(ctx, &spot, nil) 313 require.NotNil(t, res) 314 require.Nil(t, err) 315 require.Len(t, res.Events, 1) 316 var spot2 testdata.Dog 317 err = proto.Unmarshal(res.Data, &spot2) 318 require.NoError(t, err) 319 require.Equal(t, spot, spot2) 320 } 321 322 func TestNewResponseFormatBroadcastTx(t *testing.T) { 323 hash, err := hex.DecodeString("00000000000000000000000000000000") 324 require.NoError(t, err) 325 result := ctypes.ResultBroadcastTx{ 326 Code: 1, 327 Data: []byte("some data"), 328 Log: `[{"log":"","msg_index":1,"success":true}]`, 329 Codespace: "codespace", 330 Hash: hash, 331 } 332 333 txResponse := sdk.NewResponseFormatBroadcastTx(&result) 334 335 require.NoError(t, err) 336 require.Equal(t, result.Code, txResponse.Code) 337 require.Equal(t, result.Data.String(), txResponse.Data) 338 require.NotEmpty(t, txResponse.Logs) 339 require.Equal(t, result.Log, txResponse.RawLog) 340 require.Equal(t, result.Codespace, txResponse.Codespace) 341 require.Equal(t, result.Hash.String(), txResponse.TxHash) 342 }