nwaku/tests/v2/test_message_store_queue.nim

186 lines
4.6 KiB
Nim

{.used.}
import
std/[options, sequtils, algorithm],
stew/results,
testutils/unittests
import
../../waku/v2/node/message_store/queue_store,
../../waku/v2/protocol/waku_message,
../../waku/v2/protocol/waku_store,
../../waku/v2/utils/time
# Helper functions
proc genIndexedWakuMessage(i: int8): IndexedWakuMessage =
## Use i to generate an IndexedWakuMessage
var data {.noinit.}: array[32, byte]
for x in data.mitems: x = i.byte
let
message = WakuMessage(payload: @[byte i], timestamp: Timestamp(i))
cursor = Index(
receiverTime: Timestamp(i),
senderTime: Timestamp(i),
digest: MessageDigest(data: data),
pubsubTopic: "test-pubsub-topic"
)
IndexedWakuMessage(msg: message, index: cursor)
proc getPrepopulatedTestStore(unsortedSet: auto, capacity: int): StoreQueueRef =
let store = StoreQueueRef.new(capacity)
for i in unsortedSet:
let message = genIndexedWakuMessage(i.int8)
discard store.add(message)
store
procSuite "Sorted store queue":
test "Store capacity - add a message over the limit":
## Given
let capacity = 5
let store = StoreQueueRef.new(capacity)
## When
# Fill up the queue
for i in 1..capacity:
let message = genIndexedWakuMessage(i.int8)
require(store.add(message).isOk())
# Add one more. Capacity should not be exceeded
let message = genIndexedWakuMessage(capacity.int8 + 1)
require(store.add(message).isOk())
## Then
check:
store.len == capacity
test "Store capacity - add message older than oldest in the queue":
## Given
let capacity = 5
let store = StoreQueueRef.new(capacity)
## When
# Fill up the queue
for i in 1..capacity:
let message = genIndexedWakuMessage(i.int8)
require(store.add(message).isOk())
# Attempt to add message with older value than oldest in queue should fail
let
oldestTimestamp = store.first().get().index.senderTime
message = genIndexedWakuMessage(oldestTimestamp.int8 - 1)
addRes = store.add(message)
## Then
check:
addRes.isErr()
addRes.error() == "too_old"
check:
store.len == capacity
test "Store queue sort-on-insert works":
## Given
let
capacity = 5
unsortedSet = [5,1,3,2,4]
let store = getPrepopulatedTestStore(unsortedSet, capacity)
# Walk forward through the set and verify ascending order
var prevSmaller = genIndexedWakuMessage(min(unsortedSet).int8 - 1).index
for i in store.fwdIterator:
let (index, indexedWakuMessage) = i
check cmp(index, prevSmaller) > 0
prevSmaller = index
# Walk backward through the set and verify descending order
var prevLarger = genIndexedWakuMessage(max(unsortedSet).int8 + 1).index
for i in store.bwdIterator:
let (index, indexedWakuMessage) = i
check cmp(index, prevLarger) < 0
prevLarger = index
test "access first item from store queue":
## Given
let
capacity = 5
unsortedSet = [5,1,3,2,4]
let store = getPrepopulatedTestStore(unsortedSet, capacity)
## When
let firstRes = store.first()
## Then
check:
firstRes.isOk()
let first = firstRes.tryGet()
check:
first.msg.timestamp == Timestamp(1)
test "get first item from empty store should fail":
## Given
let capacity = 5
let store = StoreQueueRef.new(capacity)
## When
let firstRes = store.first()
## Then
check:
firstRes.isErr()
firstRes.error() == "Not found"
test "access last item from store queue":
## Given
let
capacity = 5
unsortedSet = [5,1,3,2,4]
let store = getPrepopulatedTestStore(unsortedSet, capacity)
## When
let lastRes = store.last()
## Then
check:
lastRes.isOk()
let last = lastRes.tryGet()
check:
last.msg.timestamp == Timestamp(5)
test "get last item from empty store should fail":
## Given
let capacity = 5
let store = StoreQueueRef.new(capacity)
## When
let lastRes = store.last()
## Then
check:
lastRes.isErr()
lastRes.error() == "Not found"
test "verify if store queue contains an index":
## Given
let
capacity = 5
unsortedSet = [5,1,3,2,4]
let store = getPrepopulatedTestStore(unsortedSet, capacity)
let
existingIndex = genIndexedWakuMessage(4).index
nonExistingIndex = genIndexedWakuMessage(99).index
## Then
check:
store.contains(existingIndex) == true
store.contains(nonExistingIndex) == false