mirror of
https://github.com/status-im/nim-dagger.git
synced 2025-02-04 19:04:04 +00:00
92a0eda79a
* adds a new overload of queryPastEvents allowing to query past events based on timestamp in the past * adds state restoration to validator * refactors a bit to get the tests back to work * replaces deprecated generic methods from Market with methods for specific event types * Refactors binary search * adds market tests for querying past SlotFilled events and binary search * Takes into account that <<earliest>> block available is not necessarily the genesis block * Adds more logging and makes testing earliest block boundary more reliable * adds validation tests for historical state restoration * adds mockprovider to simplify and improve testing of the edge conditions * adds slot reservation to the new tests after rebasing * adds validation groups and group index in logs of validator * adds integration test with two validators * adds comment on how to enable logging in integration test executable itself * testIntegration: makes list is running nodes injected and available in the body of the test * validation: adds integration test for historical state * adds more logging to validator * integration test: validator only looks 30 days back for historical state * adds logging of the slotState when removing slots during validation * review and refactor validator integration tests * adds validation to the set of integration tests * Fixes mistyped name of the mock provider module in testMarket * Fixes a typo in the name of the validation suite in integration tests * Makes validation unit test a bit easier to follow * better use of logScopes to reduce duplication * improves timing and clarifies the test conditions * uses http as default RPC provider for nodes running in integration tests as a workaround for dropped subscriptions * simplifies the validation integration tests by waiting for failed request instead of tracking slots * adds config option allowing selectively to set different provider url * Brings back the default settings for RPC provider in integration tests * use http RPC provider for clients in validation integration tests * fine-tune the tests * Makes validator integration test more robust - adds extra tracking * brings tracking of marketplace event back to validator integration test * refactors integration tests * deletes tmp file * adds <<return>> after forcing integration test to fail preliminarily * re-enables all integration tests and matrix * stops debug output in CI * allows to choose a different RPC provider for a given integration test suite * fixes signature of <<getBlock>> method in mockProvider * adds missing import which seem to be braking integration tests on windows * makes sure that clients, SPs, and validators use the same provider url * makes validator integration tests using http at 127.0.0.1:8545 * testvalidator: stop resubscribing as we are now using http polling as rpc provider * applying review comments * groups queryPastStorage overrides together (review comment) * groups the historical validation tests into a sub suite * removes the temporary extensions in marketplacesuite and multinodesuite allowing to specify provider url * simplifies validation integration tests * Removes debug logs when waiting for request to fail * Renaming waitForRequestFailed => waitForRequestToFail * renames blockNumberForBlocksAgo to pastBlockTag and makes it private * removes redundant debugging logs * refines logging in validation * removes dev logging from mockmarket * improves exception handling in provider helper procs and prepares for extraction to a separate module * Uses chronos instead of std/times for Duration * extracts provider and binary search helpers to a separate module * removes redundant log entry params from validator * unifies the notation to consistently use method call syntax * reuses ProviderError from nim-ethers in the provider extension * clarifies the comment in multinodesuite * uses == operator to check the predefined tags and raises exception when `BlockTag.pending` is requested. * when waiting for request to fail, we break on any request state that is not Started * removes tests that were moved to testProvider from testMarket * extracts tests that use MockProvider to a separate async suite * improves performance of the historical state restoration * removing redundant log messages in validator (groupIndex and groups) * adds testProvider to testContracts group * removes unused import in testMarket
86 lines
2.6 KiB
Nim
86 lines
2.6 KiB
Nim
import std/strutils
|
|
import std/tables
|
|
|
|
import pkg/ethers/provider
|
|
from codex/clock import SecondsSince1970
|
|
|
|
export provider.Block
|
|
|
|
type MockProvider* = ref object of Provider
|
|
blocks: OrderedTableRef[int, Block]
|
|
earliest: ?int
|
|
latest: ?int
|
|
|
|
method getBlock*(
|
|
provider: MockProvider,
|
|
tag: BlockTag
|
|
): Future[?Block] {.async: (raises:[ProviderError]).} =
|
|
try:
|
|
if tag == BlockTag.latest:
|
|
if latestBlock =? provider.latest:
|
|
if provider.blocks.hasKey(latestBlock):
|
|
return provider.blocks[latestBlock].some
|
|
elif tag == BlockTag.earliest:
|
|
if earliestBlock =? provider.earliest:
|
|
if provider.blocks.hasKey(earliestBlock):
|
|
return provider.blocks[earliestBlock].some
|
|
elif tag == BlockTag.pending:
|
|
raiseAssert "MockProvider does not yet support BlockTag.pending"
|
|
else:
|
|
let blockNumber = parseHexInt($tag)
|
|
if provider.blocks.hasKey(blockNumber):
|
|
return provider.blocks[blockNumber].some
|
|
return Block.none
|
|
except:
|
|
return Block.none
|
|
|
|
|
|
proc updateEarliestAndLatest(provider: MockProvider, blockNumber: int) =
|
|
if provider.earliest.isNone:
|
|
provider.earliest = blockNumber.some
|
|
provider.latest = blockNumber.some
|
|
|
|
proc addBlocks*(provider: MockProvider, blocks: OrderedTableRef[int, Block]) =
|
|
for number, blk in blocks.pairs:
|
|
if provider.blocks.hasKey(number):
|
|
continue
|
|
provider.updateEarliestAndLatest(number)
|
|
provider.blocks[number] = blk
|
|
|
|
proc addBlock*(provider: MockProvider, number: int, blk: Block) =
|
|
if not provider.blocks.hasKey(number):
|
|
provider.updateEarliestAndLatest(number)
|
|
provider.blocks[number] = blk
|
|
|
|
proc newMockProvider*(): MockProvider =
|
|
MockProvider(
|
|
blocks: newOrderedTable[int, Block](),
|
|
earliest: int.none,
|
|
latest: int.none
|
|
)
|
|
|
|
proc newMockProvider*(blocks: OrderedTableRef[int, Block]): MockProvider =
|
|
let provider = newMockProvider()
|
|
provider.addBlocks(blocks)
|
|
provider
|
|
|
|
proc newMockProvider*(
|
|
numberOfBlocks: int,
|
|
earliestBlockNumber: int,
|
|
earliestBlockTimestamp: SecondsSince1970,
|
|
timeIntervalBetweenBlocks: SecondsSince1970
|
|
): MockProvider =
|
|
var blocks = newOrderedTable[int, provider.Block]()
|
|
var blockNumber = earliestBlockNumber
|
|
var blockTime = earliestBlockTimestamp
|
|
for i in 0..<numberOfBlocks:
|
|
blocks[blockNumber] = provider.Block(number: blockNumber.u256.some,
|
|
timestamp: blockTime.u256, hash: BlockHash.none)
|
|
inc blockNumber
|
|
inc blockTime, timeIntervalBetweenBlocks.int
|
|
MockProvider(
|
|
blocks: blocks,
|
|
earliest: earliestBlockNumber.some,
|
|
latest: (earliestBlockNumber + numberOfBlocks - 1).some
|
|
)
|