mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-01-25 03:28:57 +00:00
1ffac5b2ea
details: Persistent pruning would not restore the `emptyRlp` value for the root node when the database becomes empty. This effects to an assertion exception next time the DB is accessed. As most unit tests run on the memory DB, this case slipped through unnoticed for a while (see also issue #9.)
162 lines
5.1 KiB
Nim
162 lines
5.1 KiB
Nim
# Nimbus - Types, data structures and shared utilities used in network sync
|
|
#
|
|
# Copyright (c) 2018-2021 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
# http://opensource.org/licenses/MIT)
|
|
# at your option. This file may not be copied, modified, or
|
|
# distributed except according to those terms.
|
|
|
|
## Testing `CoreDB` wrapper implementation
|
|
|
|
import
|
|
std/[os, strformat, strutils],
|
|
chronicles,
|
|
eth/common,
|
|
results,
|
|
unittest2,
|
|
../../nimbus/[db/core_db/persistent, core/chain],
|
|
./replay/pp,
|
|
./test_coredb/[coredb_test_xx, test_legacy]
|
|
|
|
const
|
|
baseDir = [".", "..", ".."/"..", $DirSep]
|
|
repoDir = [".", "tests", "nimbus-eth1-blobs"]
|
|
subDir = ["replay", "test_coredb"]
|
|
|
|
# Reference file for finding some database directory base
|
|
sampleDirRefFile = "coredb_test_xx.nim"
|
|
|
|
# Standard test sample
|
|
bChainCapture = bulkTest0
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Helpers
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc findFilePath(
|
|
file: string;
|
|
baseDir: openArray[string] = baseDir;
|
|
repoDir: openArray[string] = repoDir;
|
|
subDir: openArray[string] = subDir;
|
|
): Result[string,void] =
|
|
for dir in baseDir:
|
|
if dir.dirExists:
|
|
for repo in repoDir:
|
|
if (dir / repo).dirExists:
|
|
for sub in subDir:
|
|
if (dir / repo / sub).dirExists:
|
|
let path = dir / repo / sub / file
|
|
if path.fileExists:
|
|
return ok(path)
|
|
echo "*** File not found \"", file, "\"."
|
|
err()
|
|
|
|
proc getTmpDir(sampleDir = sampleDirRefFile): string =
|
|
sampleDir.findFilePath.value.splitFile.dir
|
|
|
|
proc flushDbDir(s: string) =
|
|
if s != "":
|
|
let dataDir = s / "nimbus"
|
|
if (dataDir / "data").dirExists:
|
|
# Typically under Windows: there might be stale file locks.
|
|
try: dataDir.removeDir except CatchableError: discard
|
|
block dontClearUnlessEmpty:
|
|
for w in s.walkDir:
|
|
break dontClearUnlessEmpty
|
|
try: s.removeDir except CatchableError: discard
|
|
|
|
# ----------------
|
|
|
|
proc setTraceLevel {.used.} =
|
|
discard
|
|
when defined(chronicles_runtime_filtering) and loggingEnabled:
|
|
setLogLevel(LogLevel.TRACE)
|
|
|
|
proc setErrorLevel {.used.} =
|
|
discard
|
|
when defined(chronicles_runtime_filtering) and loggingEnabled:
|
|
setLogLevel(LogLevel.ERROR)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Private functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc openLegacyDB(
|
|
persistent: bool;
|
|
path: string;
|
|
network: NetworkId;
|
|
): CommonRef =
|
|
let coreDB = if not persistent: newCoreDbRef LegacyDbMemory
|
|
else: newCoreDbRef(LegacyDbPersistent, path)
|
|
result = CommonRef.new(
|
|
db = coreDB,
|
|
networkId = network,
|
|
params = network.networkParams)
|
|
result.initializeEmptyDb
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Test Runners: accounts and accounts storages
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc legacyRunner(
|
|
noisy = true;
|
|
capture = bChainCapture;
|
|
persistent = true;
|
|
) =
|
|
## Test legacy backend database
|
|
let
|
|
fileInfo = capture.file.splitFile.name.split(".")[0]
|
|
filePath = capture.file.findFilePath(baseDir,repoDir).value
|
|
baseDir = getTmpDir() / capture.name & "-legacy"
|
|
dbDir = if persistent: baseDir / "tmp" else: ""
|
|
sayPersistent = if persistent: "persistent DB" else: "mem DB only"
|
|
numBlocks = capture.numBlocks
|
|
numBlocksInfo = if numBlocks == high(int): "" else: $numBlocks & " "
|
|
|
|
defer:
|
|
if persistent: baseDir.flushDbDir
|
|
|
|
suite "Legacy DB: test Core API interfaces"&
|
|
&", capture={fileInfo}, {sayPersistent}":
|
|
|
|
test &"Legaci API, {numBlocksInfo} blocks":
|
|
let
|
|
com = openLegacyDB(persistent, dbDir, capture.network)
|
|
defer:
|
|
com.db.finish(flush = true)
|
|
if persistent: dbDir.flushDbDir
|
|
|
|
check noisy.testChainSyncLegacyApi(filePath, com, numBlocks)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Main function(s)
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc coreDbMain*(noisy = defined(debug)) =
|
|
noisy.legacyRunner()
|
|
|
|
when isMainModule:
|
|
const
|
|
noisy = defined(debug) or true
|
|
persDb = true
|
|
|
|
setErrorLevel()
|
|
|
|
# This one uses the readily available dump: `bulkTest0` and some huge replay
|
|
# dumps `bulkTest2`, `bulkTest3`, .. from the `nimbus-eth1-blobs` package.
|
|
# For specs see `tests/test_coredb/bulk_test_xx.nim`.
|
|
var testList = @[bulkTest0]
|
|
testList = @[bulkTest1] # This test supersedes `bulkTest0`
|
|
when true and false:
|
|
testList = @[bulkTest1, bulkTest2, bulkTest3]
|
|
|
|
for n,capture in testList:
|
|
noisy.legacyRunner(capture=capture, persistent=persDb)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# End
|
|
# ------------------------------------------------------------------------------
|