waku-org/go-waku

View on GitHub
waku/v2/peermanager/fastest_peer_selector_test.go

Summary

Maintainability
A
0 mins
Test Coverage
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)
        }
    }
}