mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-26 00:25:17 +00:00
99 lines
1.8 KiB
Go
99 lines
1.8 KiB
Go
package mdns
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/libp2p/go-libp2p"
|
|
"github.com/libp2p/go-libp2p/core/peer"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func setupMDNS(t *testing.T, notifee Notifee) peer.ID {
|
|
t.Helper()
|
|
host, err := libp2p.New(libp2p.ListenAddrStrings("/ip4/127.0.0.1/tcp/0"))
|
|
require.NoError(t, err)
|
|
s := NewMdnsService(host, "", notifee)
|
|
require.NoError(t, s.Start())
|
|
t.Cleanup(func() {
|
|
host.Close()
|
|
s.Close()
|
|
})
|
|
return host.ID()
|
|
}
|
|
|
|
type notif struct {
|
|
mutex sync.Mutex
|
|
infos []peer.AddrInfo
|
|
}
|
|
|
|
var _ Notifee = ¬if{}
|
|
|
|
func (n *notif) HandlePeerFound(info peer.AddrInfo) {
|
|
n.mutex.Lock()
|
|
n.infos = append(n.infos, info)
|
|
n.mutex.Unlock()
|
|
}
|
|
|
|
func (n *notif) GetPeers() []peer.AddrInfo {
|
|
n.mutex.Lock()
|
|
defer n.mutex.Unlock()
|
|
infos := make([]peer.AddrInfo, 0, len(n.infos))
|
|
infos = append(infos, n.infos...)
|
|
return infos
|
|
}
|
|
|
|
func TestOtherDiscovery(t *testing.T) {
|
|
const n = 4
|
|
|
|
notifs := make([]*notif, n)
|
|
hostIDs := make([]peer.ID, n)
|
|
for i := 0; i < n; i++ {
|
|
notif := ¬if{}
|
|
notifs[i] = notif
|
|
hostIDs[i] = setupMDNS(t, notif)
|
|
}
|
|
|
|
containsAllHostIDs := func(ids []peer.ID, currentHostID peer.ID) bool {
|
|
for _, id := range hostIDs {
|
|
var found bool
|
|
if currentHostID == id {
|
|
continue
|
|
}
|
|
for _, i := range ids {
|
|
if id == i {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
assert.Eventuallyf(
|
|
t,
|
|
func() bool {
|
|
for i, notif := range notifs {
|
|
infos := notif.GetPeers()
|
|
ids := make([]peer.ID, 0, len(infos))
|
|
for _, info := range infos {
|
|
ids = append(ids, info.ID)
|
|
}
|
|
if !containsAllHostIDs(ids, hostIDs[i]) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
},
|
|
25*time.Second,
|
|
5*time.Millisecond,
|
|
"expected peers to find each other",
|
|
)
|
|
}
|