import pkg/chronos import pkg/questionable import pkg/questionable/results import pkg/asynctest/chronos/unittest import ../../../codexcrawler/components/chainmetrics import ../../../codexcrawler/components/requeststore import ../../../codexcrawler/services/marketplace import ../../../codexcrawler/types import ../mocks/mockstate import ../mocks/mockmetrics import ../mocks/mockrequeststore import ../mocks/mockmarketplace import ../helpers suite "ChainMetrics": var state: MockState metrics: MockMetrics store: MockRequestStore marketplace: MockMarketplaceService chain: ChainMetrics setup: state = createMockState() metrics = createMockMetrics() store = createMockRequestStore() marketplace = createMockMarketplaceService() chain = ChainMetrics.new(state, metrics, store, marketplace) (await chain.start()).tryGet() teardown: (await chain.stop()).tryGet() state.checkAllUnsubscribed() proc onStep() {.async.} = (await state.steppers[0]()).tryGet() test "start should start stepper for 10 minutes": check: state.delays.len == 1 state.delays[0] == 10.minutes # iterate all requests in requestStore: # get state of request on chain # if failed/canceled/error: # if last-seen is old (1month?3months?) # delete entry # else (request is running): # count: # total running # total num slots # total size of request # iter finished: update metrics! test "onStep should remove non-running requests from request store": let rid = genRid() store.iterateEntries.add(RequestEntry(id: rid)) marketplace.requestInfoReturns = none(RequestInfo) await onStep() check: marketplace.requestInfoRid == rid store.removeRid == rid test "onStep should count the number of active requests": let rid1 = genRid() let rid2 = genRid() store.iterateEntries.add(RequestEntry(id: rid1)) store.iterateEntries.add(RequestEntry(id: rid2)) marketplace.requestInfoReturns = some(RequestInfo()) await onStep() check: metrics.requests == 2 test "onStep should count the number of active slots": let rid = genRid() store.iterateEntries.add(RequestEntry(id: rid)) let info = RequestInfo( slots: 123 ) marketplace.requestInfoReturns = some(info) await onStep() check: metrics.slots == info.slots.int test "onStep should count the total size of active slots": let rid = genRid() store.iterateEntries.add(RequestEntry(id: rid)) let info = RequestInfo( slots: 12, slotSize: 23 ) marketplace.requestInfoReturns = some(info) await onStep() check: metrics.totalSize == (info.slots * info.slotSize).int