github.com/Finschia/finschia-sdk@v0.49.1/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/Finschia/ostracon/libs/cli" 14 "github.com/stretchr/testify/require" 15 16 "github.com/Finschia/finschia-sdk/client" 17 "github.com/Finschia/finschia-sdk/client/flags" 18 "github.com/Finschia/finschia-sdk/crypto/hd" 19 "github.com/Finschia/finschia-sdk/crypto/keyring" 20 "github.com/Finschia/finschia-sdk/testutil" 21 sdk "github.com/Finschia/finschia-sdk/types" 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("home").PersistentFlags()) 42 43 // Prepare a keybase 44 kbHome := t.TempDir() 45 46 clientCtx := client.Context{}.WithKeyringDir(kbHome) 47 ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx) 48 49 cmd.SetArgs([]string{ 50 "keyname1", 51 fmt.Sprintf("--%s=true", flags.FlagUseLedger), 52 fmt.Sprintf("--%s=0", flagAccount), 53 fmt.Sprintf("--%s=0", flagIndex), 54 fmt.Sprintf("--%s=330", flagCoinType), 55 fmt.Sprintf("--%s=%s", cli.OutputFlag, OutputFormatText), 56 fmt.Sprintf("--%s=%s", flags.FlagKeyAlgorithm, string(hd.Secp256k1Type)), 57 fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), 58 }) 59 60 mockIn := testutil.ApplyMockIODiscardOutErr(cmd) 61 mockIn.Reset("test1234\ntest1234\n") 62 require.NoError(t, cmd.ExecuteContext(ctx)) 63 64 // Now check that it has been stored properly 65 kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn) 66 require.NoError(t, err) 67 require.NotNil(t, kb) 68 t.Cleanup(func() { 69 _ = kb.Delete("keyname1") 70 }) 71 mockIn.Reset("test1234\n") 72 key1, err := kb.Key("keyname1") 73 require.NoError(t, err) 74 require.NotNil(t, key1) 75 76 require.Equal(t, "keyname1", key1.GetName()) 77 require.Equal(t, keyring.TypeLedger, key1.GetType()) 78 require.Equal(t, 79 "PubKeySecp256k1{03028F0D5A9FD41600191CDEFDEA05E77A68DFBCE286241C0190805B9346667D07}", 80 key1.GetPubKey().String()) 81 82 config.SetPurpose(44) 83 config.SetCoinType(438) 84 config.SetBech32PrefixForAccount(sdk.Bech32PrefixAccAddr, sdk.Bech32PrefixAccPub) 85 config.SetBech32PrefixForValidator(sdk.Bech32PrefixValAddr, sdk.Bech32PrefixValPub) 86 config.SetBech32PrefixForConsensusNode(sdk.Bech32PrefixConsAddr, sdk.Bech32PrefixConsPub) 87 } 88 89 func Test_runAddCmdLedger(t *testing.T) { 90 cmd := AddKeyCommand() 91 cmd.Flags().AddFlagSet(Commands("home").PersistentFlags()) 92 93 mockIn := testutil.ApplyMockIODiscardOutErr(cmd) 94 kbHome := t.TempDir() 95 96 clientCtx := client.Context{}.WithKeyringDir(kbHome) 97 ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx) 98 99 cmd.SetArgs([]string{ 100 "keyname1", 101 fmt.Sprintf("--%s=true", flags.FlagUseLedger), 102 fmt.Sprintf("--%s=%s", cli.OutputFlag, OutputFormatText), 103 fmt.Sprintf("--%s=%s", flags.FlagKeyAlgorithm, string(hd.Secp256k1Type)), 104 fmt.Sprintf("--%s=%d", flagCoinType, sdk.CoinType), 105 fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), 106 }) 107 mockIn.Reset("test1234\ntest1234\n") 108 109 require.NoError(t, cmd.ExecuteContext(ctx)) 110 111 // Now check that it has been stored properly 112 kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn) 113 require.NoError(t, err) 114 require.NotNil(t, kb) 115 t.Cleanup(func() { 116 _ = kb.Delete("keyname1") 117 }) 118 119 mockIn.Reset("test1234\n") 120 key1, err := kb.Key("keyname1") 121 require.NoError(t, err) 122 require.NotNil(t, key1) 123 124 require.Equal(t, "keyname1", key1.GetName()) 125 require.Equal(t, keyring.TypeLedger, key1.GetType()) 126 require.Equal(t, 127 "PubKeySecp256k1{02BCD96CAB102304AC10E90C5A0F29358E3A4A6FB1217B83E5DB657918EA28BEC1}", 128 key1.GetPubKey().String()) 129 } 130 131 func Test_runAddCmdLedgerDryRun(t *testing.T) { 132 testData := []struct { 133 name string 134 args []string 135 added bool 136 }{ 137 { 138 name: "ledger account is added", 139 args: []string{ 140 "testkey", 141 fmt.Sprintf("--%s=%s", flags.FlagDryRun, "false"), 142 fmt.Sprintf("--%s=%s", flags.FlagUseLedger, "true"), 143 }, 144 added: true, 145 }, 146 { 147 name: "ledger account is not added with dry run", 148 args: []string{ 149 "testkey", 150 fmt.Sprintf("--%s=%s", flags.FlagDryRun, "true"), 151 fmt.Sprintf("--%s=%s", flags.FlagUseLedger, "true"), 152 }, 153 added: false, 154 }, 155 } 156 for _, tt := range testData { 157 t.Run(tt.name, func(t *testing.T) { 158 cmd := AddKeyCommand() 159 cmd.Flags().AddFlagSet(Commands("home").PersistentFlags()) 160 161 kbHome := t.TempDir() 162 mockIn := testutil.ApplyMockIODiscardOutErr(cmd) 163 kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn) 164 require.NoError(t, err) 165 166 clientCtx := client.Context{}. 167 WithKeyringDir(kbHome). 168 WithKeyring(kb) 169 ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx) 170 171 b := bytes.NewBufferString("") 172 cmd.SetOut(b) 173 174 cmd.SetArgs(tt.args) 175 require.NoError(t, cmd.ExecuteContext(ctx)) 176 177 if tt.added { 178 _, err = kb.Key("testkey") 179 require.NoError(t, err) 180 181 out, err := io.ReadAll(b) 182 require.NoError(t, err) 183 require.Contains(t, string(out), "name: testkey") 184 } else { 185 _, err = kb.Key("testkey") 186 require.Error(t, err) 187 require.Equal(t, "testkey.info: key not found", err.Error()) 188 } 189 }) 190 } 191 }