From eb1e504b101427de85da9abc93b5ef49c9a9b0f7 Mon Sep 17 00:00:00 2001 From: Dennis Trautwein Date: Fri, 21 Oct 2022 16:07:49 +0100 Subject: [PATCH] test: add routed host obsolete maddr test --- p2p/host/routed/routed_test.go | 73 ++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 p2p/host/routed/routed_test.go diff --git a/p2p/host/routed/routed_test.go b/p2p/host/routed/routed_test.go new file mode 100644 index 0000000000..d4b9daea4b --- /dev/null +++ b/p2p/host/routed/routed_test.go @@ -0,0 +1,73 @@ +package routedhost + +import ( + "context" + "testing" + + "github.com/libp2p/go-libp2p/core/peer" + basic "github.com/libp2p/go-libp2p/p2p/host/basic" + swarmt "github.com/libp2p/go-libp2p/p2p/net/swarm/testing" + ma "github.com/multiformats/go-multiaddr" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var _ Routing = (*mockRouting)(nil) + +type mockRouting struct { + callCount int + findPeerFn func(ctx context.Context, id peer.ID) (peer.AddrInfo, error) +} + +func (m *mockRouting) FindPeer(ctx context.Context, pid peer.ID) (peer.AddrInfo, error) { + m.callCount += 1 + return m.findPeerFn(ctx, pid) +} + +func TestRoutedHost_Connect_obsoleteAddresses(t *testing.T) { + ctx := context.Background() + + h1, err := basic.NewHost(swarmt.GenSwarm(t), nil) + require.NoError(t, err) + defer h1.Close() + + h2, err := basic.NewHost(swarmt.GenSwarm(t), nil) + require.NoError(t, err) + defer h2.Close() + + // construct a wrong multi address for host 2, so that + // the initial connection attempt will fail + // (we have obsolete, old multi address information) + maddr, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + require.NoError(t, err) + + // assemble the AddrInfo struct to use for the connection attempt + pi := peer.AddrInfo{ + ID: h2.ID(), + Addrs: []ma.Multiaddr{maddr}, + } + + // Build mock routing module and replace the FindPeer function. + // Now, that function will return the correct multi addresses for host 2 + // (we have fetched the most up-to-date data from the DHT) + mr := &mockRouting{ + findPeerFn: func(ctx context.Context, pi peer.ID) (peer.AddrInfo, error) { + return peer.AddrInfo{ + ID: h2.ID(), + Addrs: h2.Addrs(), + }, nil + }, + } + + // Build routed host + rh := Wrap(h1, mr) + + // Try to connect + err = rh.Connect(ctx, pi) + + // Connection establishment should have worked without an error + assert.NoError(t, err) + + // The mocked FindPeer function should have been called + assert.Equal(t, 1, mr.callCount) +}