github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/types/msg_test.go (about) 1 package types 2 3 import ( 4 "testing" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 "github.com/fibonacci-chain/fbc/libs/tendermint/crypto" 8 "github.com/stretchr/testify/require" 9 ) 10 11 var ( 12 coinPos = sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000) 13 coinZero = sdk.NewInt64Coin(sdk.DefaultBondDenom, 0) 14 ) 15 16 // test ValidateBasic for MsgCreateValidator 17 func TestMsgCreateValidator(t *testing.T) { 18 addr1 := valAddr1 19 tests := []struct { 20 name, moniker, identity, website, details string 21 minSelfDelegation sdk.Int 22 validatorAddr sdk.ValAddress 23 delegatorAddr sdk.AccAddress 24 pubkey crypto.PubKey 25 bond sdk.Coin 26 expectPass bool 27 }{ 28 {"empty bond", "a", "b", "c", "d", sdk.OneInt(), addr1, dlgAddr1, pk1, coinZero, true}, 29 {"zero min self delegation", "a", "b", "c", "d", sdk.ZeroInt(), addr1, dlgAddr1, pk1, coinPos, false}, 30 {"basic good", "a", "b", "c", "d", sdk.OneInt(), addr1, dlgAddr1, pk1, coinPos, true}, 31 {"partial description", "", "", "c", "", sdk.OneInt(), addr1, dlgAddr1, pk1, coinPos, true}, 32 {"empty description", "", "", "", "", sdk.OneInt(), addr1, dlgAddr1, pk1, coinPos, false}, 33 {"empty address1", "a", "b", "c", "d", sdk.OneInt(), emptyAddr, dlgAddr1, pk1, coinPos, false}, 34 {"empty address2", "a", "b", "c", "d", sdk.OneInt(), nil, nil, pk1, coinPos, false}, 35 {"valAddr dlgAddr not equals", "a", "b", "c", "d", sdk.OneInt(), addr1, dlgAddr2, pk1, coinPos, false}, 36 {"empty pubkey", "a", "b", "c", "d", sdk.OneInt(), addr1, dlgAddr1, emptyPubkey, coinPos, true}, 37 //{"negative min self delegation", "a", "b", "c", "d", commission1, sdk.NewInt(-1), addr1, pk1, coinPos, false}, 38 //{"delegation less than min self delegation", "a", "b", "c", "d", commission1, coinPos.Amount.Add(sdk.OneInt()), addr1, pk1, coinPos, false}, 39 } 40 41 for _, tc := range tests { 42 description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details) 43 coin := sdk.NewDecCoin(sdk.DefaultBondDenom, tc.minSelfDelegation) 44 45 msg := MsgCreateValidator{ 46 Description: description, 47 DelegatorAddress: tc.delegatorAddr, 48 ValidatorAddress: tc.validatorAddr, 49 PubKey: tc.pubkey, 50 MinSelfDelegation: coin, 51 } 52 53 if tc.expectPass { 54 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 55 } else { 56 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 57 } 58 } 59 } 60 61 // test ValidateBasic for MsgDestroyValidator 62 func TestMsgDestroyValidator(t *testing.T) { 63 64 tests := []struct { 65 name string 66 valAddr sdk.AccAddress 67 expectPass bool 68 }{ 69 {"basic good", dlgAddr1, true}, 70 {"empty validator", sdk.AccAddress(emptyAddr), false}, 71 } 72 73 for _, tc := range tests { 74 msg := NewMsgDestroyValidator(tc.valAddr) 75 if tc.expectPass { 76 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 77 checkMsg(t, msg, "destroy_validator") 78 } else { 79 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 80 } 81 } 82 } 83 84 func TestMsgCreateValidator_Smoke(t *testing.T) { 85 86 msd := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(2000)) 87 88 msg := NewMsgCreateValidator(valAddr1, pk1, 89 NewDescription("my moniker", "my identity", "my website", "my details"), msd, 90 ) 91 require.Contains(t, msg.Route(), RouterKey) 92 require.Contains(t, msg.Type(), "create_validator") 93 require.True(t, len(msg.GetSigners()) == 1, msg) 94 require.True(t, len(msg.GetSignBytes()) > 0, msg) 95 96 bz, err := msg.MarshalJSON() 97 require.Nil(t, err) 98 newMsg := MsgCreateValidator{} 99 err2 := newMsg.UnmarshalJSON(bz) 100 require.Nil(t, err2) 101 require.Equal(t, msg, newMsg) 102 103 err3 := newMsg.UnmarshalJSON(nil) 104 require.NotNil(t, err3) 105 } 106 107 // test ValidateBasic for MsgEditValidator 108 func TestMsgEditValidator(t *testing.T) { 109 tests := []struct { 110 name, moniker, identity, website, details string 111 validatorAddr sdk.ValAddress 112 expectPass bool 113 }{ 114 {"basic good", "a", "b", "c", "d", valAddr1, true}, 115 {"partial description", "", "", "c", "", valAddr1, true}, 116 {"empty description", "", "", "", "", valAddr1, false}, 117 {"empty address", "a", "b", "c", "d", emptyAddr, false}, 118 } 119 120 for _, tc := range tests { 121 description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details) 122 msg := NewMsgEditValidator(tc.validatorAddr, description) 123 if tc.expectPass { 124 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 125 checkMsg(t, msg, "edit_validator") 126 } else { 127 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 128 } 129 } 130 } 131 132 func checkMsg(t *testing.T, msg sdk.Msg, expType string) { 133 require.Contains(t, msg.Route(), RouterKey) 134 require.Contains(t, msg.Type(), expType) 135 require.True(t, len(msg.GetSigners()) == 1, msg) 136 require.True(t, len(msg.GetSignBytes()) > 0, msg) 137 } 138 139 // test ValidateBasic for MsgDeposit 140 func TestMsgDeposit(t *testing.T) { 141 142 coinPos := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(1000)) 143 coinZero := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.ZeroDec()) 144 145 tests := []struct { 146 name string 147 delegatorAddr sdk.AccAddress 148 amount sdk.SysCoin 149 expectPass bool 150 }{ 151 {"basic good", dlgAddr1, coinPos, true}, 152 {"empty delegator", sdk.AccAddress(emptyAddr), coinPos, false}, 153 {"empty bond", sdk.AccAddress(addr1), coinZero, false}, 154 } 155 156 for _, tc := range tests { 157 msg := NewMsgDeposit(tc.delegatorAddr, tc.amount) 158 if tc.expectPass { 159 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 160 checkMsg(t, msg, "deposit") 161 } else { 162 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 163 } 164 } 165 } 166 167 // test ValidateBasic for MsgWithdraw 168 func TestMsgWithdraw(t *testing.T) { 169 170 coinPos := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(1000)) 171 coinNeg := sdk.SysCoin{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(-1)} 172 173 tests := []struct { 174 name string 175 delegatorAddr sdk.AccAddress 176 amount sdk.SysCoin 177 expectPass bool 178 }{ 179 {"basic good", dlgAddr1, coinPos, true}, 180 {"empty delegator", sdk.AccAddress(emptyAddr), coinPos, false}, 181 {"negative bond", sdk.AccAddress(addr1), coinNeg, false}, 182 } 183 184 for _, tc := range tests { 185 msg := NewMsgWithdraw(tc.delegatorAddr, tc.amount) 186 if tc.expectPass { 187 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 188 checkMsg(t, msg, "withdraw") 189 } else { 190 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 191 } 192 } 193 } 194 195 // test ValidateBasic for MsgDestroyValidator 196 func TestMsgBindProxy(t *testing.T) { 197 198 tests := []struct { 199 name string 200 dlgAddr sdk.AccAddress 201 valAddr sdk.AccAddress 202 expectPass bool 203 }{ 204 {"basic good", dlgAddr1, dlgAddr2, true}, 205 {"empty delegator", emptyAddr.Bytes(), dlgAddr2, false}, 206 {"bind to self", dlgAddr1, dlgAddr1, false}, 207 } 208 209 for _, tc := range tests { 210 msg := NewMsgBindProxy(tc.dlgAddr, tc.valAddr) 211 if tc.expectPass { 212 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 213 checkMsg(t, msg, "bind_proxy") 214 } else { 215 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 216 } 217 } 218 } 219 220 // test TestMsgUnbindProxy for MsgDestroyValidator 221 func TestMsgUnbindProxy(t *testing.T) { 222 223 tests := []struct { 224 name string 225 valAddr sdk.AccAddress 226 expectPass bool 227 }{ 228 {"basic good", dlgAddr1, true}, 229 {"empty validator", sdk.AccAddress(emptyAddr), false}, 230 } 231 232 for _, tc := range tests { 233 msg := NewMsgUnbindProxy(tc.valAddr) 234 if tc.expectPass { 235 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 236 checkMsg(t, msg, "unbind_proxy") 237 } else { 238 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 239 } 240 } 241 } 242 243 func TestMsgRegProxy(t *testing.T) { 244 245 tests := []struct { 246 name string 247 dlgAddr sdk.AccAddress 248 doReg bool 249 expectPass bool 250 }{ 251 {"success register", dlgAddr1, true, true}, 252 {"success unregister", dlgAddr1, false, true}, 253 {"empty delegator", sdk.AccAddress(emptyAddr), true, false}, 254 } 255 256 for _, tc := range tests { 257 msg := NewMsgRegProxy(tc.dlgAddr, tc.doReg) 258 if tc.expectPass { 259 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 260 checkMsg(t, msg, "reg_or_unreg_proxy") 261 } else { 262 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 263 } 264 } 265 266 } 267 268 func TestMsgAddShares(t *testing.T) { 269 270 tests := []struct { 271 name string 272 dlgAddr sdk.AccAddress 273 valAddrs []sdk.ValAddress 274 expectPass bool 275 }{ 276 {"basic good", dlgAddr1, []sdk.ValAddress{valAddr1}, true}, 277 {"basic good2", dlgAddr1, []sdk.ValAddress{valAddr1, valAddr2}, true}, 278 {"duplicate", dlgAddr1, []sdk.ValAddress{valAddr1, valAddr2, valAddr1}, false}, 279 {"empty validator", dlgAddr1, nil, false}, 280 {"empty delegator", nil, []sdk.ValAddress{valAddr1}, false}, 281 } 282 283 for _, tc := range tests { 284 msg := NewMsgAddShares(tc.dlgAddr, tc.valAddrs) 285 if tc.expectPass { 286 require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 287 checkMsg(t, msg, "add_shares_to_validators") 288 } else { 289 require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 290 } 291 } 292 293 } 294 295 //// test ValidateBasic for MsgUnbond 296 //func TestMsgBeginRedelegate(t *testing.T) { 297 // tests := []struct { 298 // name string 299 // delegatorAddr sdk.AccAddress 300 // validatorSrcAddr sdk.ValAddress 301 // validatorDstAddr sdk.ValAddress 302 // amount sdk.Coin 303 // expectPass bool 304 // }{ 305 // {"regular", sdk.AccAddress(addr1), addr2, addr3, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), true}, 306 // {"zero amount", sdk.AccAddress(addr1), addr2, addr3, sdk.NewInt64Coin(sdk.DefaultBondDenom, 0), false}, 307 // {"empty delegator", sdk.AccAddress(emptyAddr), addr1, addr3, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false}, 308 // {"empty source validator", sdk.AccAddress(addr1), emptyAddr, addr3, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false}, 309 // {"empty destination validator", sdk.AccAddress(addr1), addr2, emptyAddr, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false}, 310 // } 311 // 312 // for _, tc := range tests { 313 // msg := NewMsgBeginRedelegate(tc.delegatorAddr, tc.validatorSrcAddr, tc.validatorDstAddr, tc.amount) 314 // if tc.expectPass { 315 // require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 316 // } else { 317 // require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 318 // } 319 // } 320 //} 321 // 322 //// test ValidateBasic for MsgUnbond 323 //func TestMsgUndelegate(t *testing.T) { 324 // tests := []struct { 325 // name string 326 // delegatorAddr sdk.AccAddress 327 // validatorAddr sdk.ValAddress 328 // amount sdk.Coin 329 // expectPass bool 330 // }{ 331 // {"regular", sdk.AccAddress(addr1), addr2, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), true}, 332 // {"zero amount", sdk.AccAddress(addr1), addr2, sdk.NewInt64Coin(sdk.DefaultBondDenom, 0), false}, 333 // {"empty delegator", sdk.AccAddress(emptyAddr), addr1, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false}, 334 // {"empty validator", sdk.AccAddress(addr1), emptyAddr, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false}, 335 // } 336 // 337 // for _, tc := range tests { 338 // msg := NewMsgUndelegate(tc.delegatorAddr, tc.validatorAddr, tc.amount) 339 // if tc.expectPass { 340 // require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) 341 // } else { 342 // require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) 343 // } 344 // } 345 //}