swarmsim/tests/engine/tpeer.nim
2023-08-29 17:49:18 -03:00

130 lines
3.8 KiB
Nim

import unittest
import std/sets
import swarmsim/engine/eventdrivenengine
import swarmsim/engine/network
import swarmsim/engine/peer
import swarmsim/engine/message
import ../helpers/inbox
import ../helpers/types
# We need this here as otherwise for some reason the nim compiler trips.
proc `$`*(m: Message): string = repr m
suite "peer":
setup:
let engine = EventDrivenEngine()
let network = Network.new(engine = engine, defaultLinkDelay = 20)
test "should allow inclusion and membership tests on a HashSet":
var peerSet = HashSet[Peer]()
let p1 = Peer.new(protocols = @[], peerId = 1.some)
let p2 = Peer.new(protocols = @[], peerId = 2.some)
peerSet.incl(p1)
check(peerSet.contains(p1))
check(not peerSet.contains(p2))
peerSet.excl(p1)
check(not peerSet.contains(p1))
test "should dispatch message to correct protocol":
let i1 = Inbox(protocolId: "protocol1", messageTypes: @["m1"])
let i2 = Inbox(protocolId: "protocol2", messageTypes: @["m2"])
let peer = Peer.new(protocols = @[Protocol i1, i2])
let m1: Message = FreelyTypedMessage(receiver: peer, messageType: "m1")
let m2: Message = FreelyTypedMessage(receiver: peer, messageType: "m2")
peer.deliver(m1, engine, network)
check(i1.messages == @[m1])
check(i2.messages == seq[Message] @[])
peer.deliver(m2, engine, network)
check(i1.messages == @[m1])
check(i2.messages == @[m2])
test "should dispatch a message to multiple protocols if they are listening on the same message type":
let i1 = Inbox(protocolId: "protocol1", messageTypes: @["m1"])
let i2 = Inbox(protocolId: "protocol2", messageTypes: @["m1"])
let peer = Peer.new(protocols = @[Protocol i1, i2])
let m1: Message = FreelyTypedMessage(receiver: peer, messageType: "m1")
peer.deliver(m1, engine, network)
check(i1.messages == @[m1])
check(i2.messages == @[m1])
test "should allow protocol to listen on multiple message types":
let i1 = Inbox(protocolId: "protocol1", messageTypes: @["m1", "m2"])
let peer = Peer.new(protocols = @[Protocol i1])
let m1: Message = FreelyTypedMessage(receiver: peer, messageType: "m1")
let m2: Message = FreelyTypedMessage(receiver: peer, messageType: "m2")
let m3: Message = FreelyTypedMessage(receiver: peer, messageType: "m3")
peer.deliver(m1, engine, network)
peer.deliver(m2, engine, network)
peer.deliver(m3, engine, network)
check(i1.messages == @[m1, m2])
test "should deliver all message types when listening to Message.allMessages":
let i1 = Inbox(protocolId: "protocol1", messageTypes: @[Message.allMessages])
let peer = Peer.new(protocols = @[Protocol i1])
let m1: Message = FreelyTypedMessage(receiver: peer, messageType: "m1")
let m2: Message = FreelyTypedMessage(receiver: peer, messageType: "m2")
let m3: Message = FreelyTypedMessage(receiver: peer, messageType: "m3")
peer.deliver(m1, engine, network)
peer.deliver(m2, engine, network)
peer.deliver(m3, engine, network)
check(i1.messages == @[m1, m2, m3])
test "should be up after start":
let i1 = Inbox(protocolId: "lifecycleListener", messageTypes: @[])
let peer = Peer.new(protocols = @[Protocol i1])
peer.startAt(network, 5)
check(not peer.up)
engine.run()
check((repr i1.events) == (repr @[
LifecycleEvent(event: started, time: 5.uint64)]))
check(peer.up)
test "should not be up after going down":
let i1 = Inbox(protocolId: "lifecycleListener", messageTypes: @[])
let peer = Peer.new(protocols = @[Protocol i1])
peer.start(network)
peer.scheduleLifecycleChange(
event = down,
network = network,
time = 10
)
engine.run()
check((repr i1.events) == (repr @[
LifecycleEvent(event: started, time: 0),
LifecycleEvent(event: down, time: 10)
]))