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 //}