From 24bc89183efec81563c6f48cffdec5758eb16acc Mon Sep 17 00:00:00 2001 From: SaReN Date: Tue, 18 Aug 2020 03:02:16 +0530 Subject: [PATCH] Fix add-genesis-account in simd (#7069) * Update genaccounts to use encoding/json * Fix add genesis accounts * Add test for genaccounts * Code cleanup --- simapp/simd/cmd/genaccounts.go | 5 +- simapp/simd/cmd/genaccounts_test.go | 88 ++++++++++++++++++++++++++++ x/genutil/client/cli/gentx_test.go | 7 ++- x/genutil/client/cli/init_test.go | 41 +++---------- x/genutil/client/cli/migrate.go | 10 ++-- x/genutil/client/cli/migrate_test.go | 9 +-- x/genutil/client/testutil/helpers.go | 53 +++++++++++++++++ 7 files changed, 166 insertions(+), 47 deletions(-) create mode 100644 simapp/simd/cmd/genaccounts_test.go create mode 100644 x/genutil/client/testutil/helpers.go diff --git a/simapp/simd/cmd/genaccounts.go b/simapp/simd/cmd/genaccounts.go index 00dbe6621..67ffb88e2 100644 --- a/simapp/simd/cmd/genaccounts.go +++ b/simapp/simd/cmd/genaccounts.go @@ -2,6 +2,7 @@ package cmd import ( "bufio" + "encoding/json" "errors" "fmt" @@ -140,7 +141,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa } authGenState.Accounts = genAccs - authGenStateBz, err := cdc.MarshalJSON(authGenState) + authGenStateBz, err := cdc.MarshalJSON(&authGenState) if err != nil { return fmt.Errorf("failed to marshal auth genesis state: %w", err) } @@ -158,7 +159,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa appState[banktypes.ModuleName] = bankGenStateBz - appStateJSON, err := cdc.MarshalJSON(appState) + appStateJSON, err := json.Marshal(appState) if err != nil { return fmt.Errorf("failed to marshal application genesis state: %w", err) } diff --git a/simapp/simd/cmd/genaccounts_test.go b/simapp/simd/cmd/genaccounts_test.go new file mode 100644 index 000000000..da980b7be --- /dev/null +++ b/simapp/simd/cmd/genaccounts_test.go @@ -0,0 +1,88 @@ +package cmd_test + +import ( + "context" + "fmt" + "testing" + + "github.com/spf13/viper" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/simapp" + simcmd "github.com/cosmos/cosmos-sdk/simapp/simd/cmd" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" +) + +var testMbm = module.NewBasicManager(genutil.AppModuleBasic{}) + +func TestAddGenesisAccountCmd(t *testing.T) { + _, _, addr1 := testdata.KeyTestPubAddr() + tests := []struct { + name string + addr string + denom string + expectErr bool + }{ + { + name: "invalid address", + addr: "", + denom: "1000atom", + expectErr: true, + }, + { + name: "valid address", + addr: addr1.String(), + denom: "1000atom", + expectErr: false, + }, + { + name: "multiple denoms", + addr: addr1.String(), + denom: "1000atom, 2000stake", + expectErr: false, + }, + } + + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + home, cleanup := testutil.NewTestCaseDir(t) + defer cleanup() + + logger := log.NewNopLogger() + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) + require.NoError(t, err) + + appCodec, _ := simapp.MakeCodecs() + err = genutiltest.ExecInitCmd(testMbm, home, appCodec) + require.NoError(t, err) + + serverCtx := server.NewContext(viper.New(), cfg, logger) + clientCtx := client.Context{}.WithJSONMarshaler(appCodec).WithHomeDir(home) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd := simcmd.AddGenesisAccountCmd(home) + cmd.SetArgs([]string{ + tc.addr, + tc.denom, + fmt.Sprintf("--%s=home", flags.FlagHome)}) + + if tc.expectErr { + require.Error(t, cmd.ExecuteContext(ctx)) + } else { + require.NoError(t, cmd.ExecuteContext(ctx)) + } + }) + } +} diff --git a/x/genutil/client/cli/gentx_test.go b/x/genutil/client/cli/gentx_test.go index 3153afb39..eeadcde28 100644 --- a/x/genutil/client/cli/gentx_test.go +++ b/x/genutil/client/cli/gentx_test.go @@ -1,4 +1,4 @@ -package cli +package cli_test import ( "context" @@ -17,6 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -51,7 +52,7 @@ func (s *IntegrationTestSuite) TestGenTxCmd() { dir, clean := testutil.NewTestCaseDir(s.T()) defer clean() - cmd := GenTxCmd( + cmd := cli.GenTxCmd( simapp.ModuleBasics, val.ClientCtx.TxConfig, banktypes.GenesisBalancesIterator{}, val.ClientCtx.HomeDir) @@ -63,7 +64,7 @@ func (s *IntegrationTestSuite) TestGenTxCmd() { genTxFile := filepath.Join(dir, "myTx") cmd.SetArgs([]string{ - fmt.Sprintf("--%s=%s", flagChainID, s.network.Config.ChainID), + fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), val.Moniker, }) diff --git a/x/genutil/client/cli/init_test.go b/x/genutil/client/cli/init_test.go index a0e2bc5f1..4cba36598 100644 --- a/x/genutil/client/cli/init_test.go +++ b/x/genutil/client/cli/init_test.go @@ -1,4 +1,4 @@ -package cli +package cli_test import ( "bytes" @@ -12,7 +12,6 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" abci_server "github.com/tendermint/tendermint/abci/server" - tmcfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/log" @@ -25,22 +24,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/genutil" + genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" ) var testMbm = module.NewBasicManager(genutil.AppModuleBasic{}) -func createDefaultTendermintConfig(rootDir string) (*tmcfg.Config, error) { - conf := tmcfg.DefaultConfig() - conf.SetRoot(rootDir) - tmcfg.EnsureRoot(rootDir) - - if err := conf.ValidateBasic(); err != nil { - return nil, fmt.Errorf("error in config file: %v", err) - } - - return conf, nil -} - func TestInitCmd(t *testing.T) { tests := []struct { name string @@ -68,7 +57,7 @@ func TestInitCmd(t *testing.T) { defer cleanup() logger := log.NewNopLogger() - cfg, err := createDefaultTendermintConfig(home) + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) serverCtx := server.NewContext(viper.New(), cfg, logger) @@ -78,7 +67,7 @@ func TestInitCmd(t *testing.T) { ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) - cmd := InitCmd(testMbm, home) + cmd := genutilcli.InitCmd(testMbm, home) cmd.SetArgs( tt.flags(home), ) @@ -106,7 +95,7 @@ func TestEmptyState(t *testing.T) { t.Cleanup(cleanup) logger := log.NewNopLogger() - cfg, err := createDefaultTendermintConfig(home) + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) serverCtx := server.NewContext(viper.New(), cfg, logger) @@ -116,7 +105,7 @@ func TestEmptyState(t *testing.T) { ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) - cmd := InitCmd(testMbm, home) + cmd := genutilcli.InitCmd(testMbm, home) cmd.SetArgs([]string{"appnode-test", fmt.Sprintf("--%s=%s", cli.HomeFlag, home)}) require.NoError(t, cmd.ExecuteContext(ctx)) @@ -153,21 +142,9 @@ func TestStartStandAlone(t *testing.T) { t.Cleanup(setupClientHome(t)) logger := log.NewNopLogger() - cfg, err := createDefaultTendermintConfig(home) + err := genutiltest.ExecInitCmd(testMbm, home, makeCodec()) require.NoError(t, err) - serverCtx := server.NewContext(viper.New(), cfg, logger) - clientCtx := client.Context{}.WithJSONMarshaler(makeCodec()).WithHomeDir(home) - - ctx := context.Background() - ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) - ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) - - cmd := InitCmd(testMbm, home) - cmd.SetArgs([]string{"appnode-test"}) - - require.NoError(t, cmd.ExecuteContext(ctx)) - app, err := mock.NewApp(home, logger) require.NoError(t, err) @@ -191,7 +168,7 @@ func TestStartStandAlone(t *testing.T) { func TestInitNodeValidatorFiles(t *testing.T) { home, cleanup := testutil.NewTestCaseDir(t) - cfg, err := createDefaultTendermintConfig(home) + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) t.Cleanup(cleanup) nodeID, valPubKey, err := genutil.InitializeNodeValidatorFiles(cfg) require.Nil(t, err) diff --git a/x/genutil/client/cli/migrate.go b/x/genutil/client/cli/migrate.go index 9c133e852..675e55c7c 100644 --- a/x/genutil/client/cli/migrate.go +++ b/x/genutil/client/cli/migrate.go @@ -11,6 +11,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" v036 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_36" @@ -20,10 +21,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil/types" ) -const ( - flagGenesisTime = "genesis-time" - flagChainID = "chain-id" -) +const flagGenesisTime = "genesis-time" // Allow applications to extend and modify the migration process. // @@ -111,7 +109,7 @@ $ %s migrate v0.36 /path/to/genesis.json --chain-id=cosmoshub-3 --genesis-time=2 genDoc.GenesisTime = t } - chainID, _ := cmd.Flags().GetString(flagChainID) + chainID, _ := cmd.Flags().GetString(flags.FlagChainID) if chainID != "" { genDoc.ChainID = chainID } @@ -132,7 +130,7 @@ $ %s migrate v0.36 /path/to/genesis.json --chain-id=cosmoshub-3 --genesis-time=2 } cmd.Flags().String(flagGenesisTime, "", "override genesis_time with this flag") - cmd.Flags().String(flagChainID, "", "override chain_id with this flag") + cmd.Flags().String(flags.FlagChainID, "", "override chain_id with this flag") return cmd } diff --git a/x/genutil/client/cli/migrate_test.go b/x/genutil/client/cli/migrate_test.go index d5d35754e..941721d22 100644 --- a/x/genutil/client/cli/migrate_test.go +++ b/x/genutil/client/cli/migrate_test.go @@ -1,4 +1,4 @@ -package cli +package cli_test import ( "context" @@ -10,11 +10,12 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" ) func TestGetMigrationCallback(t *testing.T) { - for _, version := range GetMigrationVersions() { - require.NotNil(t, GetMigrationCallback(version)) + for _, version := range cli.GetMigrationVersions() { + require.NotNil(t, cli.GetMigrationCallback(version)) } } @@ -27,7 +28,7 @@ func TestMigrateGenesis(t *testing.T) { genesisPath := path.Join(home, "genesis.json") target := "v0.36" - cmd := MigrateGenesisCmd() + cmd := cli.MigrateGenesisCmd() _ = testutil.ApplyMockIODiscardOutErr(cmd) clientCtx := client.Context{}.WithJSONMarshaler(cdc) diff --git a/x/genutil/client/testutil/helpers.go b/x/genutil/client/testutil/helpers.go new file mode 100644 index 000000000..1fc4affb7 --- /dev/null +++ b/x/genutil/client/testutil/helpers.go @@ -0,0 +1,53 @@ +package testutil + +import ( + "context" + "fmt" + + "github.com/spf13/viper" + tmcfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/types/module" + genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" +) + +func ExecInitCmd(testMbm module.BasicManager, home string, cdc codec.JSONMarshaler) error { + logger := log.NewNopLogger() + cfg, err := CreateDefaultTendermintConfig(home) + if err != nil { + return err + } + + cmd := genutilcli.InitCmd(testMbm, home) + serverCtx := server.NewContext(viper.New(), cfg, logger) + clientCtx := client.Context{}.WithJSONMarshaler(cdc).WithHomeDir(home) + + _, out := testutil.ApplyMockIO(cmd) + clientCtx = clientCtx.WithOutput(out) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd.SetArgs([]string{"appnode-test", fmt.Sprintf("--%s=%s", cli.HomeFlag, home)}) + + return cmd.ExecuteContext(ctx) +} + +func CreateDefaultTendermintConfig(rootDir string) (*tmcfg.Config, error) { + conf := tmcfg.DefaultConfig() + conf.SetRoot(rootDir) + tmcfg.EnsureRoot(rootDir) + + if err := conf.ValidateBasic(); err != nil { + return nil, fmt.Errorf("error in config file: %v", err) + } + + return conf, nil +}