147 lines
4.0 KiB
Nim
Raw Normal View History

2025-02-11 16:31:23 +01:00
import pkg/chronos
import pkg/questionable/results
import pkg/asynctest/chronos/unittest
import ../../../codexcrawler/components/timetracker
import ../../../codexcrawler/components/nodestore
import ../../../codexcrawler/utils/asyncdataevent
import ../../../codexcrawler/types
import ../../../codexcrawler/state
2025-02-12 14:48:57 +01:00
import ../mocks/mockstate
import ../mocks/mocknodestore
import ../mocks/mockdht
2025-02-13 10:49:50 +01:00
import ../mocks/mockclock
2025-02-11 16:31:23 +01:00
import ../helpers
suite "TimeTracker":
2025-02-13 10:49:50 +01:00
let now = 123456789.uint64
2025-02-11 16:31:23 +01:00
var
nid: Nid
state: MockState
store: MockNodeStore
2025-02-13 10:49:50 +01:00
clock: MockClock
dht: MockDht
2025-02-11 16:31:23 +01:00
time: TimeTracker
nodesToRevisitReceived: seq[Nid]
2025-02-11 16:31:23 +01:00
sub: AsyncDataEventSubscription
setup:
nid = genNid()
state = createMockState()
store = createMockNodeStore()
2025-02-13 10:49:50 +01:00
clock = createMockClock()
dht = createMockDht()
2025-02-11 16:31:23 +01:00
2025-02-13 10:49:50 +01:00
clock.setNow = now
# Subscribe to nodesToRevisit event
nodesToRevisitReceived = newSeq[Nid]()
2025-06-02 16:16:41 +02:00
proc onToRevisit(
nids: seq[Nid]
): Future[?!void] {.async: (raises: [CancelledError]).} =
nodesToRevisitReceived = nids
2025-02-11 16:31:23 +01:00
return success()
sub = state.events.nodesToRevisit.subscribe(onToRevisit)
2025-02-11 16:31:23 +01:00
2025-02-13 12:35:19 +01:00
state.config.checkDelayMins = 11
state.config.expiryDelayMins = 22
2025-02-11 16:31:23 +01:00
2025-02-13 10:49:50 +01:00
time = TimeTracker.new(state, store, dht, clock)
2025-02-11 16:31:23 +01:00
(await time.start()).tryGet()
teardown:
await state.events.nodesToRevisit.unsubscribe(sub)
2025-02-11 16:31:23 +01:00
state.checkAllUnsubscribed()
2025-06-02 15:30:12 +02:00
proc onStepCheck() {.async: (raises: []).} =
try:
(await state.steppers[0]()).tryGet()
except CatchableError:
raiseAssert("CatchableError in onStepCheck")
2025-02-13 12:35:19 +01:00
2025-06-02 15:30:12 +02:00
proc onStepRt() {.async: (raises: []).} =
try:
(await state.steppers[1]()).tryGet()
except CatchableError:
raiseAssert("CatchableError in onStepRt")
2025-02-12 13:25:37 +01:00
proc createNodeInStore(lastVisit: uint64, firstInactive = 0.uint64): Nid =
let entry =
NodeEntry(id: genNid(), lastVisit: lastVisit, firstInactive: firstInactive)
2025-02-11 16:31:23 +01:00
store.nodesToIterate.add(entry)
return entry.id
test "start sets steppers for check and routingtable load":
2025-02-13 12:35:19 +01:00
check:
state.delays[0] == state.config.checkDelayMins.minutes
state.delays[1] == 30.minutes
test "onStep fires nodesToRevisit event for nodes past revisit timestamp":
2025-02-11 16:31:23 +01:00
let
revisitTimestamp = now - ((state.config.revisitDelayMins + 1) * 60).uint64
revisitNodeId = createNodeInStore(revisitTimestamp)
2025-02-11 16:31:23 +01:00
await onStepCheck()
2025-02-11 16:31:23 +01:00
check:
revisitNodeId in nodesToRevisitReceived
2025-02-11 16:31:23 +01:00
test "onStep does not fire nodesToRevisit event for nodes that are recent":
2025-02-11 16:31:23 +01:00
let
recentTimestamp = now - ((state.config.revisitDelayMins - 1) * 60).uint64
2025-02-11 16:31:23 +01:00
recentNodeId = createNodeInStore(recentTimestamp)
await onStepCheck()
check:
recentNodeId notin nodesToRevisitReceived
test "onStep deletes nodes with past expired inactivity timestamp":
let
expiredTimestamp = now - ((state.config.expiryDelayMins + 1) * 60).uint64
expiredNodeId = createNodeInStore(now, expiredTimestamp)
await onStepCheck()
check:
expiredNodeId in store.nodesToDelete
test "onStep does not delete nodes with recent inactivity timestamp":
let
recentTimestamp = now - ((state.config.expiryDelayMins - 1) * 60).uint64
recentNodeId = createNodeInStore(now, recentTimestamp)
await onStepCheck()
check:
recentNodeId notin store.nodesToDelete
test "onStep does not delete nodes with zero inactivity timestamp":
let activeNodeId = createNodeInStore(now, 0.uint64)
await onStepCheck()
2025-02-11 16:31:23 +01:00
check:
activeNodeId notin store.nodesToDelete
test "onStep raises routingTable nodes as nodesFound":
var nodesFound = newSeq[Nid]()
2025-06-02 16:16:41 +02:00
proc onNodesFound(
nids: seq[Nid]
): Future[?!void] {.async: (raises: [CancelledError]).} =
nodesFound = nids
return success()
let sub = state.events.nodesFound.subscribe(onNodesFound)
dht.routingTable.add(nid)
2025-02-13 12:35:19 +01:00
await onStepRt()
check:
nid in nodesFound
await state.events.nodesFound.unsubscribe(sub)