Skip to content

Commit

Permalink
add test for uniqueness
Browse files Browse the repository at this point in the history
  • Loading branch information
sukunrt committed Sep 30, 2024
1 parent 0f90bab commit 0b53b90
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 0 deletions.
1 change: 1 addition & 0 deletions p2p/host/basic/basic_host.go
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,7 @@ func (h *BasicHost) background() {
h.updateLocalIpAddr()
}
curr := h.Addrs()
fmt.Println(curr)
emitAddrChange(curr, lastAddrs)
lastAddrs = curr

Expand Down
58 changes: 58 additions & 0 deletions p2p/host/basic/basic_host_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"testing"
"time"

"github.com/libp2p/go-libp2p-testing/race"
"github.com/libp2p/go-libp2p/core/event"
"github.com/libp2p/go-libp2p/core/host"
"github.com/libp2p/go-libp2p/core/network"
Expand Down Expand Up @@ -248,6 +249,63 @@ func TestAllAddrs(t *testing.T) {
require.True(t, ma.Contains(h.AllAddrs(), firstAddr), "should still contain the original addr")
}

func TestAllAddrsUnique(t *testing.T) {
if race.WithRace() {
t.Skip("updates addrChangeTickrInterval which might be racy")
}
oldInterval := addrChangeTickrInterval
addrChangeTickrInterval = 100 * time.Millisecond
defer func() {
addrChangeTickrInterval = oldInterval
}()
sendNewAddrs := make(chan struct{})
opts := HostOpts{
AddrsFactory: func(addrs []ma.Multiaddr) []ma.Multiaddr {
select {
case <-sendNewAddrs:
return []ma.Multiaddr{
ma.StringCast("/ip4/1.2.3.4/tcp/1"),
ma.StringCast("/ip4/1.2.3.4/tcp/1"),
ma.StringCast("/ip4/1.2.3.4/tcp/1"),
ma.StringCast("/ip4/1.2.3.4/udp/1/quic-v1"),
ma.StringCast("/ip4/1.2.3.4/udp/1/quic-v1"),
}
default:
return nil
}
},
}
// no listen addrs
h, err := NewHost(swarmt.GenSwarm(t, swarmt.OptDialOnly), &opts)
require.NoError(t, err)
defer h.Close()
h.Start()

sub, err := h.EventBus().Subscribe(&event.EvtLocalAddressesUpdated{})
require.NoError(t, err)
out := make(chan int)
done := make(chan struct{})
go func() {
cnt := 0
for {
select {
case <-sub.Out():
cnt++
case <-done:
out <- cnt
return
}
}
}()
close(sendNewAddrs)
require.Len(t, h.Addrs(), 2)
require.ElementsMatch(t, []ma.Multiaddr{ma.StringCast("/ip4/1.2.3.4/tcp/1"), ma.StringCast("/ip4/1.2.3.4/udp/1/quic-v1")}, h.Addrs())
time.Sleep(2*addrChangeTickrInterval + 1*time.Second) // the background loop runs every 5 seconds. Wait for 2x that time.
close(done)
cnt := <-out
require.Equal(t, 1, cnt)
}

// getHostPair gets a new pair of hosts.
// The first host initiates the connection to the second host.
func getHostPair(t *testing.T) (host.Host, host.Host) {
Expand Down

0 comments on commit 0b53b90

Please sign in to comment.