github.com/cosmos/cosmos-sdk@v0.50.10/client/keys/migrate_test.go (about)

     1  package keys
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"strings"
     7  	"testing"
     8  
     9  	design99keyring "github.com/99designs/keyring"
    10  	"github.com/stretchr/testify/suite"
    11  
    12  	"github.com/cosmos/cosmos-sdk/client"
    13  	"github.com/cosmos/cosmos-sdk/client/flags"
    14  	"github.com/cosmos/cosmos-sdk/codec"
    15  	"github.com/cosmos/cosmos-sdk/crypto/keyring"
    16  	"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
    17  	"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
    18  	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
    19  	"github.com/cosmos/cosmos-sdk/testutil"
    20  	moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
    21  )
    22  
    23  type setter interface {
    24  	SetItem(item design99keyring.Item) error
    25  }
    26  
    27  type MigrateTestSuite struct {
    28  	suite.Suite
    29  
    30  	dir     string
    31  	appName string
    32  	cdc     codec.Codec
    33  	priv    cryptotypes.PrivKey
    34  	pub     cryptotypes.PubKey
    35  }
    36  
    37  func (s *MigrateTestSuite) SetupSuite() {
    38  	s.dir = s.T().TempDir()
    39  	s.cdc = moduletestutil.MakeTestEncodingConfig().Codec
    40  	s.appName = "cosmos"
    41  	s.priv = cryptotypes.PrivKey(secp256k1.GenPrivKey())
    42  	s.pub = s.priv.PubKey()
    43  }
    44  
    45  func (s *MigrateTestSuite) Test_runListAndShowCmd() {
    46  	// adding LegacyInfo item into keyring
    47  	multi := multisig.NewLegacyAminoPubKey(
    48  		1, []cryptotypes.PubKey{
    49  			s.pub,
    50  		},
    51  	)
    52  	legacyMultiInfo, err := keyring.NewLegacyMultiInfo(s.appName, multi)
    53  	s.Require().NoError(err)
    54  	serializedLegacyMultiInfo := keyring.MarshalInfo(legacyMultiInfo)
    55  
    56  	item := design99keyring.Item{
    57  		Key:         s.appName + ".info",
    58  		Data:        serializedLegacyMultiInfo,
    59  		Description: "SDK keyring version",
    60  	}
    61  
    62  	// run test simd keys list - to see that the migrated key is there
    63  	cmd := ListKeysCmd()
    64  	cmd.Flags().AddFlagSet(Commands().PersistentFlags())
    65  
    66  	mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
    67  	kb, err := keyring.New(s.appName, keyring.BackendTest, s.dir, mockIn, s.cdc)
    68  	s.Require().NoError(err)
    69  
    70  	setter, ok := kb.(setter)
    71  	s.Require().True(ok)
    72  	s.Require().NoError(setter.SetItem(item))
    73  
    74  	clientCtx := client.Context{}.WithKeyring(kb)
    75  	ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
    76  
    77  	cmd.SetArgs([]string{
    78  		fmt.Sprintf("--%s=%s", flags.FlagKeyringDir, s.dir),
    79  		fmt.Sprintf("--%s=false", flagListNames),
    80  	})
    81  
    82  	s.Require().NoError(cmd.ExecuteContext(ctx))
    83  
    84  	// simd show n1 - to see that the migration worked
    85  	cmd = ShowKeysCmd()
    86  	cmd.SetArgs([]string{s.appName})
    87  	clientCtx = clientCtx.WithCodec(s.cdc)
    88  	ctx = context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
    89  	s.Require().NoError(cmd.ExecuteContext(ctx))
    90  }
    91  
    92  func (s *MigrateTestSuite) Test_runMigrateCmdRecord() {
    93  	k, err := keyring.NewLocalRecord("test record", s.priv, s.pub)
    94  	s.Require().NoError(err)
    95  	serializedRecord, err := s.cdc.Marshal(k)
    96  	s.Require().NoError(err)
    97  
    98  	item := design99keyring.Item{
    99  		Key:         s.appName,
   100  		Data:        serializedRecord,
   101  		Description: "SDK kerying version",
   102  	}
   103  
   104  	cmd := MigrateCommand()
   105  	mockIn := strings.NewReader("")
   106  	kb, err := keyring.New(s.appName, keyring.BackendTest, s.dir, mockIn, s.cdc)
   107  	s.Require().NoError(err)
   108  
   109  	setter, ok := kb.(setter)
   110  	s.Require().True(ok)
   111  	s.Require().NoError(setter.SetItem(item))
   112  
   113  	clientCtx := client.Context{}.WithKeyring(kb)
   114  	ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
   115  	s.Require().NoError(cmd.ExecuteContext(ctx))
   116  }
   117  
   118  func (s *MigrateTestSuite) Test_runMigrateCmdLegacyMultiInfo() {
   119  	// adding LegacyInfo item into keyring
   120  	multi := multisig.NewLegacyAminoPubKey(
   121  		1, []cryptotypes.PubKey{
   122  			s.pub,
   123  		},
   124  	)
   125  
   126  	legacyMultiInfo, err := keyring.NewLegacyMultiInfo(s.appName, multi)
   127  	s.Require().NoError(err)
   128  	serializedLegacyMultiInfo := keyring.MarshalInfo(legacyMultiInfo)
   129  
   130  	item := design99keyring.Item{
   131  		Key:         s.appName,
   132  		Data:        serializedLegacyMultiInfo,
   133  		Description: "SDK kerying version",
   134  	}
   135  
   136  	cmd := MigrateCommand()
   137  	mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
   138  
   139  	kb, err := keyring.New(s.appName, keyring.BackendTest, s.dir, mockIn, s.cdc)
   140  	s.Require().NoError(err)
   141  
   142  	setter, ok := kb.(setter)
   143  	s.Require().True(ok)
   144  	s.Require().NoError(setter.SetItem(item))
   145  
   146  	clientCtx := client.Context{}.WithKeyring(kb)
   147  	ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
   148  	s.Require().NoError(cmd.ExecuteContext(ctx))
   149  }
   150  
   151  func TestMigrateTestSuite(t *testing.T) {
   152  	suite.Run(t, new(MigrateTestSuite))
   153  }