github.com/MetalBlockchain/metalgo@v1.11.9/network/peer/ip_signer_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package peer
     5  
     6  import (
     7  	"crypto"
     8  	"net/netip"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/MetalBlockchain/metalgo/staking"
    15  	"github.com/MetalBlockchain/metalgo/utils"
    16  	"github.com/MetalBlockchain/metalgo/utils/crypto/bls"
    17  )
    18  
    19  func TestIPSigner(t *testing.T) {
    20  	require := require.New(t)
    21  
    22  	dynIP := utils.NewAtomic(netip.AddrPortFrom(
    23  		netip.IPv6Loopback(),
    24  		0,
    25  	))
    26  
    27  	tlsCert, err := staking.NewTLSCert()
    28  	require.NoError(err)
    29  
    30  	tlsKey := tlsCert.PrivateKey.(crypto.Signer)
    31  	blsKey, err := bls.NewSecretKey()
    32  	require.NoError(err)
    33  
    34  	s := NewIPSigner(dynIP, tlsKey, blsKey)
    35  
    36  	s.clock.Set(time.Unix(10, 0))
    37  
    38  	signedIP1, err := s.GetSignedIP()
    39  	require.NoError(err)
    40  	require.Equal(dynIP.Get(), signedIP1.AddrPort)
    41  	require.Equal(uint64(10), signedIP1.Timestamp)
    42  
    43  	s.clock.Set(time.Unix(11, 0))
    44  
    45  	signedIP2, err := s.GetSignedIP()
    46  	require.NoError(err)
    47  	require.Equal(dynIP.Get(), signedIP2.AddrPort)
    48  	require.Equal(uint64(10), signedIP2.Timestamp)
    49  	require.Equal(signedIP1.TLSSignature, signedIP2.TLSSignature)
    50  
    51  	dynIP.Set(netip.AddrPortFrom(
    52  		netip.AddrFrom4([4]byte{1, 2, 3, 4}),
    53  		dynIP.Get().Port(),
    54  	))
    55  
    56  	signedIP3, err := s.GetSignedIP()
    57  	require.NoError(err)
    58  	require.Equal(dynIP.Get(), signedIP3.AddrPort)
    59  	require.Equal(uint64(11), signedIP3.Timestamp)
    60  	require.NotEqual(signedIP2.TLSSignature, signedIP3.TLSSignature)
    61  }