2022-01-26 11:56:53 +00:00
|
|
|
# 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
|
2022-02-01 12:04:20 +00:00
|
|
|
std/[distros, os, strformat, strutils],
|
2022-01-26 11:56:53 +00:00
|
|
|
../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"
|
|
|
|
|
2022-02-01 12:04:20 +00:00
|
|
|
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
|
|
|
|
|
2022-01-26 11:56:53 +00:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# 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
|
|
|
|
|
2022-02-01 12:04:20 +00:00
|
|
|
tmpDir = if disablePersistentDB: "*notused*"
|
|
|
|
else: filePath.splitFile.dir / "tmp"
|
|
|
|
|
|
|
|
defer:
|
|
|
|
if not disablePersistentDB: tmpDir.flushDbDir
|
2022-01-26 11:56:53 +00:00
|
|
|
|
|
|
|
suite &"Kintsugi test scenario":
|
|
|
|
var
|
|
|
|
params: NetworkParams
|
2022-02-01 12:04:20 +00:00
|
|
|
mdb, ddb: BaseChainDB
|
2022-01-26 11:56:53 +00:00
|
|
|
|
|
|
|
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}":
|
2022-02-01 12:04:20 +00:00
|
|
|
if disablePersistentDB:
|
2022-01-26 11:56:53 +00:00
|
|
|
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
|
|
|
|
|
2022-02-01 12:04:20 +00:00
|
|
|
#[
|
2022-01-26 11:56:53 +00:00
|
|
|
test "Initialise persistent Genesis, expect AssertionError":
|
2022-02-01 12:04:20 +00:00
|
|
|
if disablePersistentDB:
|
2022-01-26 11:56:53 +00:00
|
|
|
skip()
|
|
|
|
else:
|
|
|
|
expect AssertionError:
|
|
|
|
ddb.initializeEmptyDb
|
2022-02-01 12:04:20 +00:00
|
|
|
#]#
|
|
|
|
|
|
|
|
test "Initialise persistent Genesis (kludge)":
|
|
|
|
if disablePersistentDB:
|
|
|
|
skip()
|
|
|
|
else:
|
|
|
|
ddb.initializeEmptyDb
|
2022-01-26 11:56:53 +00:00
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Main function(s)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
proc kintsugiMain*(noisy = defined(debug)) =
|
|
|
|
noisy.runner
|
|
|
|
|
|
|
|
when isMainModule:
|
|
|
|
var noisy = defined(debug)
|
|
|
|
#noisy = true
|
|
|
|
|
|
|
|
noisy.runner
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# End
|
|
|
|
# ------------------------------------------------------------------------------
|