github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/crypto/bech32_test.go (about)

     1  package crypto_test
     2  
     3  import (
     4  	"math/rand"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  
     9  	"github.com/gnolang/gno/tm2/pkg/amino"
    10  	"github.com/gnolang/gno/tm2/pkg/crypto"
    11  	"github.com/gnolang/gno/tm2/pkg/crypto/ed25519"
    12  )
    13  
    14  var invalidStrs = []string{
    15  	crypto.Bech32AddrPrefix + "AB0C",
    16  	crypto.Bech32AddrPrefix + "1234",
    17  	crypto.Bech32AddrPrefix + "5678",
    18  	crypto.Bech32AddrPrefix + "BBAB",
    19  	crypto.Bech32AddrPrefix + "FF04",
    20  	crypto.Bech32AddrPrefix + "6789",
    21  }
    22  
    23  func TestEmptyAddresses(t *testing.T) {
    24  	t.Parallel()
    25  
    26  	require.Equal(t, (crypto.Address{}).String(), "g1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqluuxe")
    27  
    28  	addr := crypto.AddressFromBytes(make([]byte, 20))
    29  	require.True(t, addr.IsZero())
    30  
    31  	addr, err := crypto.AddressFromBech32("")
    32  	require.True(t, addr.IsZero())
    33  	require.NotNil(t, err)
    34  
    35  	addr, err = crypto.AddressFromBech32("g1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqluuxe")
    36  	require.True(t, addr.IsZero())
    37  	require.Nil(t, err)
    38  }
    39  
    40  func testMarshal(t *testing.T, addr crypto.Address, marshal func(orig interface{}) ([]byte, error), unmarshal func(bz []byte, ptr interface{}) error) {
    41  	t.Helper()
    42  
    43  	bz, err := marshal(addr)
    44  	require.Nil(t, err)
    45  	res := crypto.Address{}
    46  	err = unmarshal(bz, &res)
    47  	require.Nil(t, err)
    48  	require.Equal(t, addr, res)
    49  }
    50  
    51  func TestRandBech32AddrConsistency(t *testing.T) {
    52  	t.Parallel()
    53  
    54  	var pub ed25519.PubKeyEd25519
    55  
    56  	for i := 0; i < 1000; i++ {
    57  		rand.Read(pub[:])
    58  
    59  		addr := crypto.AddressFromBytes(pub.Address().Bytes())
    60  		testMarshal(t, addr, amino.Marshal, amino.Unmarshal)
    61  		testMarshal(t, addr, amino.MarshalJSON, amino.UnmarshalJSON)
    62  
    63  		str := addr.String()
    64  		res, err := crypto.AddressFromBech32(str)
    65  		require.Nil(t, err)
    66  		require.Equal(t, addr, res)
    67  	}
    68  
    69  	for _, str := range invalidStrs {
    70  		_, err := crypto.AddressFromBech32(str)
    71  		require.NotNil(t, err)
    72  	}
    73  }