nimbus-eth1/tests/test_transaction_json.nim

79 lines
2.0 KiB
Nim
Raw Normal View History

import
2020-04-15 11:09:49 +00:00
unittest2, json, os, tables, strutils,
eth/[common, rlp],
2020-04-15 11:09:49 +00:00
./test_helpers,
../nimbus/[transaction, utils, errors]
const
FIXTURE_FORK_SKIPS = ["_info", "rlp", "Constantinople"]
proc testFixture(node: JsonNode, testStatusIMPL: var TestStatus)
2019-09-21 05:45:23 +00:00
proc transactionJsonMain*() =
suite "Transactions tests":
2020-02-11 03:34:50 +00:00
jsonTest("TransactionTests", testFixture)
2019-09-21 05:45:23 +00:00
when isMainModule:
transactionJsonMain()
proc txHash(tx: Transaction): string =
toLowerAscii($keccakHash(rlp.encode(tx)))
proc testTxByFork(tx: Transaction, forkData: JsonNode, forkName: string, testStatusIMPL: var TestStatus) =
try:
tx.validate(nameToFork[forkName])
except ValidationError:
return
if forkData.len > 0 and "sender" in forkData:
let sender = ethAddressFromHex(forkData["sender"].getStr)
check "hash" in forkData
check tx.txHash == forkData["hash"].getStr
check tx.getSender == sender
func noHash(fixture: JsonNode): bool =
result = true
for forkName, forkData in fixture:
if forkName notin FIXTURE_FORK_SKIPS:
if forkData.len == 0: return
if "hash" in forkData: return false
2020-02-11 03:34:50 +00:00
# nimbus rlp cannot allow type mismatch
# e.g. uint256 value put into int64
# so we skip noHash check. this behavior
# is different compared to py-evm
const SKIP_TITLES = [
"TransactionWithGasLimitxPriceOverflow",
"TransactionWithHighNonce256",
"TransactionWithHighGasPrice",
"V_equals38"
]
proc testFixture(node: JsonNode, testStatusIMPL: var TestStatus) =
var
title: string
rlpData: seq[byte]
tx: Transaction
for key, fixture in node:
title = key
try:
rlpData = safeHexToSeqByte(fixture["rlp"].getStr)
except ValueError:
# bad rlp bytes
check noHash(fixture)
return
try:
tx = rlp.decode(rlpData, Transaction)
2020-02-11 03:34:50 +00:00
except RlpTypeMismatch, MalformedRlpError, UnsupportedRlpError:
if title in SKIP_TITLES:
return
check noHash(fixture)
return
for forkName, fork in fixture:
if forkName notin FIXTURE_FORK_SKIPS:
testTxByFork(tx, fork, forkName, testStatusIMPL)