2019-09-03 03:12:09 +00:00
|
|
|
# beacon_chain
|
2022-01-05 08:42:56 +00:00
|
|
|
# Copyright (c) 2018-2022 Status Research & Development GmbH
|
2019-09-03 03:12:09 +00:00
|
|
|
# Licensed and distributed under either of
|
2019-11-25 15:30:02 +00:00
|
|
|
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
|
|
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
2019-09-03 03:12:09 +00:00
|
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
|
|
|
|
import
|
|
|
|
# Standard library
|
2021-08-18 18:57:58 +00:00
|
|
|
std/[os, strutils, typetraits],
|
2019-09-03 03:12:09 +00:00
|
|
|
# Internals
|
2021-08-18 18:57:58 +00:00
|
|
|
../../beacon_chain/spec/[
|
2021-10-13 14:24:36 +00:00
|
|
|
eth2_merkleization, eth2_ssz_serialization],
|
2021-05-24 08:42:40 +00:00
|
|
|
# Status libs,
|
|
|
|
snappy,
|
2021-08-18 18:57:58 +00:00
|
|
|
stew/byteutils
|
2019-09-03 03:12:09 +00:00
|
|
|
|
2021-08-18 18:57:58 +00:00
|
|
|
export
|
|
|
|
eth2_merkleization, eth2_ssz_serialization
|
2019-09-03 03:12:09 +00:00
|
|
|
|
2020-01-27 10:56:32 +00:00
|
|
|
# Process current EF test format
|
2019-09-03 03:12:09 +00:00
|
|
|
# ---------------------------------------------
|
|
|
|
|
|
|
|
# #######################
|
|
|
|
# JSON deserialization
|
|
|
|
|
2021-05-24 08:42:40 +00:00
|
|
|
func readValue*(r: var JsonReader, a: var seq[byte]) =
|
2019-09-03 03:12:09 +00:00
|
|
|
## Custom deserializer for seq[byte]
|
|
|
|
a = hexToSeqByte(r.readValue(string))
|
|
|
|
|
|
|
|
# #######################
|
|
|
|
# Test helpers
|
|
|
|
|
2020-05-11 16:27:44 +00:00
|
|
|
type
|
|
|
|
UnconsumedInput* = object of CatchableError
|
|
|
|
TestSizeError* = object of ValueError
|
|
|
|
|
2021-12-13 15:45:48 +00:00
|
|
|
# https://github.com/ethereum/consensus-specs/tree/v1.1.6/tests/formats/rewards#rewards-tests
|
2021-10-19 14:38:41 +00:00
|
|
|
Deltas* = object
|
|
|
|
rewards*: List[uint64, Limit VALIDATOR_REGISTRY_LIMIT]
|
|
|
|
penalties*: List[uint64, Limit VALIDATOR_REGISTRY_LIMIT]
|
|
|
|
|
2022-01-04 03:57:15 +00:00
|
|
|
# https://github.com/ethereum/consensus-specs/blob/v1.1.8/specs/phase0/validator.md#eth1block
|
2021-10-20 11:36:38 +00:00
|
|
|
Eth1Block* = object
|
|
|
|
timestamp*: uint64
|
|
|
|
deposit_root*: Eth2Digest
|
|
|
|
deposit_count*: uint64
|
|
|
|
# All other eth1 block fields
|
|
|
|
|
2019-09-03 03:12:09 +00:00
|
|
|
const
|
2020-06-16 15:12:59 +00:00
|
|
|
FixturesDir* =
|
|
|
|
currentSourcePath.rsplit(DirSep, 1)[0] / ".." / ".." / "vendor" / "nim-eth2-scenarios"
|
2022-01-05 13:41:39 +00:00
|
|
|
SszTestsDir* = FixturesDir / "tests-v" & SPEC_VERSION
|
2021-05-24 08:42:40 +00:00
|
|
|
MaxObjectSize* = 3_000_000
|
2019-09-03 03:12:09 +00:00
|
|
|
|
2021-05-24 08:42:40 +00:00
|
|
|
proc parseTest*(path: string, Format: typedesc[Json], T: typedesc): T =
|
2019-09-03 03:12:09 +00:00
|
|
|
try:
|
|
|
|
# debugEcho " [Debug] Loading file: \"", path, '\"'
|
|
|
|
result = Format.loadFile(path, T)
|
|
|
|
except SerializationError as err:
|
|
|
|
writeStackTrace()
|
|
|
|
stderr.write $Format & " load issue for file \"", path, "\"\n"
|
|
|
|
stderr.write err.formatMsg(path), "\n"
|
|
|
|
quit 1
|
2020-05-11 16:27:44 +00:00
|
|
|
|
|
|
|
template readFileBytes*(path: string): seq[byte] =
|
|
|
|
cast[seq[byte]](readFile(path))
|
|
|
|
|
2020-10-28 18:35:31 +00:00
|
|
|
proc sszDecodeEntireInput*(input: openArray[byte], Decoded: type): Decoded =
|
2020-05-11 16:27:44 +00:00
|
|
|
var stream = unsafeMemoryInput(input)
|
2020-05-28 12:36:37 +00:00
|
|
|
var reader = init(SszReader, stream)
|
2020-05-27 15:04:43 +00:00
|
|
|
reader.readValue(result)
|
2020-05-11 16:27:44 +00:00
|
|
|
|
|
|
|
if stream.readable:
|
|
|
|
raise newException(UnconsumedInput, "Remaining bytes in the input")
|
2020-10-22 18:53:40 +00:00
|
|
|
|
2021-10-19 14:38:41 +00:00
|
|
|
iterator walkTests*(dir: static string): string =
|
|
|
|
for kind, path in walkDir(
|
|
|
|
dir/"pyspec_tests", relative = true, checkDir = true):
|
|
|
|
yield path
|
|
|
|
|
2021-05-24 08:42:40 +00:00
|
|
|
proc parseTest*(path: string, Format: typedesc[SSZ], T: typedesc): T =
|
|
|
|
try:
|
|
|
|
# debugEcho " [Debug] Loading file: \"", path, '\"'
|
|
|
|
sszDecodeEntireInput(snappy.decode(readFileBytes(path), MaxObjectSize), T)
|
|
|
|
except SerializationError as err:
|
|
|
|
writeStackTrace()
|
|
|
|
stderr.write $Format & " load issue for file \"", path, "\"\n"
|
|
|
|
stderr.write err.formatMsg(path), "\n"
|
|
|
|
quit 1
|