github.com/cosmos/cosmos-sdk@v0.50.10/client/keys/add_ledger_test.go (about) 1 //go:build ledger || test_ledger_mock 2 // +build ledger test_ledger_mock 3 4 package keys 5 6 import ( 7 "bytes" 8 "context" 9 "fmt" 10 "io" 11 "testing" 12 13 "github.com/stretchr/testify/require" 14 15 "github.com/cosmos/cosmos-sdk/client" 16 "github.com/cosmos/cosmos-sdk/client/flags" 17 "github.com/cosmos/cosmos-sdk/crypto/hd" 18 "github.com/cosmos/cosmos-sdk/crypto/keyring" 19 "github.com/cosmos/cosmos-sdk/testutil" 20 sdk "github.com/cosmos/cosmos-sdk/types" 21 moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" 22 ) 23 24 func Test_runAddCmdLedgerWithCustomCoinType(t *testing.T) { 25 config := sdk.GetConfig() 26 27 bech32PrefixAccAddr := "terra" 28 bech32PrefixAccPub := "terrapub" 29 bech32PrefixValAddr := "terravaloper" 30 bech32PrefixValPub := "terravaloperpub" 31 bech32PrefixConsAddr := "terravalcons" 32 bech32PrefixConsPub := "terravalconspub" 33 34 config.SetPurpose(44) 35 config.SetCoinType(330) 36 config.SetBech32PrefixForAccount(bech32PrefixAccAddr, bech32PrefixAccPub) 37 config.SetBech32PrefixForValidator(bech32PrefixValAddr, bech32PrefixValPub) 38 config.SetBech32PrefixForConsensusNode(bech32PrefixConsAddr, bech32PrefixConsPub) 39 40 cmd := AddKeyCommand() 41 cmd.Flags().AddFlagSet(Commands().PersistentFlags()) 42 43 // Prepare a keybase 44 kbHome := t.TempDir() 45 46 cdc := moduletestutil.MakeTestEncodingConfig().Codec 47 clientCtx := client.Context{}.WithKeyringDir(kbHome).WithCodec(cdc) 48 ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx) 49 50 cmd.SetArgs([]string{ 51 "keyname1", 52 fmt.Sprintf("--%s=true", flags.FlagUseLedger), 53 fmt.Sprintf("--%s=0", flagAccount), 54 fmt.Sprintf("--%s=0", flagIndex), 55 fmt.Sprintf("--%s=330", flagCoinType), 56 fmt.Sprintf("--%s=%s", flags.FlagOutput, flags.OutputFormatText), 57 fmt.Sprintf("--%s=%s", flags.FlagKeyType, hd.Secp256k1Type), 58 fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), 59 }) 60 61 mockIn := testutil.ApplyMockIODiscardOutErr(cmd) 62 mockIn.Reset("test1234\ntest1234\n") 63 require.NoError(t, cmd.ExecuteContext(ctx)) 64 65 // Now check that it has been stored properly 66 kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn, cdc) 67 require.NoError(t, err) 68 require.NotNil(t, kb) 69 t.Cleanup(func() { 70 _ = kb.Delete("keyname1") 71 }) 72 mockIn.Reset("test1234\n") 73 key1, err := kb.Key("keyname1") 74 require.NoError(t, err) 75 require.NotNil(t, key1) 76 77 require.Equal(t, "keyname1", key1.Name) 78 require.Equal(t, keyring.TypeLedger, key1.GetType()) 79 pub, err := key1.GetPubKey() 80 require.NoError(t, err) 81 require.Equal(t, 82 "PubKeySecp256k1{03028F0D5A9FD41600191CDEFDEA05E77A68DFBCE286241C0190805B9346667D07}", 83 pub.String()) 84 85 config.SetPurpose(44) 86 config.SetCoinType(118) 87 config.SetBech32PrefixForAccount(sdk.Bech32PrefixAccAddr, sdk.Bech32PrefixAccPub) 88 config.SetBech32PrefixForValidator(sdk.Bech32PrefixValAddr, sdk.Bech32PrefixValPub) 89 config.SetBech32PrefixForConsensusNode(sdk.Bech32PrefixConsAddr, sdk.Bech32PrefixConsPub) 90 } 91 92 func Test_runAddCmdLedger(t *testing.T) { 93 cmd := AddKeyCommand() 94 cmd.Flags().AddFlagSet(Commands().PersistentFlags()) 95 96 mockIn := testutil.ApplyMockIODiscardOutErr(cmd) 97 kbHome := t.TempDir() 98 cdc := moduletestutil.MakeTestEncodingConfig().Codec 99 100 clientCtx := client.Context{}.WithKeyringDir(kbHome).WithCodec(cdc) 101 ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx) 102 103 cmd.SetArgs([]string{ 104 "keyname1", 105 fmt.Sprintf("--%s=true", flags.FlagUseLedger), 106 fmt.Sprintf("--%s=%s", flags.FlagOutput, flags.OutputFormatText), 107 fmt.Sprintf("--%s=%s", flags.FlagKeyType, hd.Secp256k1Type), 108 fmt.Sprintf("--%s=%d", flagCoinType, sdk.CoinType), 109 fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), 110 }) 111 mockIn.Reset("test1234\ntest1234\n") 112 113 require.NoError(t, cmd.ExecuteContext(ctx)) 114 115 // Now check that it has been stored properly 116 kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn, cdc) 117 require.NoError(t, err) 118 119 // Now check that it has been stored properly 120 require.NotNil(t, kb) 121 t.Cleanup(func() { 122 _ = kb.Delete("keyname1") 123 }) 124 125 mockIn.Reset("test1234\n") 126 key1, err := kb.Key("keyname1") 127 require.NoError(t, err) 128 require.NotNil(t, key1) 129 130 require.Equal(t, "keyname1", key1.Name) 131 pub, err := key1.GetPubKey() 132 require.NoError(t, err) 133 require.Equal(t, 134 "PubKeySecp256k1{034FEF9CD7C4C63588D3B03FEB5281B9D232CBA34D6F3D71AEE59211FFBFE1FE87}", 135 pub.String()) 136 } 137 138 func Test_runAddCmdLedgerDryRun(t *testing.T) { 139 cdc := moduletestutil.MakeTestEncodingConfig().Codec 140 testData := []struct { 141 name string 142 args []string 143 added bool 144 }{ 145 { 146 name: "ledger account is added", 147 args: []string{ 148 "testkey", 149 fmt.Sprintf("--%s=%s", flags.FlagDryRun, "false"), 150 fmt.Sprintf("--%s=%s", flags.FlagUseLedger, "true"), 151 }, 152 added: true, 153 }, 154 { 155 name: "ledger account is not added with dry run", 156 args: []string{ 157 "testkey", 158 fmt.Sprintf("--%s=%s", flags.FlagDryRun, "true"), 159 fmt.Sprintf("--%s=%s", flags.FlagUseLedger, "true"), 160 }, 161 added: false, 162 }, 163 } 164 165 for _, tt := range testData { 166 tt := tt 167 t.Run(tt.name, func(t *testing.T) { 168 cmd := AddKeyCommand() 169 cmd.Flags().AddFlagSet(Commands().PersistentFlags()) 170 171 kbHome := t.TempDir() 172 mockIn := testutil.ApplyMockIODiscardOutErr(cmd) 173 kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn, cdc) 174 require.NoError(t, err) 175 176 clientCtx := client.Context{}. 177 WithKeyringDir(kbHome). 178 WithKeyring(kb). 179 WithCodec(cdc) 180 ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx) 181 b := bytes.NewBufferString("") 182 cmd.SetOut(b) 183 184 cmd.SetArgs(tt.args) 185 require.NoError(t, cmd.ExecuteContext(ctx)) 186 187 if tt.added { 188 _, err = kb.Key("testkey") 189 require.NoError(t, err) 190 191 out, err := io.ReadAll(b) 192 require.NoError(t, err) 193 require.Contains(t, string(out), "name: testkey") 194 } else { 195 _, err = kb.Key("testkey") 196 require.Error(t, err) 197 require.Equal(t, "testkey.info: key not found", err.Error()) 198 } 199 }) 200 } 201 }