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 }