cosmos-sdk/client/keys/migrate_test.go
Andrei Ivasko 6cbbd6da75
refactor!: Keyring migration (#9695)
<!--
The default pull request template is for types feat, fix, or refactor.
For other templates, add one of the following parameters to the url:
- template=docs.md
- template=other.md
-->

## Description

The draft PR #9222 
Closes: #7108

<!-- Add a description of the changes that this PR introduces and the files that
are the most critical to review. -->

- implement proto definition for `Record` 
- rename `Info.go` to `legacyInfo.go` within `keyring` package
- implement CLI `migrate` command that migrates all keys from  legacyInfo to proto according to @robert-zaremba migration [algorithm](https://github.com/cosmos/cosmos-sdk/pull/9222/#discussion_r624683839)
- remove legacy keybase entirely.
- add `Migrate` and `MigrateAll` functions  in `keyring.go` for single key and all keys migration
- add tests
- fix tests

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [x] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [x] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
2021-09-20 12:02:15 +00:00

155 lines
4.2 KiB
Go

package keys
import (
"context"
"fmt"
"strings"
"testing"
design99keyring "github.com/99designs/keyring"
"github.com/stretchr/testify/suite"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
"github.com/cosmos/cosmos-sdk/simapp"
"github.com/cosmos/cosmos-sdk/testutil"
)
type setter interface {
SetItem(item design99keyring.Item) error
}
type MigrateTestSuite struct {
suite.Suite
dir string
appName string
cdc codec.Codec
priv cryptotypes.PrivKey
pub cryptotypes.PubKey
}
func (s *MigrateTestSuite) SetupSuite() {
s.dir = s.T().TempDir()
s.cdc = simapp.MakeTestEncodingConfig().Codec
s.appName = "cosmos"
s.priv = cryptotypes.PrivKey(secp256k1.GenPrivKey())
s.pub = s.priv.PubKey()
}
func (s *MigrateTestSuite) Test_runListAndShowCmd() {
// adding LegacyInfo item into keyring
multi := multisig.NewLegacyAminoPubKey(
1, []cryptotypes.PubKey{
s.pub,
},
)
legacyMultiInfo, err := keyring.NewLegacyMultiInfo(s.appName, multi)
s.Require().NoError(err)
serializedLegacyMultiInfo := keyring.MarshalInfo(legacyMultiInfo)
item := design99keyring.Item{
Key: s.appName,
Data: serializedLegacyMultiInfo,
Description: "SDK kerying version",
}
//run test simd keys list - to see that the migrated key is there
cmd := ListKeysCmd()
cmd.Flags().AddFlagSet(Commands("home").PersistentFlags())
mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
kb, err := keyring.New(s.appName, keyring.BackendTest, s.dir, mockIn, s.cdc)
s.Require().NoError(err)
setter, ok := kb.(setter)
s.Require().True(ok)
s.Require().NoError(setter.SetItem(item))
clientCtx := client.Context{}.WithKeyring(kb)
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
cmd.SetArgs([]string{
fmt.Sprintf("--%s=%s", flags.FlagHome, s.dir),
fmt.Sprintf("--%s=false", flagListNames),
})
s.Require().NoError(cmd.ExecuteContext(ctx))
// simd show n1 - to see that the migration worked
cmd = ShowKeysCmd()
cmd.SetArgs([]string{s.appName})
clientCtx = clientCtx.WithCodec(s.cdc)
ctx = context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
s.Require().NoError(cmd.ExecuteContext(ctx))
}
func (s *MigrateTestSuite) Test_runMigrateCmdRecord() {
k, err := keyring.NewLocalRecord("test record", s.priv, s.pub)
s.Require().NoError(err)
serializedRecord, err := s.cdc.Marshal(k)
s.Require().NoError(err)
item := design99keyring.Item{
Key: s.appName,
Data: serializedRecord,
Description: "SDK kerying version",
}
cmd := MigrateCommand()
mockIn := strings.NewReader("")
kb, err := keyring.New(s.appName, keyring.BackendTest, s.dir, mockIn, s.cdc)
s.Require().NoError(err)
setter, ok := kb.(setter)
s.Require().True(ok)
s.Require().NoError(setter.SetItem(item))
clientCtx := client.Context{}.WithKeyring(kb)
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
s.Require().NoError(cmd.ExecuteContext(ctx))
}
func (s *MigrateTestSuite) Test_runMigrateCmdLegacyMultiInfo() {
// adding LegacyInfo item into keyring
multi := multisig.NewLegacyAminoPubKey(
1, []cryptotypes.PubKey{
s.pub,
},
)
legacyMultiInfo, err := keyring.NewLegacyMultiInfo(s.appName, multi)
s.Require().NoError(err)
serializedLegacyMultiInfo := keyring.MarshalInfo(legacyMultiInfo)
item := design99keyring.Item{
Key: s.appName,
Data: serializedLegacyMultiInfo,
Description: "SDK kerying version",
}
cmd := MigrateCommand()
mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
kb, err := keyring.New(s.appName, keyring.BackendTest, s.dir, mockIn, s.cdc)
s.Require().NoError(err)
setter, ok := kb.(setter)
s.Require().True(ok)
s.Require().NoError(setter.SetItem(item))
clientCtx := client.Context{}.WithKeyring(kb)
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
s.Require().NoError(cmd.ExecuteContext(ctx))
}
func TestMigrateTestSuite(t *testing.T) {
suite.Run(t, new(MigrateTestSuite))
}