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  }