mirror of
https://github.com/vacp2p/nim-libp2p.git
synced 2025-03-02 17:10:44 +00:00
Add PRUNE back and peer list verifier test.
This commit is contained in:
parent
94fdb8d25e
commit
7549d95a8e
@ -1799,3 +1799,96 @@ suite "Gossipsub Parameters":
|
|||||||
# Cleanup
|
# Cleanup
|
||||||
await allFuturesThrowing(nodes.mapIt(allFutures(it.switch.stop())))
|
await allFuturesThrowing(nodes.mapIt(allFutures(it.switch.stop())))
|
||||||
await allFuturesThrowing(nodesFut)
|
await allFuturesThrowing(nodesFut)
|
||||||
|
|
||||||
|
asyncTest "Verify inclusion of backoff periods and peer lists in PRUNE messages for Peer Exchange":
|
||||||
|
# A, B & C are subscribed to something
|
||||||
|
# B unsubcribe from it, it should send
|
||||||
|
# PX to A & C
|
||||||
|
#
|
||||||
|
# C sent his SPR, not A
|
||||||
|
let
|
||||||
|
topic = "foobar"
|
||||||
|
nodes =
|
||||||
|
generateNodes(2, gossip = true, enablePX = true) &
|
||||||
|
generateNodes(1, gossip = true, sendSignedPeerRecord = true)
|
||||||
|
|
||||||
|
# start switches
|
||||||
|
nodesFut = await allFinished(
|
||||||
|
nodes[0].switch.start(), nodes[1].switch.start(), nodes[2].switch.start()
|
||||||
|
)
|
||||||
|
|
||||||
|
var
|
||||||
|
gossip0 = GossipSub(nodes[0])
|
||||||
|
gossip1 = GossipSub(nodes[1])
|
||||||
|
gossip2 = GossipSub(nodes[2])
|
||||||
|
|
||||||
|
# Connect nodes
|
||||||
|
await subscribeNodes(nodes)
|
||||||
|
|
||||||
|
# Subscribe nodes to the same topic
|
||||||
|
for node in nodes:
|
||||||
|
node.subscribe(topic, voidTopicHandler)
|
||||||
|
|
||||||
|
for x in 0 ..< 3:
|
||||||
|
for y in 0 ..< 3:
|
||||||
|
if x != y:
|
||||||
|
await waitSub(nodes[x], nodes[y], topic)
|
||||||
|
|
||||||
|
# Add an observer to node 2 for PRUNE messages
|
||||||
|
var receivedPrunes: seq[ControlPrune] = @[]
|
||||||
|
let checkForPrunes = proc(peer: PubSubPeer, msgs: var RPCMsg) =
|
||||||
|
if msgs.control.isSome:
|
||||||
|
let prunes = msgs.control.get.prune
|
||||||
|
for prune in prunes:
|
||||||
|
if prune.topicID == topic:
|
||||||
|
receivedPrunes.add(prune)
|
||||||
|
|
||||||
|
gossip2.addObserver(PubSubObserver(onRecv: checkForPrunes))
|
||||||
|
|
||||||
|
# Setup record handlers for all nodes
|
||||||
|
var
|
||||||
|
passed0: Future[void] = newFuture[void]()
|
||||||
|
passed1: Future[void] = newFuture[void]()
|
||||||
|
passed2: Future[void] = newFuture[void]()
|
||||||
|
gossip0.routingRecordsHandler.add(
|
||||||
|
proc(peer: PeerId, tag: string, peers: seq[RoutingRecordsPair]) =
|
||||||
|
check:
|
||||||
|
tag == topic
|
||||||
|
peers.len == 2
|
||||||
|
peers[0].record.isSome() xor peers[1].record.isSome()
|
||||||
|
passed0.complete()
|
||||||
|
)
|
||||||
|
gossip1.routingRecordsHandler.add(
|
||||||
|
proc(peer: PeerId, tag: string, peers: seq[RoutingRecordsPair]) =
|
||||||
|
passed1.complete()
|
||||||
|
)
|
||||||
|
gossip2.routingRecordsHandler.add(
|
||||||
|
proc(peer: PeerId, tag: string, peers: seq[RoutingRecordsPair]) =
|
||||||
|
check:
|
||||||
|
tag == topic
|
||||||
|
peers.len == 2
|
||||||
|
peers[0].record.isSome() xor peers[1].record.isSome()
|
||||||
|
passed2.complete()
|
||||||
|
)
|
||||||
|
|
||||||
|
# Unsubscribe from the topic
|
||||||
|
nodes[1].unsubscribe(topic, handler)
|
||||||
|
|
||||||
|
# Then verify what nodes receive the PX
|
||||||
|
check:
|
||||||
|
(await passed0.waitForResult()).isOk
|
||||||
|
not (await passed1.waitForResult()).isOk
|
||||||
|
(await passed2.waitForResult()).isOk
|
||||||
|
|
||||||
|
# And verify node 2 received the PRUNE message and it contains the backoff period and peer list
|
||||||
|
check:
|
||||||
|
receivedPrunes.len == 1
|
||||||
|
receivedPrunes[0].topicID == "foobar"
|
||||||
|
receivedPrunes[0].peers.len == 2
|
||||||
|
receivedPrunes[0].backoff == 1
|
||||||
|
|
||||||
|
await allFuturesThrowing(
|
||||||
|
nodes[0].switch.stop(), nodes[1].switch.stop(), nodes[2].switch.stop()
|
||||||
|
)
|
||||||
|
|
||||||
|
await allFuturesThrowing(nodesFut.concat())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user