github.com/cosmos/cosmos-sdk@v0.50.1/crypto/keyring/record_test.go (about)

     1  package keyring
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/suite"
     8  
     9  	"github.com/cosmos/cosmos-sdk/codec"
    10  	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
    11  	"github.com/cosmos/cosmos-sdk/crypto/hd"
    12  	"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
    13  	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
    14  )
    15  
    16  type RecordTestSuite struct {
    17  	suite.Suite
    18  
    19  	appName string
    20  	cdc     codec.Codec
    21  	priv    cryptotypes.PrivKey
    22  	pub     cryptotypes.PubKey
    23  }
    24  
    25  func (s *RecordTestSuite) SetupSuite() {
    26  	s.appName = "cosmos"
    27  	s.cdc = getCodec()
    28  	s.priv = cryptotypes.PrivKey(ed25519.GenPrivKey())
    29  	s.pub = s.priv.PubKey()
    30  }
    31  
    32  func (s *RecordTestSuite) TestOfflineRecordMarshaling() {
    33  	k, err := NewOfflineRecord("testrecord", s.pub)
    34  	s.Require().NoError(err)
    35  
    36  	bz, err := s.cdc.Marshal(k)
    37  	s.Require().NoError(err)
    38  
    39  	var k2 Record
    40  	s.Require().NoError(s.cdc.Unmarshal(bz, &k2))
    41  	s.Require().Equal(k.Name, k2.Name)
    42  	s.Require().True(k.PubKey.Equal(k2.PubKey))
    43  
    44  	pk2, err := k2.GetPubKey()
    45  	s.Require().NoError(err)
    46  	s.Require().True(s.pub.Equals(pk2))
    47  }
    48  
    49  func (s *RecordTestSuite) TestLocalRecordMarshaling() {
    50  	dir := s.T().TempDir()
    51  	mockIn := strings.NewReader("")
    52  
    53  	kb, err := New(s.appName, BackendTest, dir, mockIn, s.cdc)
    54  	s.Require().NoError(err)
    55  
    56  	k, err := NewLocalRecord("testrecord", s.priv, s.pub)
    57  	s.Require().NoError(err)
    58  
    59  	ks, ok := kb.(keystore)
    60  	s.Require().True(ok)
    61  
    62  	bz, err := ks.cdc.Marshal(k)
    63  	s.Require().NoError(err)
    64  
    65  	k2, err := ks.protoUnmarshalRecord(bz)
    66  	s.Require().NoError(err)
    67  	s.Require().Equal(k.Name, k2.Name)
    68  	// not sure if this will work -- we can remove this line, the later check is better.
    69  	s.Require().True(k.PubKey.Equal(k2.PubKey))
    70  
    71  	pub2, err := k2.GetPubKey()
    72  	s.Require().NoError(err)
    73  	s.Require().True(s.pub.Equals(pub2))
    74  
    75  	localRecord2 := k2.GetLocal()
    76  	s.Require().NotNil(localRecord2)
    77  	anyPrivKey, err := codectypes.NewAnyWithValue(s.priv)
    78  	s.Require().NoError(err)
    79  	s.Require().Equal(localRecord2.PrivKey, anyPrivKey)
    80  }
    81  
    82  func (s *RecordTestSuite) TestLedgerRecordMarshaling() {
    83  	dir := s.T().TempDir()
    84  	mockIn := strings.NewReader("")
    85  
    86  	kb, err := New(s.appName, BackendTest, dir, mockIn, s.cdc)
    87  	s.Require().NoError(err)
    88  
    89  	path := hd.NewFundraiserParams(4, 12345, 57)
    90  	k, err := NewLedgerRecord("testrecord", s.pub, path)
    91  	s.Require().NoError(err)
    92  
    93  	ks, ok := kb.(keystore)
    94  	s.Require().True(ok)
    95  
    96  	bz, err := ks.cdc.Marshal(k)
    97  	s.Require().NoError(err)
    98  
    99  	k2, err := ks.protoUnmarshalRecord(bz)
   100  	s.Require().NoError(err)
   101  	s.Require().Equal(k.Name, k2.Name)
   102  	// not sure if this will work -- we can remove this line, the later check is better.
   103  	s.Require().True(k.PubKey.Equal(k2.PubKey))
   104  
   105  	pub2, err := k2.GetPubKey()
   106  	s.Require().NoError(err)
   107  	s.Require().True(s.pub.Equals(pub2))
   108  
   109  	ledgerRecord2 := k2.GetLedger()
   110  	s.Require().NotNil(ledgerRecord2)
   111  	s.Require().Nil(k2.GetLocal())
   112  
   113  	s.Require().Equal(ledgerRecord2.Path.String(), path.String())
   114  }
   115  
   116  func (s *RecordTestSuite) TestExtractPrivKeyFromLocalRecord() {
   117  	// use proto serialize
   118  	k, err := NewLocalRecord("testrecord", s.priv, s.pub)
   119  	s.Require().NoError(err)
   120  
   121  	privKey2, err := extractPrivKeyFromRecord(k)
   122  	s.Require().NoError(err)
   123  	s.Require().True(privKey2.Equals(s.priv))
   124  }
   125  
   126  func (s *RecordTestSuite) TestExtractPrivKeyFromOfflineRecord() {
   127  	k, err := NewOfflineRecord("testrecord", s.pub)
   128  	s.Require().NoError(err)
   129  
   130  	privKey2, err := extractPrivKeyFromRecord(k)
   131  	s.Require().Error(err)
   132  	s.Require().Nil(privKey2)
   133  }
   134  
   135  func TestRecordTestSuite(t *testing.T) {
   136  	suite.Run(t, new(RecordTestSuite))
   137  }