package types_test import ( "encoding/hex" "math/rand" "testing" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/types" ) var invalidstrs = []string{ "", "hello, world!", "0xAA", "AAA", types.Bech32PrefixAccAddr + "AB0C", types.Bech32PrefixAccPub + "1234", types.Bech32PrefixValAddr + "5678", types.Bech32PrefixValPub + "BBAB", } func testMarshal(t *testing.T, original interface{}, res interface{}, marshal func() ([]byte, error), unmarshal func([]byte) error) { bz, err := marshal() require.Nil(t, err) err = unmarshal(bz) require.Nil(t, err) require.Equal(t, original, res) } func TestRandBech32PubkeyConsistency(t *testing.T) { var pub ed25519.PubKeyEd25519 for i := 0; i < 1000; i++ { rand.Read(pub[:]) mustbech32accpub := types.MustBech32ifyAccPub(pub) bech32accpub, err := types.Bech32ifyAccPub(pub) require.Nil(t, err) require.Equal(t, bech32accpub, mustbech32accpub) mustbech32valpub := types.MustBech32ifyValPub(pub) bech32valpub, err := types.Bech32ifyValPub(pub) require.Nil(t, err) require.Equal(t, bech32valpub, mustbech32valpub) mustaccpub := types.MustGetAccPubKeyBech32(bech32accpub) accpub, err := types.GetAccPubKeyBech32(bech32accpub) require.Nil(t, err) require.Equal(t, accpub, mustaccpub) mustvalpub := types.MustGetValPubKeyBech32(bech32valpub) valpub, err := types.GetValPubKeyBech32(bech32valpub) require.Nil(t, err) require.Equal(t, valpub, mustvalpub) require.Equal(t, valpub, accpub) } } func TestRandBech32AccAddrConsistency(t *testing.T) { var pub ed25519.PubKeyEd25519 for i := 0; i < 1000; i++ { rand.Read(pub[:]) acc := types.AccAddress(pub.Address()) res := types.AccAddress{} testMarshal(t, &acc, &res, acc.MarshalJSON, (&res).UnmarshalJSON) testMarshal(t, &acc, &res, acc.Marshal, (&res).Unmarshal) str := acc.String() res, err := types.AccAddressFromBech32(str) require.Nil(t, err) require.Equal(t, acc, res) str = hex.EncodeToString(acc) res, err = types.AccAddressFromHex(str) require.Nil(t, err) require.Equal(t, acc, res) } for _, str := range invalidstrs { _, err := types.AccAddressFromHex(str) require.NotNil(t, err) _, err = types.AccAddressFromBech32(str) require.NotNil(t, err) err = (*types.AccAddress)(nil).UnmarshalJSON([]byte("\"" + str + "\"")) require.NotNil(t, err) } } func TestValAddr(t *testing.T) { var pub ed25519.PubKeyEd25519 for i := 0; i < 20; i++ { rand.Read(pub[:]) acc := types.ValAddress(pub.Address()) res := types.ValAddress{} testMarshal(t, &acc, &res, acc.MarshalJSON, (&res).UnmarshalJSON) testMarshal(t, &acc, &res, acc.Marshal, (&res).Unmarshal) str := acc.String() res, err := types.ValAddressFromBech32(str) require.Nil(t, err) require.Equal(t, acc, res) str = hex.EncodeToString(acc) res, err = types.ValAddressFromHex(str) require.Nil(t, err) require.Equal(t, acc, res) } for _, str := range invalidstrs { _, err := types.ValAddressFromHex(str) require.NotNil(t, err) _, err = types.ValAddressFromBech32(str) require.NotNil(t, err) err = (*types.ValAddress)(nil).UnmarshalJSON([]byte("\"" + str + "\"")) require.NotNil(t, err) } }