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 }