mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-03-03 21:30:53 +00:00
* Refactor TxPool: leaner and simpler * Rewrite test_txpool Reduce number of tables used, from 5 to 2. Reduce number of files. If need to modify the price rule or other filters, now is far more easier because only one table to work with(sender/nonce). And the other table is just a map from txHash to TxItemRef. Removing transactions from txPool either because of producing new block or syncing became much easier. Removing expired transactions also simple. Explicit Tx Pending, Staged, or Packed status is removed. The status of the transactions can be inferred implicitly. Developer new to TxPool can easily follow the logic. But the most important is we can revive the test_txpool without dirty trick and remove usage of getCanonicalHead furthermore to prepare for better integration with ForkedChain.
112 lines
2.9 KiB
Nim
112 lines
2.9 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2021-2024 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
# at your option.
|
|
# This file may not be copied, modified, or distributed except according to
|
|
# those terms.
|
|
|
|
import
|
|
std/[os, json, times],
|
|
eth/p2p,
|
|
../../../nimbus/sync/protocol,
|
|
../../../nimbus/config,
|
|
../../../nimbus/graphql/ethapi,
|
|
../../../tests/test_helpers,
|
|
../../../nimbus/core/[tx_pool, block_import],
|
|
../../../nimbus/common,
|
|
graphql, ../sim_utils
|
|
|
|
const
|
|
baseFolder = "hive_integration" / "nodocker" / "graphql"
|
|
blocksFile = baseFolder / "init" / "blocks.rlp"
|
|
genesisFile = baseFolder / "init" / "genesis.json"
|
|
caseFolder = baseFolder / "testcases"
|
|
|
|
template testCond(expr: untyped) =
|
|
if not (expr):
|
|
result = TestStatus.Failed
|
|
|
|
proc processNode(ctx: GraphqlRef, node: JsonNode, fileName: string): TestStatus =
|
|
let request = node["request"]
|
|
let responses = node["responses"]
|
|
let statusCode = node["statusCode"].getInt()
|
|
|
|
let savePoint = ctx.getNameCounter()
|
|
let res = ctx.parseQuery(request.getStr())
|
|
|
|
result = TestStatus.OK
|
|
block:
|
|
if res.isErr:
|
|
if statusCode == 200:
|
|
debugEcho res.error
|
|
testCond statusCode != 200
|
|
break
|
|
|
|
let resp = JsonRespStream.new()
|
|
let r = ctx.executeRequest(respStream(resp))
|
|
if r.isErr:
|
|
if statusCode == 200:
|
|
debugEcho r.error
|
|
testCond statusCode != 200
|
|
break
|
|
|
|
testCond statusCode == 200
|
|
testCond r.isOk
|
|
|
|
let nimbus = resp.getString()
|
|
var resultOK = false
|
|
for x in responses:
|
|
let hive = $(x["data"])
|
|
if nimbus == hive:
|
|
resultOK = true
|
|
break
|
|
|
|
testCond resultOK
|
|
if not resultOK:
|
|
debugEcho "NIMBUS RESULT: ", nimbus
|
|
for x in responses:
|
|
let hive = $(x["data"])
|
|
debugEcho "HIVE RESULT: ", hive
|
|
|
|
ctx.purgeQueries()
|
|
ctx.purgeNames(savePoint)
|
|
|
|
proc main() =
|
|
let
|
|
conf = makeConfig(@["--custom-network:" & genesisFile])
|
|
ethCtx = newEthContext()
|
|
ethNode = setupEthNode(conf, ethCtx, eth)
|
|
com = CommonRef.new(newCoreDbRef DefaultDbMemory,
|
|
Taskpool.new(),
|
|
conf.networkId,
|
|
conf.networkParams
|
|
)
|
|
chain = ForkedChainRef.init(com)
|
|
txPool = TxPoolRef.new(chain)
|
|
|
|
discard importRlpBlock(blocksFile, com)
|
|
let ctx = setupGraphqlContext(com, ethNode, txPool)
|
|
|
|
var stat: SimStat
|
|
let start = getTime()
|
|
|
|
for fileName in walkDirRec(
|
|
caseFolder, yieldFilter = {pcFile,pcLinkToFile}):
|
|
if not fileName.endsWith(".json"):
|
|
continue
|
|
|
|
let (_, name) = fileName.splitPath()
|
|
let node = parseFile(fileName)
|
|
let status = ctx.processNode(node, fileName)
|
|
stat.inc(name, status)
|
|
|
|
# simulate the real simulator
|
|
txPool.disposeAll()
|
|
|
|
let elpd = getTime() - start
|
|
print(stat, elpd, "graphql")
|
|
|
|
main()
|