test: test_wakunode_rln_relay use waitForNullifierLog in all tests avoid flaky (#3227)

This commit is contained in:
Ivan FB 2025-01-06 13:47:17 +01:00 committed by GitHub
parent 04a5355631
commit bb5988e51d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -32,6 +32,14 @@ proc buildWakuRlnConfig(
rlnRelayTreePath: treePath, rlnRelayTreePath: treePath,
) )
proc waitForNullifierLog(node: WakuNode, expectedLen: int): Future[bool] {.async.} =
## Helper function
for i in 0 .. 100: # Try for up to 50 seconds (100 * 500ms)
if node.wakuRlnRelay.nullifierLog.len() == expectedLen:
return true
await sleepAsync(500.millis)
return false
procSuite "WakuNode - RLN relay": procSuite "WakuNode - RLN relay":
# NOTE: we set the rlnRelayUserMessageLimit to 1 to make the tests easier to reason about # NOTE: we set the rlnRelayUserMessageLimit to 1 to make the tests easier to reason about
asyncTest "testing rln-relay with valid proof": asyncTest "testing rln-relay with valid proof":
@ -479,6 +487,7 @@ procSuite "WakuNode - RLN relay":
await node3.stop() await node3.stop()
asyncTest "clearNullifierLog: should clear epochs > MaxEpochGap": asyncTest "clearNullifierLog: should clear epochs > MaxEpochGap":
debug "tmp debug log analyze flaky test"
# Given two nodes # Given two nodes
let let
contentTopic = ContentTopic("/waku/2/default-content/proto") contentTopic = ContentTopic("/waku/2/default-content/proto")
@ -489,27 +498,22 @@ procSuite "WakuNode - RLN relay":
node2 = newTestWakuNode(nodeKey2, parseIpAddress("0.0.0.0"), Port(0)) node2 = newTestWakuNode(nodeKey2, parseIpAddress("0.0.0.0"), Port(0))
epochSizeSec: uint64 = 5 # This means rlnMaxEpochGap = 4 epochSizeSec: uint64 = 5 # This means rlnMaxEpochGap = 4
# Helper function
proc waitForNullifierLog(node: WakuNode, expectedLen: int): Future[bool] {.async.} =
for i in 0 .. 100: # Try for up to 50 seconds (100 * 500ms)
if node.wakuRlnRelay.nullifierLog.len() == expectedLen:
return true
await sleepAsync(500.millis)
return false
# Given both nodes mount relay and rlnrelay # Given both nodes mount relay and rlnrelay
await node1.mountRelay(shardSeq) await node1.mountRelay(shardSeq)
let wakuRlnConfig1 = buildWakuRlnConfig(1, epochSizeSec, "wakunode_10") let wakuRlnConfig1 = buildWakuRlnConfig(1, epochSizeSec, "wakunode_10")
await node1.mountRlnRelay(wakuRlnConfig1) await node1.mountRlnRelay(wakuRlnConfig1)
debug "tmp debug log analyze flaky test"
# Mount rlnrelay in node2 in off-chain mode # Mount rlnrelay in node2 in off-chain mode
await node2.mountRelay(@[DefaultRelayShard]) await node2.mountRelay(@[DefaultRelayShard])
let wakuRlnConfig2 = buildWakuRlnConfig(2, epochSizeSec, "wakunode_11") let wakuRlnConfig2 = buildWakuRlnConfig(2, epochSizeSec, "wakunode_11")
await node2.mountRlnRelay(wakuRlnConfig2) await node2.mountRlnRelay(wakuRlnConfig2)
debug "tmp debug log analyze flaky test"
# Given the two nodes are started and connected # Given the two nodes are started and connected
waitFor allFutures(node1.start(), node2.start()) waitFor allFutures(node1.start(), node2.start())
await node1.connectToNodes(@[node2.switch.peerInfo.toRemotePeerInfo()]) await node1.connectToNodes(@[node2.switch.peerInfo.toRemotePeerInfo()])
debug "tmp debug log analyze flaky test"
# Given some messages # Given some messages
var var
@ -546,7 +550,9 @@ procSuite "WakuNode - RLN relay":
if msg == wm6: if msg == wm6:
completionFut6.complete(true) completionFut6.complete(true)
debug "tmp debug log analyze flaky test"
node2.subscribe((kind: PubsubSub, topic: DefaultPubsubTopic), some(relayHandler)) node2.subscribe((kind: PubsubSub, topic: DefaultPubsubTopic), some(relayHandler))
debug "tmp debug log analyze flaky test"
# Given all messages have an rln proof and are published by the node 1 # Given all messages have an rln proof and are published by the node 1
let publishSleepDuration: Duration = 5000.millis let publishSleepDuration: Duration = 5000.millis
@ -555,61 +561,103 @@ procSuite "WakuNode - RLN relay":
# Epoch 1 # Epoch 1
node1.wakuRlnRelay.unsafeAppendRLNProof(wm1, startTime).isOkOr: node1.wakuRlnRelay.unsafeAppendRLNProof(wm1, startTime).isOkOr:
raiseAssert $error raiseAssert $error
debug "tmp debug log analyze flaky test"
# Message wm2 is published in the same epoch as wm1, so it'll be considered spam # Message wm2 is published in the same epoch as wm1, so it'll be considered spam
node1.wakuRlnRelay.unsafeAppendRLNProof(wm2, startTime).isOkOr: node1.wakuRlnRelay.unsafeAppendRLNProof(wm2, startTime).isOkOr:
raiseAssert $error raiseAssert $error
debug "tmp debug log analyze flaky test"
discard await node1.publish(some(DefaultPubsubTopic), wm1) discard await node1.publish(some(DefaultPubsubTopic), wm1)
debug "tmp debug log analyze flaky test"
discard await node1.publish(some(DefaultPubsubTopic), wm2) discard await node1.publish(some(DefaultPubsubTopic), wm2)
debug "tmp debug log analyze flaky test"
await sleepAsync(publishSleepDuration) await sleepAsync(publishSleepDuration)
debug "tmp debug log analyze flaky test"
check: check:
node1.wakuRlnRelay.nullifierLog.len() == 0 await node1.waitForNullifierLog(0)
node2.wakuRlnRelay.nullifierLog.len() == 1 debug "tmp debug log analyze flaky test"
check:
await node2.waitForNullifierLog(1)
# Epoch 2 # Epoch 2
debug "tmp debug log analyze flaky test"
node1.wakuRlnRelay.unsafeAppendRLNProof(wm3, startTime + float(1 * epochSizeSec)).isOkOr: node1.wakuRlnRelay.unsafeAppendRLNProof(wm3, startTime + float(1 * epochSizeSec)).isOkOr:
raiseAssert $error raiseAssert $error
debug "tmp debug log analyze flaky test"
discard await node1.publish(some(DefaultPubsubTopic), wm3) discard await node1.publish(some(DefaultPubsubTopic), wm3)
debug "tmp debug log analyze flaky test"
await sleepAsync(publishSleepDuration) await sleepAsync(publishSleepDuration)
debug "tmp debug log analyze flaky test"
check: check:
node1.wakuRlnRelay.nullifierLog.len() == 0 await node1.waitForNullifierLog(0)
node2.wakuRlnRelay.nullifierLog.len() == 2 debug "tmp debug log analyze flaky test"
check:
await node2.waitForNullifierLog(2)
debug "tmp debug log analyze flaky test"
# Epoch 3 # Epoch 3
node1.wakuRlnRelay.unsafeAppendRLNProof(wm4, startTime + float(2 * epochSizeSec)).isOkOr: node1.wakuRlnRelay.unsafeAppendRLNProof(wm4, startTime + float(2 * epochSizeSec)).isOkOr:
raiseAssert $error raiseAssert $error
debug "tmp debug log analyze flaky test"
discard await node1.publish(some(DefaultPubsubTopic), wm4) discard await node1.publish(some(DefaultPubsubTopic), wm4)
debug "tmp debug log analyze flaky test"
await sleepAsync(publishSleepDuration) await sleepAsync(publishSleepDuration)
debug "tmp debug log analyze flaky test"
check: check:
node1.wakuRlnRelay.nullifierLog.len() == 0 await node1.waitForNullifierLog(0)
node2.wakuRlnRelay.nullifierLog.len() == 3 debug "tmp debug log analyze flaky test"
check:
await node2.waitForNullifierLog(3)
debug "tmp debug log analyze flaky test"
# Epoch 4 # Epoch 4
node1.wakuRlnRelay.unsafeAppendRLNProof(wm5, startTime + float(3 * epochSizeSec)).isOkOr: node1.wakuRlnRelay.unsafeAppendRLNProof(wm5, startTime + float(3 * epochSizeSec)).isOkOr:
raiseAssert $error raiseAssert $error
debug "tmp debug log analyze flaky test"
discard await node1.publish(some(DefaultPubsubTopic), wm5) discard await node1.publish(some(DefaultPubsubTopic), wm5)
debug "tmp debug log analyze flaky test"
await sleepAsync(publishSleepDuration) await sleepAsync(publishSleepDuration)
debug "tmp debug log analyze flaky test"
check: check:
node1.wakuRlnRelay.nullifierLog.len() == 0 await node1.waitForNullifierLog(0)
node2.wakuRlnRelay.nullifierLog.len() == 4 debug "tmp debug log analyze flaky test"
check:
await node2.waitForNullifierLog(4)
debug "tmp debug log analyze flaky test"
# Epoch 5 # Epoch 5
node1.wakuRlnRelay.unsafeAppendRLNProof(wm6, startTime + float(4 * epochSizeSec)).isOkOr: node1.wakuRlnRelay.unsafeAppendRLNProof(wm6, startTime + float(4 * epochSizeSec)).isOkOr:
raiseAssert $error raiseAssert $error
debug "tmp debug log analyze flaky test"
discard await node1.publish(some(DefaultPubsubTopic), wm6) discard await node1.publish(some(DefaultPubsubTopic), wm6)
debug "tmp debug log analyze flaky test"
await sleepAsync(publishSleepDuration) await sleepAsync(publishSleepDuration)
debug "tmp debug log analyze flaky test"
check: check:
node1.wakuRlnRelay.nullifierLog.len() == 0 await node1.waitForNullifierLog(0)
await waitForNullifierLog(node2, 4) debug "tmp debug log analyze flaky test"
check:
await node2.waitForNullifierLog(4)
# Then the node 2 should have cleared the nullifier log for epochs > MaxEpochGap # Then the node 2 should have cleared the nullifier log for epochs > MaxEpochGap
# Therefore, with 4 max epochs, the first 4 messages will be published (except wm2, which shares epoch with wm1) # Therefore, with 4 max epochs, the first 4 messages will be published (except wm2, which shares epoch with wm1)
check: check:
(await completionFut1.waitForResult()).value() == true (await completionFut1.waitForResult()).value() == true
debug "tmp debug log analyze flaky test"
check:
(await completionFut2.waitForResult()).isErr() (await completionFut2.waitForResult()).isErr()
debug "tmp debug log analyze flaky test"
check:
(await completionFut3.waitForResult()).value() == true (await completionFut3.waitForResult()).value() == true
debug "tmp debug log analyze flaky test"
check:
(await completionFut4.waitForResult()).value() == true (await completionFut4.waitForResult()).value() == true
debug "tmp debug log analyze flaky test"
check:
(await completionFut5.waitForResult()).value() == true (await completionFut5.waitForResult()).value() == true
debug "tmp debug log analyze flaky test"
check:
(await completionFut6.waitForResult()).value() == true (await completionFut6.waitForResult()).value() == true
debug "tmp debug log analyze flaky test"
# Cleanup # Cleanup
waitFor allFutures(node1.stop(), node2.stop()) waitFor allFutures(node1.stop(), node2.stop())
@ -669,3 +717,6 @@ procSuite "WakuNode - RLN relay":
check: check:
node1.wakuRelay.peerStats[node2.switch.peerInfo.peerId].score == 0.1 node1.wakuRelay.peerStats[node2.switch.peerInfo.peerId].score == 0.1
node2.wakuRelay.peerStats[node1.switch.peerInfo.peerId].score == -99.4 node2.wakuRelay.peerStats[node1.switch.peerInfo.peerId].score == -99.4
await node1.stop()
await node2.stop()