@@ -53,6 +53,11 @@ func (m *mockClient) PutIPNS(ctx context.Context, name ipns.Name, record *ipns.R
5353 return args .Error (0 )
5454}
5555
56+ func (m * mockClient ) GetClosestPeers (ctx context.Context , peerID , closerThan peer.ID , count int ) (iter.ResultIter [* types.PeerRecord ], error ) {
57+ args := m .Called (ctx , peerID , closerThan , count )
58+ return args .Get (0 ).(iter.ResultIter [* types.PeerRecord ]), args .Error (1 )
59+ }
60+
5661func TestProvide (t * testing.T ) {
5762 for _ , c := range []struct {
5863 name string
@@ -258,6 +263,108 @@ func TestFindPeerNoPeer(t *testing.T) {
258263 require .ErrorIs (t , err , routing .ErrNotFound )
259264}
260265
266+ func TestGetClosestPeers (t * testing.T ) {
267+ t .Run ("returns a channel and can read all results" , func (t * testing.T ) {
268+ ctx := context .Background ()
269+ client := & mockClient {}
270+ crc := NewContentRoutingClient (client )
271+
272+ peerID := peer .ID ("test-peer" )
273+ closerThan := peer .ID ("test-peer-2" )
274+ count := 2
275+
276+ // Mock response with two peer records
277+ peer1 := peer .ID ("peer1" )
278+ peer2 := peer .ID ("peer2" )
279+ addr1 := multiaddr .StringCast ("/ip4/1.2.3.4/tcp/1234" )
280+ addr2 := multiaddr .StringCast ("/ip4/5.6.7.8/tcp/5678" )
281+ addrs1 := []types.Multiaddr {{Multiaddr : addr1 }}
282+ addrs2 := []types.Multiaddr {{Multiaddr : addr2 }}
283+ peerRec1 := & types.PeerRecord {
284+ Schema : types .SchemaPeer ,
285+ ID : & peer1 ,
286+ Addrs : addrs1 ,
287+ Protocols : []string {"transport-bitswap" },
288+ }
289+ peerRec2 := & types.PeerRecord {
290+ Schema : types .SchemaPeer ,
291+ ID : & peer2 ,
292+ Addrs : addrs2 ,
293+ Protocols : []string {"transport-bitswap" },
294+ }
295+
296+ peerIter := iter.ToResultIter [* types.PeerRecord ](iter .FromSlice ([]* types.PeerRecord {peerRec1 , peerRec2 }))
297+
298+ client .On ("GetClosestPeers" , ctx , peerID , closerThan , count ).Return (peerIter , nil )
299+
300+ infos , err := crc .GetClosestPeers (ctx , peerID , closerThan , count )
301+ require .NoError (t , err )
302+
303+ var actual []peer.AddrInfo
304+ for info := range infos {
305+ actual = append (actual , info )
306+ }
307+
308+ expected := []peer.AddrInfo {
309+ {ID : peer1 , Addrs : []multiaddr.Multiaddr {addr1 }},
310+ {ID : peer2 , Addrs : []multiaddr.Multiaddr {addr2 }},
311+ }
312+
313+ assert .Equal (t , expected , actual )
314+ })
315+
316+ t .Run ("returns no results if addrs is empty" , func (t * testing.T ) {
317+ ctx := context .Background ()
318+ client := & mockClient {}
319+ crc := NewContentRoutingClient (client )
320+
321+ peerID := peer .ID ("test-peer" )
322+ closerThan := peer .ID ("closer-than" )
323+ count := 1
324+
325+ peer1 := peer .ID ("peer1" )
326+ peerRec1 := & types.PeerRecord {
327+ Schema : types .SchemaPeer ,
328+ ID : & peer1 ,
329+ Protocols : []string {"transport-bitswap" },
330+ // no addresses
331+ }
332+
333+ // Mock response with an empty iterator
334+ peerIter := iter.ToResultIter [* types.PeerRecord ](iter .FromSlice ([]* types.PeerRecord {peerRec1 }))
335+
336+ client .On ("GetClosestPeers" , ctx , peerID , closerThan , count ).Return (peerIter , nil )
337+
338+ infos , err := crc .GetClosestPeers (ctx , peerID , closerThan , count )
339+ require .NoError (t , err )
340+
341+ var actual []peer.AddrInfo
342+ for info := range infos {
343+ actual = append (actual , info )
344+ }
345+
346+ assert .Empty (t , actual )
347+ })
348+
349+ t .Run ("returns an error if call errors" , func (t * testing.T ) {
350+ ctx := context .Background ()
351+ client := & mockClient {}
352+ crc := NewContentRoutingClient (client )
353+
354+ peerID := peer .ID ("test-peer" )
355+ closerThan := peer .ID ("closer-than" )
356+ count := 1
357+
358+ // Mock error response
359+ peerIter := iter.ToResultIter [* types.PeerRecord ](iter .FromSlice ([]* types.PeerRecord {}))
360+ client .On ("GetClosestPeers" , ctx , peerID , closerThan , count ).Return (peerIter , assert .AnError )
361+
362+ infos , err := crc .GetClosestPeers (ctx , peerID , closerThan , count )
363+ require .ErrorIs (t , err , assert .AnError )
364+ assert .Nil (t , infos )
365+ })
366+ }
367+
261368func makeName (t * testing.T ) (crypto.PrivKey , ipns.Name ) {
262369 sk , _ , err := crypto .GenerateEd25519Key (rand .Reader )
263370 require .NoError (t , err )
0 commit comments