@@ -217,10 +217,11 @@ suite "KadDHT Find":
217217 check kads[0 ].hasKey (kads[2 ].rtable.selfId)
218218
219219 asyncTest " Find node with empty key returns closest peers" :
220- let kads = setupKadSwitches (2 )
220+ let kads = setupKadSwitches (3 )
221221 startAndDeferStop (kads)
222222
223- await connect (kads[0 ], kads[1 ])
223+ # Setup: kads[0] <-> kads[1], kads[0] <-> kads[2]
224+ await connectHub (kads[0 ], kads[1 ..^ 1 ])
224225
225226 # Send FIND_NODE with empty key directly
226227 let emptyKey: Key = @ []
@@ -231,9 +232,9 @@ suite "KadDHT Find":
231232 check:
232233 response.msgType == MessageType .findNode
233234 response.closerPeers.len == 1
234- response.closerPeers[0 ].id.get () == kads[1 ].rtable.selfId
235+ response.closerPeers[0 ].id.get () == kads[2 ].rtable.selfId
235236
236- asyncTest " Find node for own PeerID returns closest peers " :
237+ asyncTest " Find node for own PeerID excludes the requester " :
237238 let kads = setupKadSwitches (3 )
238239 startAndDeferStop (kads)
239240
@@ -248,9 +249,28 @@ suite "KadDHT Find":
248249 let closerPeersIds = response.closerPeers.mapIt (it.id.get ())
249250 check:
250251 response.msgType == MessageType .findNode
251- # kads[0] knows kads[1] and kads[2], should return both as closest peers
252- response.closerPeers.len == 2
253- kads[1 ].rtable.selfId in closerPeersIds
252+ # kads[0] knows kads[1] and kads[2], but must not hand kads[1] its own id back
253+ response.closerPeers.len == 1
254+ kads[1 ].rtable.selfId notin closerPeersIds
255+ kads[2 ].rtable.selfId in closerPeersIds
256+
257+ asyncTest " Find node excludes the requester for an unrelated target" :
258+ let kads = setupKadSwitches (3 )
259+ startAndDeferStop (kads)
260+
261+ await connectHub (kads[0 ], kads[1 ..^ 1 ])
262+
263+ # kads[0] knows kads[1] and kads[2], and both fit in a reply, so pre-filter
264+ # kads[1] would get itself back even though the target is unrelated to it.
265+ let response = (
266+ await kads[1 ].dispatchFindNode (
267+ kads[0 ].switch.peerInfo.peerId, randomPeerId ().toKey ()
268+ )
269+ ).value ()
270+
271+ let closerPeersIds = response.closerPeers.mapIt (it.id.get ())
272+ check:
273+ kads[1 ].rtable.selfId notin closerPeersIds
254274 kads[2 ].rtable.selfId in closerPeersIds
255275
256276 asyncTest " Find node with empty routing table returns empty result" :
0 commit comments