github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/client/keys/show_test.go (about)

     1  package keys
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/spf13/viper"
     7  	"github.com/stretchr/testify/require"
     8  
     9  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
    10  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/multisig"
    11  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/secp256k1"
    12  
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/crypto/keys"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/tests"
    16  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    17  )
    18  
    19  func Test_multiSigKey_Properties(t *testing.T) {
    20  	tmpKey1 := secp256k1.GenPrivKeySecp256k1([]byte("mySecret"))
    21  	pk := multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{tmpKey1.PubKey()})
    22  	tmp := keys.NewMultiInfo("myMultisig", pk)
    23  
    24  	require.Equal(t, "myMultisig", tmp.GetName())
    25  	require.Equal(t, keys.TypeMulti, tmp.GetType())
    26  	require.Equal(t, "D3923267FA8A3DD367BB768FA8BDC8FF7F89DA3F", tmp.GetPubKey().Address().String())
    27  	require.Equal(t, "cosmos16wfryel63g7axeamw68630wglalcnk3l0zuadc", tmp.GetAddress().String())
    28  }
    29  
    30  func Test_showKeysCmd(t *testing.T) {
    31  	cmd := ShowKeysCmd()
    32  	require.NotNil(t, cmd)
    33  	require.Equal(t, "false", cmd.Flag(FlagAddress).DefValue)
    34  	require.Equal(t, "false", cmd.Flag(FlagPublicKey).DefValue)
    35  }
    36  
    37  func Test_runShowCmd(t *testing.T) {
    38  	runningUnattended := isRunningUnattended()
    39  	cmd := ShowKeysCmd()
    40  	mockIn, _, _ := tests.ApplyMockIO(cmd)
    41  	require.EqualError(t, runShowCmd(cmd, []string{"invalid"}), "The specified item could not be found in the keyring")
    42  	require.EqualError(t, runShowCmd(cmd, []string{"invalid1", "invalid2"}), "The specified item could not be found in the keyring")
    43  
    44  	// Prepare a key base
    45  	// Now add a temporary keybase
    46  	kbHome, cleanUp := tests.NewTestCaseDir(t)
    47  	defer cleanUp()
    48  	viper.Set(flags.FlagHome, kbHome)
    49  
    50  	fakeKeyName1 := "runShowCmd_Key1"
    51  	fakeKeyName2 := "runShowCmd_Key2"
    52  	kb, err := keys.NewKeyring(sdk.KeyringServiceName(), viper.GetString(flags.FlagKeyringBackend), viper.GetString(flags.FlagHome), mockIn)
    53  	require.NoError(t, err)
    54  	defer func() {
    55  		kb.Delete("runShowCmd_Key1", "", false)
    56  		kb.Delete("runShowCmd_Key2", "", false)
    57  	}()
    58  	if runningUnattended {
    59  		mockIn.Reset("testpass1\ntestpass1\n")
    60  	}
    61  	_, err = kb.CreateAccount(fakeKeyName1, tests.TestMnemonic, "", "", sdk.FullFundraiserPath, keys.Secp256k1)
    62  	require.NoError(t, err)
    63  
    64  	if runningUnattended {
    65  		mockIn.Reset("testpass1\n")
    66  	}
    67  	_, err = kb.CreateAccount(fakeKeyName2, tests.TestMnemonic, "", "", "m/44'/118'/0'/0/1", keys.Secp256k1)
    68  	require.NoError(t, err)
    69  
    70  	// Now try single key
    71  	if runningUnattended {
    72  		mockIn.Reset("testpass1\n")
    73  	}
    74  	require.EqualError(t, runShowCmd(cmd, []string{fakeKeyName1}), "invalid Bech32 prefix encoding provided: ")
    75  
    76  	// Now try single key - set bech to acc
    77  	viper.Set(FlagBechPrefix, sdk.PrefixAccount)
    78  	if runningUnattended {
    79  		mockIn.Reset("testpass1\n")
    80  	}
    81  	require.NoError(t, runShowCmd(cmd, []string{fakeKeyName1}))
    82  
    83  	// Now try multisig key - set bech to acc
    84  	viper.Set(FlagBechPrefix, sdk.PrefixAccount)
    85  	if runningUnattended {
    86  		mockIn.Reset("testpass1\ntestpass1\n")
    87  	}
    88  	require.EqualError(t, runShowCmd(cmd, []string{fakeKeyName1, fakeKeyName2}), "threshold must be a positive integer")
    89  
    90  	// Now try multisig key - set bech to acc + threshold=2
    91  	viper.Set(FlagBechPrefix, sdk.PrefixAccount)
    92  	viper.Set(flagMultiSigThreshold, 2)
    93  	if runningUnattended {
    94  		mockIn.Reset("testpass1\ntestpass1\n")
    95  	}
    96  	err = runShowCmd(cmd, []string{fakeKeyName1, fakeKeyName2})
    97  	require.NoError(t, err)
    98  
    99  	// Now try multisig key - set bech to acc + threshold=2
   100  	viper.Set(FlagBechPrefix, "acc")
   101  	viper.Set(FlagDevice, true)
   102  	viper.Set(flagMultiSigThreshold, 2)
   103  	if runningUnattended {
   104  		mockIn.Reset("testpass1\ntestpass1\n")
   105  	}
   106  	err = runShowCmd(cmd, []string{fakeKeyName1, fakeKeyName2})
   107  	require.EqualError(t, err, "the device flag (-d) can only be used for accounts stored in devices")
   108  
   109  	viper.Set(FlagBechPrefix, "val")
   110  	if runningUnattended {
   111  		mockIn.Reset("testpass1\ntestpass1\n")
   112  	}
   113  	err = runShowCmd(cmd, []string{fakeKeyName1, fakeKeyName2})
   114  	require.EqualError(t, err, "the device flag (-d) can only be used for accounts")
   115  
   116  	viper.Set(FlagPublicKey, true)
   117  	if runningUnattended {
   118  		mockIn.Reset("testpass1\ntestpass1\n")
   119  	}
   120  	err = runShowCmd(cmd, []string{fakeKeyName1, fakeKeyName2})
   121  	require.EqualError(t, err, "the device flag (-d) can only be used for addresses not pubkeys")
   122  
   123  	// TODO: Capture stdout and compare
   124  }
   125  
   126  func Test_validateMultisigThreshold(t *testing.T) {
   127  	type args struct {
   128  		k     int
   129  		nKeys int
   130  	}
   131  	tests := []struct {
   132  		name    string
   133  		args    args
   134  		wantErr bool
   135  	}{
   136  		{"zeros", args{0, 0}, true},
   137  		{"1-0", args{1, 0}, true},
   138  		{"1-1", args{1, 1}, false},
   139  		{"1-2", args{1, 1}, false},
   140  		{"1-2", args{2, 1}, true},
   141  	}
   142  	for _, tt := range tests {
   143  		tt := tt
   144  		t.Run(tt.name, func(t *testing.T) {
   145  			if err := validateMultisigThreshold(tt.args.k, tt.args.nKeys); (err != nil) != tt.wantErr {
   146  				t.Errorf("validateMultisigThreshold() error = %v, wantErr %v", err, tt.wantErr)
   147  			}
   148  		})
   149  	}
   150  }
   151  
   152  func Test_getBechKeyOut(t *testing.T) {
   153  	type args struct {
   154  		bechPrefix string
   155  	}
   156  	tests := []struct {
   157  		name    string
   158  		args    args
   159  		want    bechKeyOutFn
   160  		wantErr bool
   161  	}{
   162  		{"empty", args{""}, nil, true},
   163  		{"wrong", args{"???"}, nil, true},
   164  		{"acc", args{sdk.PrefixAccount}, keys.Bech32KeyOutput, false},
   165  		{"val", args{sdk.PrefixValidator}, keys.Bech32ValKeyOutput, false},
   166  		{"cons", args{sdk.PrefixConsensus}, keys.Bech32ConsKeyOutput, false},
   167  	}
   168  	for _, tt := range tests {
   169  		tt := tt
   170  		t.Run(tt.name, func(t *testing.T) {
   171  			got, err := getBechKeyOut(tt.args.bechPrefix)
   172  			if (err != nil) != tt.wantErr {
   173  				t.Errorf("getBechKeyOut() error = %v, wantErr %v", err, tt.wantErr)
   174  				return
   175  			}
   176  
   177  			if !tt.wantErr {
   178  				require.NotNil(t, got)
   179  			}
   180  
   181  			// TODO: Still not possible to compare functions
   182  			// Maybe in next release: https://github.com/stretchr/testify/issues/182
   183  			//if &got != &tt.want {
   184  			//	t.Errorf("getBechKeyOut() = %v, want %v", got, tt.want)
   185  			//}
   186  		})
   187  	}
   188  }