github.com/iotexproject/iotex-core@v1.14.1-rc1/ioctl/newcmd/account/accountimport_test.go (about) 1 // Copyright (c) 2019 IoTeX Foundation 2 // This source code is provided 'as is' and no warranties are given as to title or non-infringement, merchantability 3 // or fitness for purpose and, to the extent permitted by law, all liability for your use of the code is disclaimed. 4 // This source code is governed by Apache License 2.0 that can be found in the LICENSE file. 5 6 package account 7 8 import ( 9 "crypto/ecdsa" 10 "strings" 11 "testing" 12 13 "github.com/golang/mock/gomock" 14 "github.com/iotexproject/go-pkgs/crypto" 15 "github.com/stretchr/testify/require" 16 17 "github.com/iotexproject/iotex-core/ioctl/config" 18 "github.com/iotexproject/iotex-core/ioctl/util" 19 "github.com/iotexproject/iotex-core/test/mock/mock_ioctlclient" 20 ) 21 22 func TestNewAccountImportCmd(t *testing.T) { 23 require := require.New(t) 24 ctrl := gomock.NewController(t) 25 defer ctrl.Finish() 26 client := mock_ioctlclient.NewMockClient(ctrl) 27 client.EXPECT().SelectTranslation(gomock.Any()).Return("key", config.English).AnyTimes() 28 client.EXPECT().Config().Return(config.Config{}).AnyTimes() 29 30 cmd := NewAccountImportCmd(client) 31 _, err := util.ExecuteCmd(cmd, "key", "-h") 32 require.NoError(err) 33 _, err = util.ExecuteCmd(cmd, "hhcmd", "-h") 34 require.Contains(err.Error(), "unknown command") 35 } 36 37 func TestNewAccountImportKeyCmd(t *testing.T) { 38 require := require.New(t) 39 testWallet, ks, _, _, err := newTestAccountWithKeyStore(t, veryLightScryptN, veryLightScryptP) 40 require.NoError(err) 41 42 ctrl := gomock.NewController(t) 43 defer ctrl.Finish() 44 client := mock_ioctlclient.NewMockClient(ctrl) 45 client.EXPECT().SelectTranslation(gomock.Any()).Return("", config.English).AnyTimes() 46 47 prvKey, err := crypto.GenerateKey() 48 require.NoError(err) 49 50 client.EXPECT().ReadSecret().Return(prvKey.HexString(), nil).AnyTimes() 51 client.EXPECT().NewKeyStore().Return(ks).Times(1) 52 client.EXPECT().Config().Return(config.Config{Wallet: testWallet}).Times(1) 53 client.EXPECT().SetAliasAndSave(gomock.Any(), gomock.Any()).Return(nil).Times(1) 54 55 cmd := NewAccountImportKeyCmd(client) 56 result, err := util.ExecuteCmd(cmd, "hhalias") 57 require.NoError(err) 58 require.Contains(result, "hhalias: Enter your private key") 59 } 60 61 func TestNewAccountImportKeyStoreCmd(t *testing.T) { 62 require := require.New(t) 63 testWallet, ks, passwd, _, err := newTestAccountWithKeyStore(t, veryLightScryptN, veryLightScryptP) 64 require.NoError(err) 65 66 ctrl := gomock.NewController(t) 67 defer ctrl.Finish() 68 client := mock_ioctlclient.NewMockClient(ctrl) 69 client.EXPECT().SelectTranslation(gomock.Any()).Return("", config.English).AnyTimes() 70 client.EXPECT().ReadSecret().Return(passwd, nil).AnyTimes() 71 client.EXPECT().NewKeyStore().Return(ks).Times(1) 72 client.EXPECT().Config().Return(config.Config{Wallet: testWallet}).Times(1) 73 client.EXPECT().SetAliasAndSave(gomock.Any(), gomock.Any()).Return(nil).Times(1) 74 75 client.EXPECT().DecryptPrivateKey(gomock.Any(), gomock.Any()).DoAndReturn( 76 func(passwordOfKeyStore, keyStorePath string) (*ecdsa.PrivateKey, error) { 77 sk, err := crypto.GenerateKey() 78 require.NoError(err) 79 p256k1, ok := sk.EcdsaPrivateKey().(*ecdsa.PrivateKey) 80 require.True(ok) 81 return p256k1, nil 82 }) 83 84 cmd := NewAccountImportKeyStoreCmd(client) 85 result, err := util.ExecuteCmd(cmd, "hhalias", testWallet) 86 require.NoError(err) 87 require.Contains(result, "hhalias: Enter your password of keystore") 88 } 89 90 func TestNewAccountImportPemCmd(t *testing.T) { 91 require := require.New(t) 92 testWallet, passwd, _, err := newTestAccount(t) 93 require.NoError(err) 94 95 ctrl := gomock.NewController(t) 96 defer ctrl.Finish() 97 client := mock_ioctlclient.NewMockClient(ctrl) 98 client.EXPECT().SelectTranslation(gomock.Any()).Return("", config.English).AnyTimes() 99 client.EXPECT().Config().Return(config.Config{Wallet: testWallet}).Times(3) 100 101 priKey2, err := crypto.GenerateKeySm2() 102 require.NoError(err) 103 addr2 := priKey2.PublicKey().Address() 104 pemFilePath := sm2KeyPath(client, addr2) 105 require.NoError(crypto.WritePrivateKeyToPem(pemFilePath, priKey2.(*crypto.P256sm2PrvKey), passwd)) 106 107 client.EXPECT().ReadSecret().Return(passwd, nil).AnyTimes() 108 client.EXPECT().SetAliasAndSave(gomock.Any(), gomock.Any()).Return(nil).Times(1) 109 110 cmd := NewAccountImportPemCmd(client) 111 result, err := util.ExecuteCmd(cmd, "hhalias", pemFilePath) 112 require.NoError(err) 113 require.Contains(result, "hhalias: Enter your password of pem file") 114 } 115 116 func TestValidateAlias(t *testing.T) { 117 require := require.New(t) 118 ctrl := gomock.NewController(t) 119 defer ctrl.Finish() 120 client := mock_ioctlclient.NewMockClient(ctrl) 121 client.EXPECT().Config().Return(config.Config{ 122 Aliases: map[string]string{ 123 "aaa": "io1uwnr55vqmhf3xeg5phgurlyl702af6eju542sx", 124 "bbb": "io1uwnr55vqmhf3xeg5phgurlyl702af6eju542s1", 125 }, 126 }).Times(2) 127 128 err := validateAlias(client, "ccc") 129 require.NoError(err) 130 131 err = validateAlias(client, "aaa") 132 require.Contains(err.Error(), `alias "aaa" has already used for`) 133 134 err = validateAlias(client, strings.Repeat("a", 50)) 135 require.Contains(err.Error(), "invalid long alias that is more than 40 characters") 136 }