nim-sds/tests/test_reliability.nim
2024-10-14 15:05:19 +04:00

79 lines
2.7 KiB
Nim

import unittest
import ../src/reliability
suite "ReliabilityManager":
setup:
let rm = newReliabilityManager("testChannel")
test "wrapOutgoingMessage":
let msg = rm.wrapOutgoingMessage("Hello, World!")
check:
msg.content == "Hello, World!"
msg.channelId == "testChannel"
msg.causalHistory.len == 0
test "unwrapReceivedMessage":
let wrappedMsg = rm.wrapOutgoingMessage("Test message")
let (unwrappedMsg, missingDeps) = rm.unwrapReceivedMessage(wrappedMsg)
check:
unwrappedMsg.content == "Test message"
missingDeps.len == 0
test "markDependenciesMet":
let msg1 = rm.wrapOutgoingMessage("Message 1")
let msg2 = rm.wrapOutgoingMessage("Message 2")
let msg3 = rm.wrapOutgoingMessage("Message 3")
var (_, missingDeps) = rm.unwrapReceivedMessage(msg3)
check missingDeps.len == 2
rm.markDependenciesMet(@[msg1.messageId, msg2.messageId])
(_, missingDeps) = rm.unwrapReceivedMessage(msg3)
check missingDeps.len == 0
test "callbacks":
var messageReadyCount = 0
var messageSentCount = 0
var periodicSyncCount = 0
rm.setCallbacks(
proc(messageId: MessageID) = messageReadyCount += 1,
proc(messageId: MessageID) = messageSentCount += 1,
proc() = periodicSyncCount += 1
)
let msg = rm.wrapOutgoingMessage("Test callback")
discard rm.unwrapReceivedMessage(msg)
check:
messageReadyCount == 1
messageSentCount == 0 # This would be triggered by the checkUnacknowledgedMessages function
periodicSyncCount == 0 # This would be triggered by the periodicSync function
test "lamport timestamps":
let msg1 = rm.wrapOutgoingMessage("Message 1")
let msg2 = rm.wrapOutgoingMessage("Message 2")
check msg2.lamportTimestamp > msg1.lamportTimestamp
let msg3 = Message(lamportTimestamp: msg2.lamportTimestamp + 10, messageId: generateUniqueID(), content: "Message 3")
discard rm.unwrapReceivedMessage(msg3)
let msg4 = rm.wrapOutgoingMessage("Message 4")
check msg4.lamportTimestamp > msg3.lamportTimestamp
test "causal history":
let msg1 = rm.wrapOutgoingMessage("Message 1")
let msg2 = rm.wrapOutgoingMessage("Message 2")
let msg3 = rm.wrapOutgoingMessage("Message 3")
check:
msg2.causalHistory.contains(msg1.messageId)
msg3.causalHistory.contains(msg2.messageId)
msg3.causalHistory.contains(msg1.messageId)
test "bloom filter":
let msg1 = rm.wrapOutgoingMessage("Message 1")
let (_, missingDeps1) = rm.unwrapReceivedMessage(msg1)
check missingDeps1.len == 0
let (_, missingDeps2) = rm.unwrapReceivedMessage(msg1)
check missingDeps2.len == 0 # The message should be in the bloom filter and not processed again