waku/v2/peermanager/fastest_peer_selector_test.go
package peermanager
import (
"context"
"crypto/rand"
"testing"
"time"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/core/peerstore"
"github.com/stretchr/testify/require"
"github.com/waku-org/go-waku/tests"
"github.com/waku-org/go-waku/waku/v2/utils"
)
func TestRTT(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
h1, _ := tests.MakeHost(ctx, 0, rand.Reader)
h2, _ := tests.MakeHost(ctx, 0, rand.Reader)
h3, _ := tests.MakeHost(ctx, 0, rand.Reader)
h1.Peerstore().AddAddrs(h2.ID(), h2.Addrs(), peerstore.PermanentAddrTTL)
h1.Peerstore().AddAddrs(h3.ID(), h3.Addrs(), peerstore.PermanentAddrTTL)
rtt := NewFastestPeerSelector(utils.Logger())
rtt.SetHost(h1)
_, err := rtt.FastestPeer(ctx, peer.IDSlice{h2.ID(), h3.ID()})
require.NoError(t, err)
// Simulate H3 being no longer available
h3.Close()
_, err = rtt.FastestPeer(ctx, peer.IDSlice{h3.ID()})
require.ErrorIs(t, err, utils.ErrNoPeersAvailable)
// H3 should never return
for i := 0; i < 100; i++ {
p, err := rtt.FastestPeer(ctx, peer.IDSlice{h2.ID(), h3.ID()})
if err != nil {
require.ErrorIs(t, err, utils.ErrNoPeersAvailable)
} else {
require.NotEqual(t, h3.ID(), p)
}
}
}