nimbus-eth1/tests/test_kintsugi.nim

156 lines
4.9 KiB
Nim

# Nimbus
# Copyright (c) 2018-2019 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.
import
std/[distros, os, strformat, strutils],
../nimbus/[chain_config, config, genesis],
../nimbus/db/[db_chain, select_backend],
eth/[common, p2p, trie/db],
unittest2
const
baseDir = [".", "tests", ".." / "tests", $DirSep] # path containg repo
repoDir = ["status", "replay"] # alternative repo paths
jFile = "nimbus_kintsugi.json"
when defined(windows):
const isUbuntu32bit = false
else:
# The `detectOs(Ubuntu)` directive is not Windows compatible, causes an
# error when running the system command `lsb_release -d` in the background.
let isUbuntu32bit = detectOs(Ubuntu) and int.sizeof == 4
let
# There is a problem with the Github/CI which results in spurious crashes
# when leaving the `runner()` if the persistent BaseChainDB initialisation
# was present. The Github/CI set up for Linux/i386 is
#
# Ubuntu 10.04.06 LTS
# with repo kernel 5.4.0-1065-azure (see 'uname -a')
#
# base OS architecture is amd64
# with i386 foreign architecture
#
# nimbus binary is an
# ELF 32-bit LSB shared object,
# Intel 80386, version 1 (SYSV), dynamically linked,
#
disablePersistentDB = isUbuntu32bit
# ------------------------------------------------------------------------------
# Helpers
# ------------------------------------------------------------------------------
proc findFilePath(file: string): string =
result = "?unknown?" / file
for dir in baseDir:
for repo in repoDir:
let path = dir / repo / file
if path.fileExists:
return path
proc flushDbDir(s: string) =
let dataDir = s / "nimbus"
if (dataDir / "data").dirExists:
# Typically under Windows: there might be stale file locks.
try: dataDir.removeDir except: discard
# ------------------------------------------------------------------------------
# Private functions
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Test Runner
# ------------------------------------------------------------------------------
proc runner(noisy = true; file = jFile) =
let
fileInfo = file.splitFile.name.split(".")[0]
filePath = file.findFilePath
tmpDir = if disablePersistentDB: "*notused*"
else: filePath.splitFile.dir / "tmp"
defer:
if not disablePersistentDB: tmpDir.flushDbDir
suite &"Kintsugi test scenario":
var
params: NetworkParams
mdb, ddb: BaseChainDB
test &"Load params from {fileInfo}":
check filePath.loadNetworkParams(params)
test &"Construct in-memory BaseChainDB":
mdb = newBaseChainDB(
newMemoryDb(),
id = params.config.chainID.NetworkId,
params = params)
test &"Construct persistent BaseChainDB on {tmpDir}":
if disablePersistentDB:
skip()
else:
# Before allocating the database, the data directory needs to be
# cleared. There might be left overs from a previous crash or
# because there were file locks under Windows which prevented a
# previous clean up.
tmpDir.flushDbDir
# The effect of this constructor is roughly equivalent to the command
# line invocation of nimbus as
#
# nimbus \
# --data-dir:$tmpDir \
# --custom-network:$filePath \
# --prune-mode:full ...
#
# as described in https://github.com/status-im/nimbus-eth1/issues/932.
ddb = newBaseChainDB(
tmpDir.newChainDb.trieDB,
id = params.config.chainID.NetworkId,
params = params)
test "Initialise in-memory Genesis":
mdb.initializeEmptyDb
#[
test "Initialise persistent Genesis, expect AssertionError":
if disablePersistentDB:
skip()
else:
expect AssertionError:
ddb.initializeEmptyDb
#]#
test "Initialise persistent Genesis (kludge)":
if disablePersistentDB:
skip()
else:
ddb.initializeEmptyDb
# ------------------------------------------------------------------------------
# Main function(s)
# ------------------------------------------------------------------------------
proc kintsugiMain*(noisy = defined(debug)) =
noisy.runner
when isMainModule:
var noisy = defined(debug)
#noisy = true
noisy.runner
# ------------------------------------------------------------------------------
# End
# ------------------------------------------------------------------------------