Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Official operations - deposits unit test #408

Merged
merged 10 commits into from
Sep 11, 2019
3 changes: 3 additions & 0 deletions beacon_chain/spec/crypto.nim
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ func bls_verify*(
pubkey: ValidatorPubKey, msg: openArray[byte], sig: ValidatorSig,
domain: uint64): bool =
# name from spec!
if sig.kind != Real:
# Invalid signatures are possible in deposits (discussed with Danny)
return false
when ValidatorPubKey is BlsValue:
if sig.kind != Real or pubkey.kind != Real:
# TODO: chronicles warning
Expand Down
1 change: 1 addition & 0 deletions beacon_chain/state_transition.nim
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ proc state_transition*(
if skipValidation in flags or verifyStateRoot(state, blck):
# TODO: allow skipping just verifyStateRoot for mocking
# instead of both processBlock and verifyStateRoot
# https://github.com/status-im/nim-beacon-chain/issues/407
# State root is what it should be - we're done!
return true

Expand Down
2 changes: 1 addition & 1 deletion tests/official/all_fixtures_require_ssz.nim
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
import
./test_fixture_sanity_slots,
./test_fixture_sanity_blocks,
./test_fixture_operations_deposits,
./test_fixture_state_transition_epoch,
./test_fixture_operations_attestations,
./test_fixture_operations_attester_slashings,
./test_fixture_operations_block_header,
./test_fixture_operations_proposer_slashings,
./test_fixture_operations_transfer,
./test_fixture_operations_voluntary_exit

82 changes: 82 additions & 0 deletions tests/official/test_fixture_operations_deposits.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# 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 http://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at http://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, unittest, strutils,
# Beacon chain internals
../../beacon_chain/spec/[datatypes, beaconstate],
../../beacon_chain/[ssz, extras],
# Test utilities
../testutil,
./fixtures_utils,
../helpers/debug_state,
../mocking/mock_blocks

const OperationsDepositsDir = SszTestsDir/const_preset/"phase0"/"operations"/"deposit"/"pyspec_tests"

template runTest(testName: string, identifier: untyped) =
# We wrap the tests in a proc to avoid running out of globals
# in the future: Nim supports up to 3500 globals
# but unittest with the macro/templates put everything as globals
# https://github.com/nim-lang/Nim/issues/12084#issue-486866402

const testDir = OperationsDepositsDir / astToStr(identifier)

proc `testImpl _ operations_deposits _ identifier`() =

var flags: UpdateFlags
var prefix: string
if not existsFile(testDir/"meta.yaml"):
flags.incl skipValidation
if existsFile(testDir/"post.ssz"):
prefix = "[Valid] "
else:
prefix = "[Invalid] "

test prefix & testName & " (" & astToStr(identifier) & ")":
var stateRef, postRef: ref BeaconState
var depositRef: ref Deposit
new depositRef
new stateRef

depositRef[] = parseTest(testDir/"deposit.ssz", SSZ, Deposit)
stateRef[] = parseTest(testDir/"pre.ssz", SSZ, BeaconState)

if existsFile(testDir/"post.ssz"):
new postRef
postRef[] = parseTest(testDir/"post.ssz", SSZ, BeaconState)

if postRef.isNil:
expect(AssertionError):
let done = process_deposit(stateRef[], depositRef[], flags)
else:
let done = process_deposit(stateRef[], depositRef[], flags)
reportDiff(stateRef, postRef)

`testImpl _ operations_deposits _ identifier`()

suite "Official - Operations - Deposits " & preset():
# TODO https://github.com/status-im/nim-beacon-chain/issues/435
# CI Win64 - "The parameter is incorrect"
when not (defined(windows) and sizeof(int) == 8):
runTest("new deposit under max", new_deposit_under_max)
runTest("new deposit max", new_deposit_max)
runTest("new deposit over max", new_deposit_over_max)
runTest("invalid signature new deposit", invalid_sig_new_deposit)
runTest("success top-up", success_top_up)
runTest("invalid signature top-up", invalid_sig_top_up)
runTest("invalid withdrawal credentials top-up", invalid_withdrawal_credentials_top_up)

when false:
# TODO - those should give an exception but do not
# probably because skipValidation is too strong
# https://github.com/status-im/nim-beacon-chain/issues/407
runTest("wrong deposit for deposit count", wrong_deposit_for_deposit_count)
runTest("bad merkle proof", bad_merkle_proof)
else:
echo " Skipped for Windows 64-bit CI"
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ suite "Official - Operations - Proposer slashing " & preset():
runTest(proposer_is_slashed)
runTest(proposer_is_withdrawn)
else:
echo "Skipped for Windows 64-bit CI"
echo " Skipped for Windows 64-bit CI"