github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/types/genesis_test.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestValidateGenesisState(t *testing.T) {
    11  	specs := map[string]struct {
    12  		srcMutator func(*GenesisState)
    13  		expError   bool
    14  	}{
    15  		"all good": {
    16  			srcMutator: func(s *GenesisState) {},
    17  		},
    18  		"params invalid": {
    19  			srcMutator: func(s *GenesisState) {
    20  				s.Params = Params{}
    21  			},
    22  			expError: true,
    23  		},
    24  		"codeinfo invalid": {
    25  			srcMutator: func(s *GenesisState) {
    26  				s.Codes[0].CodeInfo.CodeHash = nil
    27  			},
    28  			expError: true,
    29  		},
    30  		"contract invalid": {
    31  			srcMutator: func(s *GenesisState) {
    32  				s.Contracts[0].ContractAddress = "invalid"
    33  			},
    34  			expError: true,
    35  		},
    36  		"sequence invalid": {
    37  			srcMutator: func(s *GenesisState) {
    38  				s.Sequences[0].IDKey = nil
    39  			},
    40  			expError: true,
    41  		},
    42  		"genesis store code message invalid": {
    43  			srcMutator: func(s *GenesisState) {
    44  				s.GenMsgs[0].GetStoreCode().WASMByteCode = nil
    45  			},
    46  			expError: true,
    47  		},
    48  		"genesis instantiate contract message invalid": {
    49  			srcMutator: func(s *GenesisState) {
    50  				s.GenMsgs[1].GetInstantiateContract().CodeID = 0
    51  			},
    52  			expError: true,
    53  		},
    54  		"genesis execute contract message invalid": {
    55  			srcMutator: func(s *GenesisState) {
    56  				s.GenMsgs[2].GetExecuteContract().Sender = "invalid"
    57  			},
    58  			expError: true,
    59  		},
    60  		"genesis invalid message type": {
    61  			srcMutator: func(s *GenesisState) {
    62  				s.GenMsgs[0].Sum = nil
    63  			},
    64  			expError: true,
    65  		},
    66  	}
    67  	for msg, spec := range specs {
    68  		t.Run(msg, func(t *testing.T) {
    69  			state := GenesisFixture(spec.srcMutator)
    70  			got := state.ValidateBasic()
    71  			if spec.expError {
    72  				require.Error(t, got)
    73  				return
    74  			}
    75  			require.NoError(t, got)
    76  		})
    77  	}
    78  }
    79  
    80  func TestCodeValidateBasic(t *testing.T) {
    81  	specs := map[string]struct {
    82  		srcMutator func(*Code)
    83  		expError   bool
    84  	}{
    85  		"all good": {srcMutator: func(_ *Code) {}},
    86  		"code id invalid": {
    87  			srcMutator: func(c *Code) {
    88  				c.CodeID = 0
    89  			},
    90  			expError: true,
    91  		},
    92  		"codeinfo invalid": {
    93  			srcMutator: func(c *Code) {
    94  				c.CodeInfo.CodeHash = nil
    95  			},
    96  			expError: true,
    97  		},
    98  		"codeBytes empty": {
    99  			srcMutator: func(c *Code) {
   100  				c.CodeBytes = []byte{}
   101  			},
   102  			expError: true,
   103  		},
   104  		"codeBytes nil": {
   105  			srcMutator: func(c *Code) {
   106  				c.CodeBytes = nil
   107  			},
   108  			expError: true,
   109  		},
   110  		"codeBytes greater limit": {
   111  			srcMutator: func(c *Code) {
   112  				c.CodeBytes = bytes.Repeat([]byte{0x1}, MaxWasmSize+1)
   113  			},
   114  			expError: true,
   115  		},
   116  	}
   117  	for msg, spec := range specs {
   118  		t.Run(msg, func(t *testing.T) {
   119  			state := CodeFixture(spec.srcMutator)
   120  			got := state.ValidateBasic()
   121  			if spec.expError {
   122  				require.Error(t, got)
   123  				return
   124  			}
   125  			require.NoError(t, got)
   126  		})
   127  	}
   128  }
   129  
   130  func TestContractValidateBasic(t *testing.T) {
   131  	specs := map[string]struct {
   132  		srcMutator func(*Contract)
   133  		expError   bool
   134  	}{
   135  		"all good": {srcMutator: func(_ *Contract) {}},
   136  		"contract address invalid": {
   137  			srcMutator: func(c *Contract) {
   138  				c.ContractAddress = "invalid"
   139  			},
   140  			expError: true,
   141  		},
   142  		"contract info invalid": {
   143  			srcMutator: func(c *Contract) {
   144  				c.ContractInfo.Creator = "invalid"
   145  			},
   146  			expError: true,
   147  		},
   148  		"contract with created set": {
   149  			srcMutator: func(c *Contract) {
   150  				c.ContractInfo.Created = &AbsoluteTxPosition{}
   151  			},
   152  			expError: true,
   153  		},
   154  		"contract state invalid": {
   155  			srcMutator: func(c *Contract) {
   156  				c.ContractState = append(c.ContractState, Model{})
   157  			},
   158  			expError: true,
   159  		},
   160  	}
   161  	for msg, spec := range specs {
   162  		t.Run(msg, func(t *testing.T) {
   163  			state := ContractFixture(spec.srcMutator)
   164  			got := state.ValidateBasic()
   165  			if spec.expError {
   166  				require.Error(t, got)
   167  				return
   168  			}
   169  			require.NoError(t, got)
   170  		})
   171  	}
   172  }
   173  
   174  //func TestGenesisContractInfoMarshalUnmarshal(t *testing.T) {
   175  //	var myAddr sdk.AccAddress = rand.Bytes(ContractAddrLen)
   176  //	var myOtherAddr sdk.AccAddress = rand.Bytes(ContractAddrLen)
   177  //	anyPos := AbsoluteTxPosition{BlockHeight: 1, TxIndex: 2}
   178  //
   179  //	anyTime := time.Now().UTC()
   180  //	// using gov proposal here as a random protobuf types as it contains an Any type inside for nested unpacking
   181  //	myExtension, err := govtypes.NewProposal(&govtypes.TextProposal{Title: "bar"}, 1, anyTime, anyTime)
   182  //	require.NoError(t, err)
   183  //	myExtension.TotalDeposit = nil
   184  //
   185  //	src := NewContractInfo(1, myAddr, myOtherAddr, "bar", &anyPos)
   186  //	err = src.SetExtension(&myExtension)
   187  //	require.NoError(t, err)
   188  //
   189  //	interfaceRegistry := types.NewInterfaceRegistry()
   190  //	marshaler := codec.NewProtoCodec(interfaceRegistry)
   191  //	RegisterInterfaces(interfaceRegistry)
   192  //	// register proposal as extension type
   193  //	interfaceRegistry.RegisterImplementations(
   194  //		(*ContractInfoExtension)(nil),
   195  //		&govtypes.Proposal{},
   196  //	)
   197  //	// register gov types for nested Anys
   198  //	govtypes.RegisterInterfaces(interfaceRegistry)
   199  //
   200  //	// when encode
   201  //	gs := GenesisState{
   202  //		Contracts: []Contract{{
   203  //			ContractInfo: src,
   204  //		}},
   205  //	}
   206  //
   207  //	bz, err := marshaler.Marshal(&gs)
   208  //	require.NoError(t, err)
   209  //	// and decode
   210  //	var destGs GenesisState
   211  //	err = marshaler.Unmarshal(bz, &destGs)
   212  //	require.NoError(t, err)
   213  //	// then
   214  //	require.Len(t, destGs.Contracts, 1)
   215  //	dest := destGs.Contracts[0].ContractInfo
   216  //	assert.Equal(t, src, dest)
   217  //	// and sanity check nested any
   218  //	var destExt govtypes.Proposal
   219  //	require.NoError(t, dest.ReadExtension(&destExt))
   220  //	assert.Equal(t, destExt.GetTitle(), "bar")
   221  //}