github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/baseapp/evm2cm_test.go (about)

     1  package baseapp
     2  
     3  import (
     4  	"encoding/json"
     5  	"os"
     6  	"testing"
     7  
     8  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     9  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    10  	db "github.com/fibonacci-chain/fbc/libs/tm-db"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  type testMsg struct {
    15  	route string
    16  }
    17  
    18  func (msg testMsg) Route() string                { return msg.route }
    19  func (msg testMsg) Type() string                 { return "testMsg" }
    20  func (msg testMsg) GetSigners() []sdk.AccAddress { return nil }
    21  func (msg testMsg) GetSignBytes() []byte         { return nil }
    22  func (msg testMsg) ValidateBasic() error         { return nil }
    23  
    24  func TestRegisterCmHandle_ConvertMsg(t *testing.T) {
    25  	testcases := []struct {
    26  		module      string
    27  		funcName    string
    28  		blockHeight int64
    29  		setHeight   int64
    30  		success     bool
    31  	}{
    32  		{
    33  			module:      "module1",
    34  			funcName:    "test1",
    35  			blockHeight: 0,
    36  			setHeight:   0,
    37  			success:     true,
    38  		},
    39  		{
    40  			module:      "module1",
    41  			funcName:    "test2",
    42  			blockHeight: 0,
    43  			setHeight:   0,
    44  			success:     true,
    45  		},
    46  		{
    47  			module:      "module3",
    48  			funcName:    "test1",
    49  			blockHeight: 0,
    50  			setHeight:   0,
    51  			success:     true,
    52  		},
    53  		{
    54  			module:      "module4",
    55  			funcName:    "test1",
    56  			blockHeight: 0,
    57  			setHeight:   0,
    58  			success:     true,
    59  		},
    60  		{
    61  			module:      "module4",
    62  			funcName:    "test2",
    63  			blockHeight: 0,
    64  			setHeight:   0,
    65  			success:     true,
    66  		},
    67  		{
    68  			module:      "module4",
    69  			funcName:    "test3",
    70  			blockHeight: 0,
    71  			setHeight:   0,
    72  			success:     true,
    73  		},
    74  
    75  		// error
    76  		{
    77  			module:      "module5",
    78  			funcName:    "test1",
    79  			blockHeight: 4,
    80  			setHeight:   5,
    81  			success:     false,
    82  		},
    83  		{
    84  			module:      "module5",
    85  			funcName:    "test2",
    86  			blockHeight: 5,
    87  			setHeight:   5,
    88  			success:     true,
    89  		},
    90  		{
    91  			module:      "module5",
    92  			funcName:    "test3",
    93  			blockHeight: 6,
    94  			setHeight:   5,
    95  			success:     true,
    96  		},
    97  
    98  		//{ // test for panic
    99  		//	module:      "module5",
   100  		//	funcName:    "test3",
   101  		//	blockHeight: 6,
   102  		//	setHeight:   5,
   103  		//	success:     true,
   104  		//},
   105  	}
   106  	for _, ts := range testcases {
   107  		RegisterCmHandle(ts.module+ts.funcName,
   108  			NewCMHandle(func(data []byte, signers []sdk.AccAddress) (sdk.Msg, error) {
   109  				return nil, nil
   110  			}, ts.setHeight))
   111  	}
   112  
   113  	// check
   114  	for _, ts := range testcases {
   115  		RegisterEvmParamParse(func(msg sdk.Msg) ([]byte, error) {
   116  			mw := &MsgWrapper{
   117  				Name: ts.module + ts.funcName,
   118  				Data: []byte("123"),
   119  			}
   120  			v, err := json.Marshal(mw)
   121  			require.NoError(t, err)
   122  			return v, nil
   123  		})
   124  		_, err := ConvertMsg(testMsg{}, ts.blockHeight)
   125  		require.Equal(t, ts.success, err == nil)
   126  	}
   127  }
   128  
   129  func TestJudgeEvmConvert(t *testing.T) {
   130  	logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).
   131  		With("module", "mock")
   132  	testcases := []struct {
   133  		app     *BaseApp
   134  		fnInit  func(app *BaseApp)
   135  		fnCheck func(is bool)
   136  	}{
   137  		{
   138  			app:    NewBaseApp("test", logger, db.NewMemDB(), nil),
   139  			fnInit: func(app *BaseApp) {},
   140  			fnCheck: func(is bool) {
   141  				require.False(t, is)
   142  			},
   143  		},
   144  		{
   145  			app: NewBaseApp("test", logger, db.NewMemDB(), nil),
   146  			fnInit: func(app *BaseApp) {
   147  				app.SetEvmSysContractAddressHandler(func(ctx sdk.Context, addr sdk.AccAddress) bool {
   148  					return true
   149  				})
   150  				RegisterEvmParamParse(func(msg sdk.Msg) ([]byte, error) {
   151  					return nil, nil
   152  				})
   153  				RegisterEvmResultConverter(func(txHash, data []byte) ([]byte, error) {
   154  					return nil, nil
   155  				})
   156  				RegisterEvmConvertJudge(func(msg sdk.Msg) ([]byte, bool) {
   157  					return []byte{1, 2, 3}, true
   158  				})
   159  			},
   160  			fnCheck: func(is bool) {
   161  				require.True(t, is)
   162  			},
   163  		},
   164  		{
   165  			app:    NewBaseApp("test", logger, db.NewMemDB(), nil),
   166  			fnInit: func(app *BaseApp) {},
   167  			fnCheck: func(is bool) {
   168  				require.False(t, is)
   169  			},
   170  		},
   171  	}
   172  
   173  	for _, ts := range testcases {
   174  		ts.fnInit(ts.app)
   175  		re := ts.app.JudgeEvmConvert(sdk.Context{}, nil)
   176  		ts.fnCheck(re)
   177  	}
   178  }
   179  
   180  func TestParseMsgWrapper(t *testing.T) {
   181  	testcases := []struct {
   182  		input   string
   183  		fnCheck func(ret *MsgWrapper, err error)
   184  	}{
   185  		{
   186  			input: `{"type": "fbexchain/staking/MsgDeposit","value": {"delegator_address": "0x4375D630687C83471829227b5C1Ea92217FD6265","quantity": {"denom": "fibo","amount": "1"}}}`,
   187  			fnCheck: func(ret *MsgWrapper, err error) {
   188  				require.NoError(t, err)
   189  				require.Equal(t, "fbexchain/staking/MsgDeposit", ret.Name)
   190  				require.Equal(t, "{\"delegator_address\": \"0x4375D630687C83471829227b5C1Ea92217FD6265\",\"quantity\": {\"denom\": \"fibo\",\"amount\": \"1\"}}", string(ret.Data))
   191  			},
   192  		},
   193  		{
   194  			input: `{"type": "fbexchain/staking/MsgWithdraw","value": {"delegator_address": "0x4375D630687C83471829227b5C1Ea92217FD6265","quantity": {"denom": "fibo","amount": "1"}}}`,
   195  			fnCheck: func(ret *MsgWrapper, err error) {
   196  				require.NoError(t, err)
   197  				require.Equal(t, "fbexchain/staking/MsgWithdraw", ret.Name)
   198  				require.Equal(t, "{\"delegator_address\": \"0x4375D630687C83471829227b5C1Ea92217FD6265\",\"quantity\": {\"denom\": \"fibo\",\"amount\": \"1\"}}", string(ret.Data))
   199  			},
   200  		},
   201  		// error
   202  		{
   203  			input: `{"type1": "fbexchain/staking/MsgWithdraw","value":""}`,
   204  			fnCheck: func(ret *MsgWrapper, err error) {
   205  				require.NotNil(t, err)
   206  			},
   207  		},
   208  		{
   209  			input: `{"type": "fbexchain/staking/MsgWithdraw","value1":"123"}`,
   210  			fnCheck: func(ret *MsgWrapper, err error) {
   211  				require.NotNil(t, err)
   212  			},
   213  		},
   214  	}
   215  
   216  	for _, ts := range testcases {
   217  		ret, err := ParseMsgWrapper([]byte(ts.input))
   218  		ts.fnCheck(ret, err)
   219  	}
   220  }