nimbus-eth2/tests/official/fixtures_utils.nim

94 lines
3.1 KiB
Nim
Raw Normal View History

# beacon_chain
# Copyright (c) 2018-Present Status Research & Development GmbH
# Licensed and distributed under either of
# * 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).
# at your option. This file may not be copied, modified, or distributed except according to those terms.
import
# Standard library
os, strutils, typetraits,
# Internals
../../beacon_chain/ssz,
2020-10-22 18:53:40 +00:00
../../beacon_chain/spec/[datatypes, crypto, state_transition_epoch],
# Status libs,
snappy,
stew/byteutils,
serialization, json_serialization
export # Workaround:
# - https://github.com/status-im/nim-serialization/issues/4
# - https://github.com/status-im/nim-serialization/issues/5
# - https://github.com/nim-lang/Nim/issues/11225
serialization.readValue,
Json, ssz, crypto
# Process current EF test format
# ---------------------------------------------
# #######################
# JSON deserialization
func readValue*(r: var JsonReader, a: var seq[byte]) =
## 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
const
FixturesDir* =
currentSourcePath.rsplit(DirSep, 1)[0] / ".." / ".." / "vendor" / "nim-eth2-scenarios"
SszTestsDir* = FixturesDir / "tests-v1.1.0-alpha.8"
MaxObjectSize* = 3_000_000
proc parseTest*(path: string, Format: typedesc[Json], T: typedesc): T =
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
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
2020-10-22 18:53:40 +00:00
proc process_justification_and_finalization*(state: var BeaconState) =
var cache = StateCache()
var rewards: RewardInfo
rewards.init(state)
rewards.process_attestations(state, cache)
process_justification_and_finalization(state, rewards.total_balances)
2020-10-22 18:53:40 +00:00
func process_slashings*(state: var BeaconState) =
2020-10-22 18:53:40 +00:00
var cache = StateCache()
var rewards: RewardInfo
rewards.init(state)
rewards.process_attestations(state, cache)
process_slashings(state, rewards.total_balances.current_epoch)