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  }