Add PRUNE back and peer list verifier test.

This commit is contained in:
Alejandro Cabeza Romero 2024-09-27 21:19:18 +02:00
parent 94fdb8d25e
commit 7549d95a8e
No known key found for this signature in database
GPG Key ID: DA3D14AE478030FD
1 changed files with 93 additions and 0 deletions

View File

@ -1799,3 +1799,96 @@ suite "Gossipsub Parameters":
# Cleanup
await allFuturesThrowing(nodes.mapIt(allFutures(it.switch.stop())))
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())