package testutil import ( "fmt" "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/vesting/client/cli" ) type IntegrationTestSuite struct { suite.Suite cfg network.Config network *network.Network } func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite { return &IntegrationTestSuite{cfg: cfg} } func (s *IntegrationTestSuite) SetupSuite() { s.T().Log("setting up integration test suite") var err error s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg) s.Require().NoError(err) _, err = s.network.WaitForHeight(1) s.Require().NoError(err) } func (s *IntegrationTestSuite) TearDownSuite() { s.T().Log("tearing down integration test suite") s.network.Cleanup() } func (s *IntegrationTestSuite) TestNewMsgCreateVestingAccountCmd() { val := s.network.Validators[0] testCases := map[string]struct { args []string expectErr bool expectedCode uint32 respType proto.Message }{ "create a continuous vesting account": { args: []string{ sdk.AccAddress("addr2_______________").String(), sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String(), "4070908800", fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), }, expectErr: false, expectedCode: 0, respType: &sdk.TxResponse{}, }, "create a delayed vesting account": { args: []string{ sdk.AccAddress("addr3_______________").String(), sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String(), "4070908800", fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address), fmt.Sprintf("--%s=true", cli.FlagDelayed), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), }, expectErr: false, expectedCode: 0, respType: &sdk.TxResponse{}, }, "invalid address": { args: []string{ "addr4", sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String(), "4070908800", fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address), }, expectErr: true, expectedCode: 0, respType: &sdk.TxResponse{}, }, "invalid coins": { args: []string{ sdk.AccAddress("addr4_______________").String(), "fooo", "4070908800", fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address), }, expectErr: true, expectedCode: 0, respType: &sdk.TxResponse{}, }, "invalid end time": { args: []string{ sdk.AccAddress("addr4_______________").String(), sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String(), "-4070908800", fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address), }, expectErr: true, expectedCode: 0, respType: &sdk.TxResponse{}, }, } // Synchronize height between test runs, to ensure sequence numbers are // properly updated. height, err := s.network.LatestHeight() if err != nil { s.T().Fatalf("Getting initial latest height: %v", err) } s.T().Logf("Initial latest height: %d", height) for name, tc := range testCases { tc := tc s.Run(name, func() { clientCtx := val.ClientCtx bw, err := clitestutil.ExecTestCLICmd(clientCtx, cli.NewMsgCreateVestingAccountCmd(), tc.args) if tc.expectErr { s.Require().Error(err) } else { s.Require().NoError(err) s.Require().NoError(clientCtx.Codec.UnmarshalJSON(bw.Bytes(), tc.respType), bw.String()) txResp := tc.respType.(*sdk.TxResponse) s.Require().Equal(tc.expectedCode, txResp.Code) } }) next, err := s.network.WaitForHeight(height + 1) if err != nil { s.T().Fatalf("Waiting for height %d: %v", height+1, err) } height = next s.T().Logf("Height now: %d", height) } } func (s *IntegrationTestSuite) TestNewMsgCreatePermanentLockedAccountCmd() { val := s.network.Validators[0] testCases := map[string]struct { args []string expectErr bool expectedCode uint32 respType proto.Message }{ "create a permanent locked account": { args: []string{ sdk.AccAddress("addr4_______________").String(), sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(100))).String(), fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), }, expectErr: false, expectedCode: 0, respType: &sdk.TxResponse{}, }, "invalid address": { args: []string{ "addr4", sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String(), "4070908800", fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address), }, expectErr: true, expectedCode: 0, respType: &sdk.TxResponse{}, }, "invalid coins": { args: []string{ sdk.AccAddress("addr4_______________").String(), "fooo", "4070908800", fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address), }, expectErr: true, expectedCode: 0, respType: &sdk.TxResponse{}, }, } // Synchronize height between test runs, to ensure sequence numbers are // properly updated. height, err := s.network.LatestHeight() s.Require().NoError(err, "Getting initial latest height") s.T().Logf("Initial latest height: %d", height) for name, tc := range testCases { tc := tc s.Run(name, func() { clientCtx := val.ClientCtx bw, err := clitestutil.ExecTestCLICmd(clientCtx, cli.NewMsgCreatePermanentLockedAccountCmd(), tc.args) if tc.expectErr { s.Require().Error(err) } else { s.Require().NoError(err) s.Require().NoError(clientCtx.Codec.UnmarshalJSON(bw.Bytes(), tc.respType), bw.String()) txResp := tc.respType.(*sdk.TxResponse) s.Require().Equal(tc.expectedCode, txResp.Code) } }) next, err := s.network.WaitForHeight(height + 1) s.Require().NoError(err, "Waiting for height...") height = next s.T().Logf("Height now: %d", height) } }