Merge PR #3551: Code cleanup, small coverage boost

This commit is contained in:
Alessio Treglia 2019-02-07 14:38:45 -08:00 committed by Jack Zampolin
parent cf238f709a
commit dff6d0e462
4 changed files with 61 additions and 85 deletions

View File

@ -79,6 +79,9 @@ func NewKeyBaseFromDir(rootDir string) (keys.Keybase, error) {
return getLazyKeyBaseFromDir(rootDir)
}
// NewInMemoryKeyBase returns a storage-less keybase.
func NewInMemoryKeyBase() keys.Keybase { return keys.NewInMemory() }
func getLazyKeyBaseFromDir(rootDir string) (keys.Keybase, error) {
return keys.NewLazyKeybase(KeyDBName, filepath.Join(rootDir, "keys")), nil
}

View File

@ -83,6 +83,9 @@ func New(db dbm.DB) Keybase {
}
}
// NewInMemory creates a new keybase on top of in-memory storage instance.
func NewInMemory() Keybase { return dbKeybase{dbm.NewMemDB()} }
// CreateMnemonic generates a new key and persists it to storage, encrypted
// using the provided password.
// It returns the generated mnemonic and the key Info.

View File

@ -1,101 +1,21 @@
package server
import (
"encoding/json"
"errors"
"fmt"
"github.com/tendermint/tendermint/crypto"
dbm "github.com/tendermint/tendermint/libs/db"
"github.com/tendermint/tendermint/types"
"github.com/cosmos/cosmos-sdk/crypto/keys"
tmtypes "github.com/tendermint/tendermint/types"
clkeys "github.com/cosmos/cosmos-sdk/client/keys"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// SimpleGenTx is a simple genesis tx
type SimpleGenTx struct {
Addr sdk.AccAddress `json:"addr"`
}
//_____________________________________________________________________
// Generate a genesis transaction
func SimpleAppGenTx(cdc *codec.Codec, pk crypto.PubKey) (
appGenTx, cliPrint json.RawMessage, validator types.GenesisValidator, err error) {
var addr sdk.AccAddress
var secret string
addr, secret, err = GenerateCoinKey()
if err != nil {
return
}
var bz []byte
simpleGenTx := SimpleGenTx{Addr: addr}
bz, err = cdc.MarshalJSON(simpleGenTx)
if err != nil {
return
}
appGenTx = json.RawMessage(bz)
mm := map[string]string{"secret": secret}
bz, err = cdc.MarshalJSON(mm)
if err != nil {
return
}
cliPrint = json.RawMessage(bz)
validator = tmtypes.GenesisValidator{
PubKey: pk,
Power: 10,
}
return
}
// create the genesis app state
func SimpleAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) (
appState json.RawMessage, err error) {
if len(appGenTxs) != 1 {
err = errors.New("must provide a single genesis transaction")
return
}
var tx SimpleGenTx
err = cdc.UnmarshalJSON(appGenTxs[0], &tx)
if err != nil {
return
}
appState = json.RawMessage(fmt.Sprintf(`{
"accounts": [{
"address": "%s",
"coins": [
{
"denom": "mycoin",
"amount": "9007199254740992"
}
]
}]
}`, tx.Addr))
return
}
//___________________________________________________________________________________________
// GenerateCoinKey returns the address of a public key, along with the secret
// phrase to recover the private key.
func GenerateCoinKey() (sdk.AccAddress, string, error) {
// construct an in-memory key store
keybase := keys.New(
dbm.NewMemDB(),
)
// generate a private key, with recovery phrase
info, secret, err := keybase.CreateMnemonic("name", keys.English, "pass", keys.Secp256k1)
info, secret, err := clkeys.NewInMemoryKeyBase().CreateMnemonic(
"name", keys.English, "pass", keys.Secp256k1)
if err != nil {
return sdk.AccAddress([]byte{}), "", err
}
@ -105,7 +25,8 @@ func GenerateCoinKey() (sdk.AccAddress, string, error) {
// GenerateSaveCoinKey returns the address of a public key, along with the secret
// phrase to recover the private key.
func GenerateSaveCoinKey(clientRoot, keyName, keyPass string, overwrite bool) (sdk.AccAddress, string, error) {
func GenerateSaveCoinKey(clientRoot, keyName, keyPass string,
overwrite bool) (sdk.AccAddress, string, error) {
// get the keystore from the client
keybase, err := clkeys.NewKeyBaseFromDir(clientRoot)
@ -127,6 +48,6 @@ func GenerateSaveCoinKey(clientRoot, keyName, keyPass string, overwrite bool) (s
if err != nil {
return sdk.AccAddress([]byte{}), "", err
}
addr := info.GetPubKey().Address()
return sdk.AccAddress(addr), secret, nil
return sdk.AccAddress(info.GetPubKey().Address()), secret, nil
}

49
server/init_test.go Normal file
View File

@ -0,0 +1,49 @@
package server_test
import (
"io/ioutil"
"os"
"testing"
"github.com/cosmos/cosmos-sdk/client/keys"
"github.com/cosmos/cosmos-sdk/server"
"github.com/stretchr/testify/require"
)
func TestGenerateCoinKey(t *testing.T) {
addr, mnemonic, err := server.GenerateCoinKey()
require.NoError(t, err)
// Test creation
info, err := keys.NewInMemoryKeyBase().CreateAccount("xxx", mnemonic, "", "012345678", 0, 0)
require.NoError(t, err)
require.Equal(t, addr, info.GetAddress())
}
func TestGenerateSaveCoinKey(t *testing.T) {
dir, cleanup := tempdir(t)
defer cleanup() // clean after itself
// Remove the dir to that GenerateSaveCoinKey creates it automatically
os.RemoveAll(dir)
addr, mnemonic, err := server.GenerateSaveCoinKey(dir, "keyname", "012345678", false)
require.NoError(t, err)
// Test key was actually saved
kb, err := keys.NewKeyBaseFromDir(dir)
require.NoError(t, err)
info, err := kb.Get("keyname")
require.NoError(t, err)
require.Equal(t, addr, info.GetAddress())
// Test in-memory recovery
info, err = keys.NewInMemoryKeyBase().CreateAccount("xxx", mnemonic, "", "012345678", 0, 0)
require.NoError(t, err)
require.Equal(t, addr, info.GetAddress())
}
func tempdir(t *testing.T) (string, func()) {
dir, err := ioutil.TempDir("", t.Name()+"_")
require.NoError(t, err)
return dir, func() { os.RemoveAll(dir) }
}