# Nimbus # Copyright (c) 2023-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. ## Re-invented implementation for Merkle Patricia Tree named as Aristo Trie import std/[os, strformat, strutils], chronicles, eth/common, results, unittest2, ../nimbus/db/aristo/aristo_desc, ./replay/[pp, undump_accounts, undump_storages], ./test_aristo/test_short_keys, ./test_aristo/test_blobify, ./test_aristo/[test_balancer, test_helpers, test_samples_xx, test_tx] const baseDir = [".", "..", ".." / "..", $DirSep] repoDir = [".", "tests", "nimbus-eth1-blobs"] subDir = ["replay", "test_aristo", "replay" / "snap"] # Reference file for finding the database directory sampleDirRefFile = "sample0.txt.gz" # Standard test samples accSample = snapTest0 storSample = snapTest4 # ------------------------------------------------------------------------------ # 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 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) # ------------------------------------------------------------------------------ # Test Runners: accounts and accounts storages # ------------------------------------------------------------------------------ proc accountsRunner( noisy = true, sample = accSample, resetDb = false, cmpBackends = true, persistent = true, ) = let accLst = sample.to(seq[UndumpAccounts]).to(seq[ProofTrieData]) fileInfo = sample.file.splitPath.tail.replace(".txt.gz", "") listMode = if resetDb: "" else: ", merged dumps" baseDir = getTmpDir() / sample.name & "-accounts" dbDir = if persistent: baseDir / "tmp" else: "" isPersistent = if persistent: "persistent DB" else: "mem DB only" defer: try: baseDir.removeDir except CatchableError: discard suite &"Aristo: accounts data dump from {fileInfo}{listMode}, {isPersistent}": test &"Merge {accLst.len} proof & account lists to database": check noisy.testTxMergeProofAndKvpList(accLst, dbDir, resetDb) test &"Delete accounts database successively, {accLst.len} lists": check noisy.testTxMergeAndDeleteOneByOne(accLst, dbDir) test &"Delete accounts database sub-trees, {accLst.len} lists": check noisy.testTxMergeAndDeleteSubTree(accLst, dbDir) test &"Distributed backend balancers {accLst.len} entries": check noisy.testBalancer(accLst, dbDir) proc storagesRunner( noisy = true, sample = storSample, resetDb = false, oops: KnownHasherFailure = @[], cmpBackends = true, persistent = true, ) = let stoLst = sample.to(seq[UndumpStorages]).to(seq[ProofTrieData]) fileInfo = sample.file.splitPath.tail.replace(".txt.gz", "") listMode = if resetDb: "" else: ", merged dumps" baseDir = getTmpDir() / sample.name & "-storage" dbDir = if persistent: baseDir / "tmp" else: "" isPersistent = if persistent: "persistent DB" else: "mem DB only" defer: try: baseDir.removeDir except CatchableError: discard suite &"Aristo: storages data dump from {fileInfo}{listMode}, {isPersistent}": test &"Merge {stoLst.len} proof & slots lists to database": check noisy.testTxMergeProofAndKvpList(stoLst, dbDir, resetDb, fileInfo, oops) test &"Delete storage database successively, {stoLst.len} lists": check noisy.testTxMergeAndDeleteOneByOne(stoLst, dbDir) test &"Delete storage database sub-trees, {stoLst.len} lists": check noisy.testTxMergeAndDeleteSubTree(stoLst, dbDir) test &"Distributed backend balancers {stoLst.len} entries": check noisy.testBalancer(stoLst, dbDir) # ------------------------------------------------------------------------------ # Main function(s) # ------------------------------------------------------------------------------ proc aristoMain*(noisy = defined(debug)) = noisy.storagesRunner() when isMainModule: const noisy = defined(debug) or true setErrorLevel() when true and false: # Verify Problem with the database for production test noisy.aristoMain() when true: # and false: let persistent = false # or true noisy.showElapsed("@snap_test_list"): for n, sam in snapTestList: noisy.accountsRunner(sam, persistent = persistent) noisy.showElapsed("@snap_test_storage_list"): for n, sam in snapTestStorageList: noisy.accountsRunner(sam, persistent = persistent) noisy.storagesRunner(sam, persistent = persistent) # ------------------------------------------------------------------------------ # End # ------------------------------------------------------------------------------