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  }