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  }