github.com/Finschia/finschia-sdk@v0.48.1/client/keys/show_test.go (about)

     1  package keys
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/Finschia/finschia-sdk/client"
    11  	"github.com/Finschia/finschia-sdk/client/flags"
    12  	"github.com/Finschia/finschia-sdk/crypto/hd"
    13  	"github.com/Finschia/finschia-sdk/crypto/keyring"
    14  	"github.com/Finschia/finschia-sdk/crypto/keys/multisig"
    15  	"github.com/Finschia/finschia-sdk/crypto/keys/secp256k1"
    16  	cryptotypes "github.com/Finschia/finschia-sdk/crypto/types"
    17  	"github.com/Finschia/finschia-sdk/testutil"
    18  	"github.com/Finschia/finschia-sdk/testutil/testdata"
    19  	sdk "github.com/Finschia/finschia-sdk/types"
    20  )
    21  
    22  func Test_multiSigKey_Properties(t *testing.T) {
    23  	tmpKey1 := secp256k1.GenPrivKeyFromSecret([]byte("mySecret"))
    24  	pk := multisig.NewLegacyAminoPubKey(
    25  		1,
    26  		[]cryptotypes.PubKey{tmpKey1.PubKey()},
    27  	)
    28  	tmp, err := keyring.NewMultiInfo("myMultisig", pk)
    29  	require.NoError(t, err)
    30  	require.Equal(t, "myMultisig", tmp.GetName())
    31  	require.Equal(t, keyring.TypeMulti, tmp.GetType())
    32  	require.Equal(t, "D3923267FA8A3DD367BB768FA8BDC8FF7F89DA3F", tmp.GetPubKey().Address().String())
    33  	require.Equal(t, "link16wfryel63g7axeamw68630wglalcnk3l6vulks", sdk.MustBech32ifyAddressBytes("link", tmp.GetAddress()))
    34  }
    35  
    36  func Test_showKeysCmd(t *testing.T) {
    37  	cmd := ShowKeysCmd()
    38  	require.NotNil(t, cmd)
    39  	require.Equal(t, "false", cmd.Flag(FlagAddress).DefValue)
    40  	require.Equal(t, "false", cmd.Flag(FlagPublicKey).DefValue)
    41  }
    42  
    43  func Test_runShowCmd(t *testing.T) {
    44  	cmd := ShowKeysCmd()
    45  	cmd.Flags().AddFlagSet(Commands("home").PersistentFlags())
    46  	mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
    47  
    48  	kbHome := t.TempDir()
    49  	kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn)
    50  	require.NoError(t, err)
    51  
    52  	clientCtx := client.Context{}.
    53  		WithKeyringDir(kbHome).
    54  		WithKeyring(kb)
    55  	ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
    56  
    57  	cmd.SetArgs([]string{"invalid"})
    58  	require.EqualError(t, cmd.ExecuteContext(ctx), "invalid is not a valid name or address: decoding bech32 failed: invalid bech32 string length 7")
    59  
    60  	cmd.SetArgs([]string{"invalid1", "invalid2"})
    61  	require.EqualError(t, cmd.ExecuteContext(ctx), "invalid1 is not a valid name or address: decoding bech32 failed: invalid separator index 7")
    62  
    63  	fakeKeyName1 := "runShowCmd_Key1"
    64  	fakeKeyName2 := "runShowCmd_Key2"
    65  
    66  	t.Cleanup(func() {
    67  		kb.Delete("runShowCmd_Key1")
    68  		kb.Delete("runShowCmd_Key2")
    69  	})
    70  
    71  	path := hd.NewFundraiserParams(1, sdk.CoinType, 0).String()
    72  	_, err = kb.NewAccount(fakeKeyName1, testdata.TestMnemonic, "", path, hd.Secp256k1)
    73  	require.NoError(t, err)
    74  
    75  	path2 := hd.NewFundraiserParams(1, sdk.CoinType, 1).String()
    76  	_, err = kb.NewAccount(fakeKeyName2, testdata.TestMnemonic, "", path2, hd.Secp256k1)
    77  	require.NoError(t, err)
    78  
    79  	// Now try single key
    80  	cmd.SetArgs([]string{
    81  		fakeKeyName1,
    82  		fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome),
    83  		fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
    84  		fmt.Sprintf("--%s=", FlagBechPrefix),
    85  	})
    86  	require.EqualError(t, cmd.ExecuteContext(ctx), "invalid Bech32 prefix encoding provided: ")
    87  
    88  	cmd.SetArgs([]string{
    89  		fakeKeyName1,
    90  		fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome),
    91  		fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
    92  		fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount),
    93  	})
    94  
    95  	// try fetch by name
    96  	require.NoError(t, cmd.ExecuteContext(ctx))
    97  
    98  	// try fetch by addr
    99  	info, err := kb.Key(fakeKeyName1)
   100  	cmd.SetArgs([]string{
   101  		info.GetAddress().String(),
   102  		fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome),
   103  		fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
   104  		fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount),
   105  	})
   106  
   107  	require.NoError(t, err)
   108  	require.NoError(t, cmd.ExecuteContext(ctx))
   109  
   110  	// Now try multisig key - set bech to acc
   111  	cmd.SetArgs([]string{
   112  		fakeKeyName1, fakeKeyName2,
   113  		fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome),
   114  		fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
   115  		fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount),
   116  		fmt.Sprintf("--%s=0", flagMultiSigThreshold),
   117  	})
   118  	require.EqualError(t, cmd.ExecuteContext(ctx), "threshold must be a positive integer")
   119  
   120  	cmd.SetArgs([]string{
   121  		fakeKeyName1, fakeKeyName2,
   122  		fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome),
   123  		fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
   124  		fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount),
   125  		fmt.Sprintf("--%s=2", flagMultiSigThreshold),
   126  	})
   127  	require.NoError(t, cmd.ExecuteContext(ctx))
   128  
   129  	// Now try multisig key - set bech to acc + threshold=2
   130  	cmd.SetArgs([]string{
   131  		fakeKeyName1, fakeKeyName2,
   132  		fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome),
   133  		fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
   134  		fmt.Sprintf("--%s=acc", FlagBechPrefix),
   135  		fmt.Sprintf("--%s=true", FlagDevice),
   136  		fmt.Sprintf("--%s=2", flagMultiSigThreshold),
   137  	})
   138  	require.EqualError(t, cmd.ExecuteContext(ctx), "the device flag (-d) can only be used for accounts stored in devices")
   139  
   140  	cmd.SetArgs([]string{
   141  		fakeKeyName1, fakeKeyName2,
   142  		fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome),
   143  		fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
   144  		fmt.Sprintf("--%s=val", FlagBechPrefix),
   145  		fmt.Sprintf("--%s=true", FlagDevice),
   146  		fmt.Sprintf("--%s=2", flagMultiSigThreshold),
   147  	})
   148  	require.EqualError(t, cmd.ExecuteContext(ctx), "the device flag (-d) can only be used for accounts")
   149  
   150  	cmd.SetArgs([]string{
   151  		fakeKeyName1, fakeKeyName2,
   152  		fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome),
   153  		fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
   154  		fmt.Sprintf("--%s=val", FlagBechPrefix),
   155  		fmt.Sprintf("--%s=true", FlagDevice),
   156  		fmt.Sprintf("--%s=2", flagMultiSigThreshold),
   157  		fmt.Sprintf("--%s=true", FlagPublicKey),
   158  	})
   159  	require.EqualError(t, cmd.ExecuteContext(ctx), "the device flag (-d) can only be used for addresses not pubkeys")
   160  }
   161  
   162  func Test_validateMultisigThreshold(t *testing.T) {
   163  	type args struct {
   164  		k     int
   165  		nKeys int
   166  	}
   167  	tests := []struct {
   168  		name    string
   169  		args    args
   170  		wantErr bool
   171  	}{
   172  		{"zeros", args{0, 0}, true},
   173  		{"1-0", args{1, 0}, true},
   174  		{"1-1", args{1, 1}, false},
   175  		{"1-2", args{1, 1}, false},
   176  		{"1-2", args{2, 1}, true},
   177  	}
   178  	for _, tt := range tests {
   179  		tt := tt
   180  		t.Run(tt.name, func(t *testing.T) {
   181  			if err := validateMultisigThreshold(tt.args.k, tt.args.nKeys); (err != nil) != tt.wantErr {
   182  				t.Errorf("validateMultisigThreshold() error = %v, wantErr %v", err, tt.wantErr)
   183  			}
   184  		})
   185  	}
   186  }
   187  
   188  func Test_getBechKeyOut(t *testing.T) {
   189  	type args struct {
   190  		bechPrefix string
   191  	}
   192  	tests := []struct {
   193  		name    string
   194  		args    args
   195  		want    bechKeyOutFn
   196  		wantErr bool
   197  	}{
   198  		{"empty", args{""}, nil, true},
   199  		{"wrong", args{"???"}, nil, true},
   200  		{"acc", args{sdk.PrefixAccount}, keyring.MkAccKeyOutput, false},
   201  		{"val", args{sdk.PrefixValidator}, keyring.MkValKeyOutput, false},
   202  		{"cons", args{sdk.PrefixConsensus}, keyring.MkConsKeyOutput, false},
   203  	}
   204  	for _, tt := range tests {
   205  		tt := tt
   206  		t.Run(tt.name, func(t *testing.T) {
   207  			got, err := getBechKeyOut(tt.args.bechPrefix)
   208  			if tt.wantErr {
   209  				require.Error(t, err)
   210  			} else {
   211  				require.NoError(t, err)
   212  				require.NotNil(t, got)
   213  			}
   214  		})
   215  	}
   216  }