110 lines
3.7 KiB
Nim
110 lines
3.7 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2022-2024 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/[os, sequtils, strformat, strutils, times],
|
|
./replay/[pp, gunzip],
|
|
../nimbus/core/[pow, pow/pow_cache],
|
|
eth/common,
|
|
unittest2
|
|
|
|
const
|
|
baseDir = [".", "tests", ".." / "tests", $DirSep] # path containg repo
|
|
repoDir = ["replay"] # alternative repos
|
|
|
|
specsDump = "mainspecs2k.txt.gz"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Helpers
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc say*(noisy = false; pfx = "***"; args: varargs[string, `$`]) =
|
|
if noisy:
|
|
if args.len == 0:
|
|
echo "*** ", pfx
|
|
elif 0 < pfx.len and pfx[^1] != ' ':
|
|
echo pfx, " ", args.toSeq.join
|
|
else:
|
|
echo pfx, args.toSeq.join
|
|
|
|
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
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Test Runners
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc runPowTests(noisy = true; file = specsDump;
|
|
nVerify = int.high; nFakeMiner = 0, nRealMiner = 0) =
|
|
let
|
|
filePath = file.findFilePath
|
|
fileInfo = file.splitFile.name.split(".")[0]
|
|
|
|
powCache = PowCacheRef.new # so we can inspect the LRU caches
|
|
pow = PowRef.new(powCache)
|
|
|
|
var specsList: seq[PowSpecs]
|
|
|
|
suite &"PoW: Header test specs from {fileInfo} capture":
|
|
block:
|
|
test "Loading from capture":
|
|
for (lno,line) in gunzipLines(filePath):
|
|
let specs = line.undumpPowSpecs
|
|
if 0 < specs.blockNumber:
|
|
specsList.add specs
|
|
check line == specs.dumpPowSpecs
|
|
noisy.say "***", " block range #",
|
|
specsList[0].blockNumber, " .. #", specsList[^1].blockNumber
|
|
|
|
# Adjust number of tests
|
|
let
|
|
startVerify = max(0, specsList.len - nVerify)
|
|
nDoVerify = specsList.len - startVerify
|
|
|
|
block:
|
|
test &"Running single getPowDigest() to fill the cache":
|
|
if nVerify <= 0:
|
|
skip()
|
|
else:
|
|
noisy.showElapsed(&"first getPowDigest() instance"):
|
|
let p = specsList[startVerify]
|
|
check pow.getPowDigest(p).mixDigest == p.mixDigest
|
|
|
|
test &"Running getPowDigest() on {nDoVerify} specs records":
|
|
if nVerify <= 0:
|
|
skip()
|
|
else:
|
|
noisy.showElapsed(&"all {nDoVerify} getPowDigest() instances"):
|
|
for n in startVerify ..< specsList.len:
|
|
let p = specsList[n]
|
|
check pow.getPowDigest(p).mixDigest == p.mixDigest
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Main function(s)
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc powMain*(noisy = defined(debug)) =
|
|
noisy.runPowTests(nVerify = 100)
|
|
|
|
when isMainModule:
|
|
# Note:
|
|
# 0 < nFakeMiner: allow ~20 minuntes for building lookup table
|
|
# 0 < nRealMiner: takes days/months/years ...
|
|
true.runPowTests(nVerify = 200, nFakeMiner = 200, nRealMiner = 5)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# End
|
|
# ------------------------------------------------------------------------------
|