2021-11-09 23:34:04 +00:00
|
|
|
package utils
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"crypto/rand"
|
2021-11-19 13:13:00 +00:00
|
|
|
"fmt"
|
|
|
|
"net"
|
2021-11-09 23:34:04 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2021-11-19 13:13:00 +00:00
|
|
|
gcrypto "github.com/ethereum/go-ethereum/crypto"
|
|
|
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
|
|
|
crypto "github.com/libp2p/go-libp2p-core/crypto"
|
|
|
|
"github.com/libp2p/go-libp2p-core/peer"
|
2021-11-09 23:34:04 +00:00
|
|
|
"github.com/libp2p/go-libp2p-core/peerstore"
|
2021-11-19 13:13:00 +00:00
|
|
|
ma "github.com/multiformats/go-multiaddr"
|
|
|
|
manet "github.com/multiformats/go-multiaddr/net"
|
2021-11-09 23:34:04 +00:00
|
|
|
"github.com/status-im/go-waku/tests"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestSelectPeer(t *testing.T) {
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
h1, err := tests.MakeHost(ctx, 0, rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer h1.Close()
|
|
|
|
|
|
|
|
h2, err := tests.MakeHost(ctx, 0, rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer h2.Close()
|
|
|
|
|
|
|
|
h3, err := tests.MakeHost(ctx, 0, rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer h3.Close()
|
|
|
|
|
|
|
|
proto := "test/protocol"
|
|
|
|
|
|
|
|
h1.Peerstore().AddAddrs(h2.ID(), h2.Network().ListenAddresses(), peerstore.PermanentAddrTTL)
|
|
|
|
h1.Peerstore().AddAddrs(h3.ID(), h2.Network().ListenAddresses(), peerstore.PermanentAddrTTL)
|
|
|
|
|
|
|
|
// No peers with selected protocol
|
|
|
|
_, err = SelectPeer(h1, proto)
|
|
|
|
require.Error(t, ErrNoPeersAvailable, err)
|
|
|
|
|
|
|
|
// Peers with selected protocol
|
|
|
|
_ = h1.Peerstore().AddProtocols(h2.ID(), proto)
|
|
|
|
_ = h1.Peerstore().AddProtocols(h3.ID(), proto)
|
|
|
|
|
|
|
|
_, err = SelectPeerWithLowestRTT(ctx, h1, proto)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSelectPeerWithLowestRTT(t *testing.T) {
|
|
|
|
// help-wanted: how to slowdown the ping response to properly test the rtt
|
|
|
|
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
h1, err := tests.MakeHost(ctx, 0, rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer h1.Close()
|
|
|
|
|
|
|
|
h2, err := tests.MakeHost(ctx, 0, rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer h2.Close()
|
|
|
|
|
|
|
|
h3, err := tests.MakeHost(ctx, 0, rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer h3.Close()
|
|
|
|
|
|
|
|
proto := "test/protocol"
|
|
|
|
|
|
|
|
h1.Peerstore().AddAddrs(h2.ID(), h2.Network().ListenAddresses(), peerstore.PermanentAddrTTL)
|
|
|
|
h1.Peerstore().AddAddrs(h3.ID(), h2.Network().ListenAddresses(), peerstore.PermanentAddrTTL)
|
|
|
|
|
|
|
|
// No peers with selected protocol
|
|
|
|
_, err = SelectPeerWithLowestRTT(ctx, h1, proto)
|
|
|
|
require.Error(t, ErrNoPeersAvailable, err)
|
|
|
|
|
|
|
|
// Peers with selected protocol
|
|
|
|
_ = h1.Peerstore().AddProtocols(h2.ID(), proto)
|
|
|
|
_ = h1.Peerstore().AddProtocols(h3.ID(), proto)
|
|
|
|
|
|
|
|
_, err = SelectPeerWithLowestRTT(ctx, h1, proto)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
2021-11-19 13:13:00 +00:00
|
|
|
|
|
|
|
func TestEnodeToMultiAddr(t *testing.T) {
|
|
|
|
enr := "enr:-IS4QAmC_o1PMi5DbR4Bh4oHVyQunZblg4bTaottPtBodAhJZvxVlWW-4rXITPNg4mwJ8cW__D9FBDc9N4mdhyMqB-EBgmlkgnY0gmlwhIbRi9KJc2VjcDI1NmsxoQOevTdO6jvv3fRruxguKR-3Ge4bcFsLeAIWEDjrfaigNoN0Y3CCdl8"
|
|
|
|
|
|
|
|
parsedNode := enode.MustParse(enr)
|
|
|
|
expectedMultiAddr := "/ip4/134.209.139.210/tcp/30303/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ"
|
|
|
|
actualMultiAddr, err := EnodeToMultiAddr(parsedNode)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, expectedMultiAddr, actualMultiAddr.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetENRandIP(t *testing.T) {
|
|
|
|
key, _ := gcrypto.GenerateKey()
|
|
|
|
privKey := crypto.PrivKey((*crypto.Secp256k1PrivateKey)(key))
|
|
|
|
id, _ := peer.IDFromPublicKey(privKey.GetPublic())
|
|
|
|
|
|
|
|
hostAddr := &net.TCPAddr{IP: net.ParseIP("192.168.0.1"), Port: 9999}
|
|
|
|
hostMultiAddr, _ := manet.FromNetAddr(hostAddr)
|
|
|
|
hostInfo, _ := ma.NewMultiaddr(fmt.Sprintf("/p2p/%s", id.Pretty()))
|
|
|
|
ogMultiaddress := hostMultiAddr.Encapsulate(hostInfo)
|
|
|
|
|
|
|
|
node, resTCPAddr, err := GetENRandIP(ogMultiaddress, key)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, hostAddr, resTCPAddr)
|
|
|
|
|
|
|
|
parsedNode := enode.MustParse(node.String())
|
|
|
|
resMultiaddress, err := EnodeToMultiAddr(parsedNode)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, ogMultiaddress.String(), resMultiaddress.String())
|
|
|
|
}
|