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  }