github.com/cosmos/cosmos-sdk@v0.50.10/x/group/genesis_test.go (about) 1 package group 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" 10 sdk "github.com/cosmos/cosmos-sdk/types" 11 banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" 12 ) 13 14 var ( 15 memberPub = secp256k1.GenPrivKey().PubKey() 16 accPub = secp256k1.GenPrivKey().PubKey() 17 accAddr = sdk.AccAddress(accPub.Address()) 18 memberAddr = sdk.AccAddress(memberPub.Address()) 19 ) 20 21 func TestGenesisStateValidate(t *testing.T) { 22 submittedAt := time.Now().UTC() 23 timeout := submittedAt.Add(time.Second * 1).UTC() 24 25 groupPolicy := &GroupPolicyInfo{ 26 Address: accAddr.String(), 27 GroupId: 1, 28 Admin: accAddr.String(), 29 Version: 1, 30 Metadata: "policy metadata", 31 } 32 err := groupPolicy.SetDecisionPolicy(&ThresholdDecisionPolicy{ 33 Threshold: "1", 34 Windows: &DecisionPolicyWindows{ 35 VotingPeriod: time.Second, 36 }, 37 }) 38 require.NoError(t, err) 39 40 // create another group policy to set invalid decision policy for testing 41 groupPolicy2 := &GroupPolicyInfo{ 42 Address: accAddr.String(), 43 GroupId: 1, 44 Admin: accAddr.String(), 45 Version: 1, 46 Metadata: "policy metadata", 47 } 48 err = groupPolicy2.SetDecisionPolicy(&ThresholdDecisionPolicy{ 49 Threshold: "1", 50 Windows: &DecisionPolicyWindows{ 51 VotingPeriod: 0, 52 }, 53 }) 54 require.NoError(t, err) 55 56 proposal := &Proposal{ 57 Id: 1, 58 GroupPolicyAddress: accAddr.String(), 59 Metadata: "proposal metadata", 60 GroupVersion: 1, 61 GroupPolicyVersion: 1, 62 Proposers: []string{ 63 memberAddr.String(), 64 }, 65 SubmitTime: submittedAt, 66 Status: PROPOSAL_STATUS_ACCEPTED, 67 FinalTallyResult: TallyResult{ 68 YesCount: "1", 69 NoCount: "0", 70 AbstainCount: "0", 71 NoWithVetoCount: "0", 72 }, 73 VotingPeriodEnd: timeout, 74 ExecutorResult: PROPOSAL_EXECUTOR_RESULT_SUCCESS, 75 } 76 err = proposal.SetMsgs([]sdk.Msg{&banktypes.MsgSend{ 77 FromAddress: accAddr.String(), 78 ToAddress: memberAddr.String(), 79 Amount: sdk.Coins{sdk.NewInt64Coin("test", 100)}, 80 }}) 81 require.NoError(t, err) 82 83 testCases := []struct { 84 name string 85 genesisState GenesisState 86 expErr bool 87 }{ 88 { 89 "valid genesisState", 90 GenesisState{ 91 GroupSeq: 2, 92 Groups: []*GroupInfo{{Id: 1, Admin: accAddr.String(), Metadata: "1", Version: 1, TotalWeight: "1"}, {Id: 2, Admin: accAddr.String(), Metadata: "2", Version: 2, TotalWeight: "2"}}, 93 GroupMembers: []*GroupMember{{GroupId: 1, Member: &Member{Address: memberAddr.String(), Weight: "1", Metadata: "member metadata"}}, {GroupId: 2, Member: &Member{Address: memberAddr.String(), Weight: "2", Metadata: "member metadata"}}}, 94 GroupPolicySeq: 1, 95 GroupPolicies: []*GroupPolicyInfo{groupPolicy}, 96 ProposalSeq: 1, 97 Proposals: []*Proposal{proposal}, 98 Votes: []*Vote{{ProposalId: proposal.Id, Voter: memberAddr.String(), SubmitTime: submittedAt, Option: VOTE_OPTION_YES}}, 99 }, 100 false, 101 }, 102 { 103 "empty genesisState", 104 GenesisState{}, 105 false, 106 }, 107 { 108 "empty group id", 109 GenesisState{ 110 Groups: []*GroupInfo{ 111 { 112 Id: 0, 113 Admin: accAddr.String(), 114 Metadata: "1", 115 Version: 1, 116 TotalWeight: "1", 117 }, 118 }, 119 }, 120 true, 121 }, 122 { 123 "invalid group admin", 124 GenesisState{ 125 Groups: []*GroupInfo{ 126 { 127 Id: 1, 128 Admin: "invalid admin", 129 Metadata: "1", 130 Version: 1, 131 TotalWeight: "1", 132 }, 133 }, 134 }, 135 true, 136 }, 137 { 138 "invalid group version", 139 GenesisState{ 140 Groups: []*GroupInfo{ 141 { 142 Id: 1, 143 Admin: accAddr.String(), 144 Metadata: "1", 145 Version: 0, 146 TotalWeight: "1", 147 }, 148 }, 149 }, 150 true, 151 }, 152 { 153 "invalid group TotalWeight", 154 GenesisState{ 155 Groups: []*GroupInfo{ 156 { 157 Id: 1, 158 Admin: accAddr.String(), 159 Metadata: "1", 160 Version: 1, 161 TotalWeight: "-1", 162 }, 163 }, 164 }, 165 true, 166 }, 167 { 168 "invalid group policy address", 169 GenesisState{ 170 Groups: []*GroupInfo{ 171 { 172 Id: 1, 173 Admin: accAddr.String(), 174 Metadata: "1", 175 Version: 1, 176 TotalWeight: "1", 177 }, 178 }, 179 GroupPolicies: []*GroupPolicyInfo{ 180 { 181 Address: "invalid address", 182 GroupId: 1, 183 Admin: accAddr.String(), 184 Version: 1, 185 Metadata: "policy metadata", 186 }, 187 }, 188 }, 189 true, 190 }, 191 { 192 "invalid group policy admin", 193 GenesisState{ 194 Groups: []*GroupInfo{ 195 { 196 Id: 1, 197 Admin: accAddr.String(), 198 Metadata: "1", 199 Version: 1, 200 TotalWeight: "1", 201 }, 202 }, 203 GroupPolicies: []*GroupPolicyInfo{ 204 { 205 Address: accAddr.String(), 206 GroupId: 1, 207 Admin: "invalid admin", 208 Version: 1, 209 Metadata: "policy metadata", 210 }, 211 }, 212 }, 213 true, 214 }, 215 { 216 "invalid group policy's group id", 217 GenesisState{ 218 Groups: []*GroupInfo{ 219 { 220 Id: 1, 221 Admin: accAddr.String(), 222 Metadata: "1", 223 Version: 1, 224 TotalWeight: "1", 225 }, 226 }, 227 GroupPolicies: []*GroupPolicyInfo{ 228 { 229 Address: accAddr.String(), 230 GroupId: 0, 231 Admin: accAddr.String(), 232 Version: 1, 233 Metadata: "policy metadata", 234 }, 235 }, 236 }, 237 true, 238 }, 239 { 240 "invalid group policy version", 241 GenesisState{ 242 Groups: []*GroupInfo{ 243 { 244 Id: 1, 245 Admin: accAddr.String(), 246 Metadata: "1", 247 Version: 1, 248 TotalWeight: "1", 249 }, 250 }, 251 GroupPolicies: []*GroupPolicyInfo{ 252 { 253 Address: accAddr.String(), 254 GroupId: 1, 255 Admin: accAddr.String(), 256 Version: 0, 257 Metadata: "policy metadata", 258 }, 259 }, 260 }, 261 true, 262 }, 263 { 264 "invalid group policy's decision policy", 265 GenesisState{ 266 Groups: []*GroupInfo{ 267 { 268 Id: 1, 269 Admin: accAddr.String(), 270 Metadata: "1", 271 Version: 1, 272 TotalWeight: "1", 273 }, 274 }, 275 GroupPolicies: []*GroupPolicyInfo{ 276 { 277 Address: accAddr.String(), 278 GroupId: 1, 279 Admin: accAddr.String(), 280 Version: 1, 281 Metadata: "policy metadata", 282 DecisionPolicy: groupPolicy2.DecisionPolicy, 283 }, 284 }, 285 }, 286 true, 287 }, 288 { 289 "invalid group member's group id", 290 GenesisState{ 291 Groups: []*GroupInfo{ 292 { 293 Id: 1, 294 Admin: accAddr.String(), 295 Metadata: "1", 296 Version: 1, 297 TotalWeight: "1", 298 }, 299 }, 300 GroupMembers: []*GroupMember{ 301 { 302 GroupId: 0, 303 Member: &Member{ 304 Address: memberAddr.String(), 305 Weight: "1", Metadata: "member metadata", 306 }, 307 }, 308 }, 309 }, 310 true, 311 }, 312 { 313 "invalid group member address", 314 GenesisState{ 315 Groups: []*GroupInfo{ 316 { 317 Id: 1, 318 Admin: accAddr.String(), 319 Metadata: "1", 320 Version: 1, 321 TotalWeight: "1", 322 }, 323 }, 324 GroupMembers: []*GroupMember{ 325 { 326 GroupId: 1, 327 Member: &Member{ 328 Address: "invalid address", 329 Weight: "1", Metadata: "member metadata", 330 }, 331 }, 332 }, 333 }, 334 true, 335 }, 336 { 337 "invalid group member weight", 338 GenesisState{ 339 Groups: []*GroupInfo{ 340 { 341 Id: 1, 342 Admin: accAddr.String(), 343 Metadata: "1", 344 Version: 1, 345 TotalWeight: "1", 346 }, 347 }, 348 GroupMembers: []*GroupMember{ 349 { 350 GroupId: 1, 351 Member: &Member{ 352 Address: memberAddr.String(), 353 Weight: "-1", Metadata: "member metadata", 354 }, 355 }, 356 }, 357 }, 358 true, 359 }, 360 { 361 "invalid proposal id", 362 GenesisState{ 363 Groups: []*GroupInfo{ 364 { 365 Id: 1, 366 Admin: accAddr.String(), 367 Metadata: "1", 368 Version: 1, 369 TotalWeight: "1", 370 }, 371 }, 372 GroupPolicies: []*GroupPolicyInfo{ 373 groupPolicy, 374 }, 375 Proposals: []*Proposal{ 376 { 377 Id: 0, 378 GroupPolicyAddress: accAddr.String(), 379 Metadata: "proposal metadata", 380 GroupVersion: 1, 381 GroupPolicyVersion: 1, 382 }, 383 }, 384 }, 385 true, 386 }, 387 { 388 "invalid group policy address of proposal", 389 GenesisState{ 390 Groups: []*GroupInfo{ 391 { 392 Id: 1, 393 Admin: accAddr.String(), 394 Metadata: "1", 395 Version: 1, 396 TotalWeight: "1", 397 }, 398 }, 399 GroupPolicies: []*GroupPolicyInfo{ 400 groupPolicy, 401 }, 402 Proposals: []*Proposal{ 403 { 404 Id: 1, 405 GroupPolicyAddress: "invalid address", 406 Metadata: "proposal metadata", 407 GroupVersion: 1, 408 GroupPolicyVersion: 1, 409 }, 410 }, 411 }, 412 true, 413 }, 414 { 415 "invalid group version of proposal", 416 GenesisState{ 417 Groups: []*GroupInfo{ 418 { 419 Id: 1, 420 Admin: accAddr.String(), 421 Metadata: "1", 422 Version: 1, 423 TotalWeight: "1", 424 }, 425 }, 426 GroupPolicies: []*GroupPolicyInfo{ 427 groupPolicy, 428 }, 429 Proposals: []*Proposal{ 430 { 431 Id: 1, 432 GroupPolicyAddress: accAddr.String(), 433 Metadata: "proposal metadata", 434 GroupVersion: 0, 435 GroupPolicyVersion: 1, 436 }, 437 }, 438 }, 439 true, 440 }, 441 { 442 "invalid group policy version", 443 GenesisState{ 444 Groups: []*GroupInfo{ 445 { 446 Id: 1, 447 Admin: accAddr.String(), 448 Metadata: "1", 449 Version: 1, 450 TotalWeight: "1", 451 }, 452 }, 453 GroupPolicies: []*GroupPolicyInfo{ 454 groupPolicy, 455 }, 456 Proposals: []*Proposal{ 457 { 458 Id: 1, 459 GroupPolicyAddress: accAddr.String(), 460 Metadata: "proposal metadata", 461 GroupVersion: 1, 462 GroupPolicyVersion: 0, 463 }, 464 }, 465 }, 466 true, 467 }, 468 { 469 "invalid FinalTallyResult with negative YesCount", 470 GenesisState{ 471 Groups: []*GroupInfo{ 472 { 473 Id: 1, 474 Admin: accAddr.String(), 475 Metadata: "1", 476 Version: 1, 477 TotalWeight: "1", 478 }, 479 }, 480 GroupPolicies: []*GroupPolicyInfo{ 481 groupPolicy, 482 }, 483 Proposals: []*Proposal{ 484 { 485 Id: 1, 486 GroupPolicyAddress: accAddr.String(), 487 Metadata: "proposal metadata", 488 GroupVersion: 1, 489 GroupPolicyVersion: 1, 490 Proposers: []string{ 491 memberAddr.String(), 492 }, 493 SubmitTime: submittedAt, 494 Status: PROPOSAL_STATUS_ACCEPTED, 495 FinalTallyResult: TallyResult{ 496 YesCount: "-1", 497 NoCount: "0", 498 AbstainCount: "0", 499 NoWithVetoCount: "0", 500 }, 501 }, 502 }, 503 }, 504 true, 505 }, 506 { 507 "invalid FinalTallyResult with negative NoCount", 508 GenesisState{ 509 Groups: []*GroupInfo{ 510 { 511 Id: 1, 512 Admin: accAddr.String(), 513 Metadata: "1", 514 Version: 1, 515 TotalWeight: "1", 516 }, 517 }, 518 GroupPolicies: []*GroupPolicyInfo{ 519 groupPolicy, 520 }, 521 Proposals: []*Proposal{ 522 { 523 Id: 1, 524 GroupPolicyAddress: accAddr.String(), 525 Metadata: "proposal metadata", 526 GroupVersion: 1, 527 GroupPolicyVersion: 1, 528 Proposers: []string{ 529 memberAddr.String(), 530 }, 531 SubmitTime: submittedAt, 532 Status: PROPOSAL_STATUS_ACCEPTED, 533 FinalTallyResult: TallyResult{ 534 YesCount: "0", 535 NoCount: "-1", 536 AbstainCount: "0", 537 NoWithVetoCount: "0", 538 }, 539 }, 540 }, 541 }, 542 true, 543 }, 544 { 545 "invalid FinalTallyResult with negative AbstainCount", 546 GenesisState{ 547 Groups: []*GroupInfo{ 548 { 549 Id: 1, 550 Admin: accAddr.String(), 551 Metadata: "1", 552 Version: 1, 553 TotalWeight: "1", 554 }, 555 }, 556 GroupPolicies: []*GroupPolicyInfo{ 557 groupPolicy, 558 }, 559 Proposals: []*Proposal{ 560 { 561 Id: 1, 562 GroupPolicyAddress: accAddr.String(), 563 Metadata: "proposal metadata", 564 GroupVersion: 1, 565 GroupPolicyVersion: 1, 566 Proposers: []string{ 567 memberAddr.String(), 568 }, 569 SubmitTime: submittedAt, 570 Status: PROPOSAL_STATUS_ACCEPTED, 571 FinalTallyResult: TallyResult{ 572 YesCount: "0", 573 NoCount: "0", 574 AbstainCount: "-1", 575 NoWithVetoCount: "0", 576 }, 577 }, 578 }, 579 }, 580 true, 581 }, 582 { 583 "invalid FinalTallyResult with negative VetoCount", 584 GenesisState{ 585 Groups: []*GroupInfo{ 586 { 587 Id: 1, 588 Admin: accAddr.String(), 589 Metadata: "1", 590 Version: 1, 591 TotalWeight: "1", 592 }, 593 }, 594 GroupPolicies: []*GroupPolicyInfo{ 595 groupPolicy, 596 }, 597 Proposals: []*Proposal{ 598 { 599 Id: 1, 600 GroupPolicyAddress: accAddr.String(), 601 Metadata: "proposal metadata", 602 GroupVersion: 1, 603 GroupPolicyVersion: 1, 604 Proposers: []string{ 605 memberAddr.String(), 606 }, 607 SubmitTime: submittedAt, 608 Status: PROPOSAL_STATUS_ACCEPTED, 609 FinalTallyResult: TallyResult{ 610 YesCount: "0", 611 NoCount: "0", 612 AbstainCount: "0", 613 NoWithVetoCount: "-1", 614 }, 615 }, 616 }, 617 }, 618 true, 619 }, 620 { 621 "invalid voter", 622 GenesisState{ 623 Groups: []*GroupInfo{ 624 { 625 Id: 1, 626 Admin: accAddr.String(), 627 Metadata: "1", 628 Version: 1, 629 TotalWeight: "1", 630 }, 631 }, 632 GroupPolicies: []*GroupPolicyInfo{ 633 groupPolicy, 634 }, 635 Proposals: []*Proposal{ 636 proposal, 637 }, 638 Votes: []*Vote{ 639 { 640 ProposalId: proposal.Id, 641 Voter: "invalid voter", 642 SubmitTime: submittedAt, 643 Option: VOTE_OPTION_YES, 644 }, 645 }, 646 }, 647 true, 648 }, 649 { 650 "invalid proposal id", 651 GenesisState{ 652 Groups: []*GroupInfo{ 653 { 654 Id: 1, 655 Admin: accAddr.String(), 656 Metadata: "1", 657 Version: 1, 658 TotalWeight: "1", 659 }, 660 }, 661 GroupPolicies: []*GroupPolicyInfo{ 662 groupPolicy, 663 }, 664 Proposals: []*Proposal{ 665 proposal, 666 }, 667 Votes: []*Vote{ 668 { 669 ProposalId: 0, 670 Voter: memberAddr.String(), 671 SubmitTime: submittedAt, 672 Option: VOTE_OPTION_YES, 673 }, 674 }, 675 }, 676 true, 677 }, 678 { 679 "vote on proposal that doesn't exist", 680 GenesisState{ 681 Groups: []*GroupInfo{ 682 { 683 Id: 1, 684 Admin: accAddr.String(), 685 Metadata: "1", 686 Version: 1, 687 TotalWeight: "1", 688 }, 689 }, 690 GroupPolicies: []*GroupPolicyInfo{ 691 groupPolicy, 692 }, 693 Proposals: []*Proposal{ 694 proposal, 695 }, 696 Votes: []*Vote{ 697 { 698 ProposalId: 2, 699 Voter: memberAddr.String(), 700 SubmitTime: submittedAt, 701 Option: VOTE_OPTION_YES, 702 }, 703 }, 704 }, 705 true, 706 }, 707 { 708 "invalid vote option", 709 GenesisState{ 710 Groups: []*GroupInfo{ 711 { 712 Id: 1, 713 Admin: accAddr.String(), 714 Metadata: "1", 715 Version: 1, 716 TotalWeight: "1", 717 }, 718 }, 719 GroupPolicies: []*GroupPolicyInfo{ 720 groupPolicy, 721 }, 722 Proposals: []*Proposal{ 723 proposal, 724 }, 725 Votes: []*Vote{ 726 { 727 ProposalId: proposal.Id, 728 Voter: memberAddr.String(), 729 SubmitTime: submittedAt, 730 Option: VOTE_OPTION_UNSPECIFIED, 731 }, 732 }, 733 }, 734 true, 735 }, 736 } 737 for _, tc := range testCases { 738 tc := tc 739 t.Run(tc.name, func(t *testing.T) { 740 err := tc.genesisState.Validate() 741 if tc.expErr { 742 require.Error(t, err) 743 } else { 744 require.NoError(t, err) 745 } 746 }) 747 } 748 }