Skip to content

Commit cc2e496

Browse files
authored
Reduce code duplication in getState rollback test (#7577)
Instead of copy pasting the full test for every fork, have it run automatically on all forks.
1 parent a1fd845 commit cc2e496

File tree

2 files changed

+39
-179
lines changed

2 files changed

+39
-179
lines changed

AllTests-mainnet.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,37 +43,38 @@ AllTests-mainnet
4343
```diff
4444
+ empty database [Preset: mainnet] OK
4545
+ find ancestors [Preset: mainnet] OK
46-
+ sanity check Altair and cross-fork getState rollback [Preset: mainnet] OK
4746
+ sanity check Altair blocks [Preset: mainnet] OK
4847
+ sanity check Altair states [Preset: mainnet] OK
4948
+ sanity check Altair states, reusing buffers [Preset: mainnet] OK
50-
+ sanity check Bellatrix and cross-fork getState rollback [Preset: mainnet] OK
5149
+ sanity check Bellatrix blocks [Preset: mainnet] OK
5250
+ sanity check Bellatrix states [Preset: mainnet] OK
5351
+ sanity check Bellatrix states, reusing buffers [Preset: mainnet] OK
54-
+ sanity check Capella and cross-fork getState rollback [Preset: mainnet] OK
5552
+ sanity check Capella blocks [Preset: mainnet] OK
5653
+ sanity check Capella states [Preset: mainnet] OK
5754
+ sanity check Capella states, reusing buffers [Preset: mainnet] OK
58-
+ sanity check Deneb and cross-fork getState rollback [Preset: mainnet] OK
5955
+ sanity check Deneb blocks [Preset: mainnet] OK
6056
+ sanity check Deneb states [Preset: mainnet] OK
6157
+ sanity check Deneb states, reusing buffers [Preset: mainnet] OK
62-
+ sanity check Electra and cross-fork getState rollback [Preset: mainnet] OK
6358
+ sanity check Electra blocks [Preset: mainnet] OK
6459
+ sanity check Electra states [Preset: mainnet] OK
6560
+ sanity check Electra states, reusing buffers [Preset: mainnet] OK
66-
+ sanity check Fulu and cross-fork getState rollback [Preset: mainnet] OK
6761
+ sanity check Fulu blocks [Preset: mainnet] OK
6862
+ sanity check Fulu states [Preset: mainnet] OK
6963
+ sanity check Fulu states, reusing buffers [Preset: mainnet] OK
64+
+ sanity check altair and cross-fork getState rollback [Preset: mainnet] OK
65+
+ sanity check bellatrix and cross-fork getState rollback [Preset: mainnet] OK
7066
+ sanity check blobs [Preset: mainnet] OK
67+
+ sanity check capella and cross-fork getState rollback [Preset: mainnet] OK
7168
+ sanity check data columns [Preset: mainnet] OK
69+
+ sanity check deneb and cross-fork getState rollback [Preset: mainnet] OK
70+
+ sanity check electra and cross-fork getState rollback [Preset: mainnet] OK
71+
+ sanity check fulu and cross-fork getState rollback [Preset: mainnet] OK
7272
+ sanity check genesis roundtrip [Preset: mainnet] OK
73+
sanity check gloas and cross-fork getState rollback [Preset: mainnet] Skip
7374
+ sanity check phase 0 blocks [Preset: mainnet] OK
74-
+ sanity check phase 0 getState rollback [Preset: mainnet] OK
7575
+ sanity check phase 0 states [Preset: mainnet] OK
7676
+ sanity check phase 0 states, reusing buffers [Preset: mainnet] OK
77+
+ sanity check phase0 getState rollback [Preset: mainnet] OK
7778
+ sanity check state diff roundtrip [Preset: mainnet] OK
7879
```
7980
## Beacon chain file test suite

tests/test_beacon_chain_db.nim

Lines changed: 31 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -797,184 +797,43 @@ suite "Beacon chain DB" & preset():
797797

798798
db.close()
799799

800-
test "sanity check phase 0 getState rollback" & preset():
801-
var
802-
db = makeTestDB(SLOTS_PER_EPOCH)
803-
validatorMonitor = newClone(ValidatorMonitor.init())
804-
dag = init(ChainDAGRef, defaultRuntimeConfig, db, validatorMonitor, {})
805-
state = (ref ForkedHashedBeaconState)(
806-
kind: ConsensusFork.Phase0,
807-
phase0Data: phase0.HashedBeaconState(data: phase0.BeaconState(
808-
slot: 10.Slot)))
809-
root = Eth2Digest()
810-
811-
db.putCorruptState(ConsensusFork.Phase0, root)
812-
813-
let restoreAddr = addr dag.headState
814-
815-
func restore() =
816-
assign(state[], restoreAddr[])
817-
818-
check:
819-
state[].phase0Data.data.slot == 10.Slot
820-
not db.getState(root, state[].phase0Data.data, restore)
821-
state[].phase0Data.data.slot != 10.Slot
822-
823-
test "sanity check Altair and cross-fork getState rollback" & preset():
824-
var
825-
db = makeTestDB(SLOTS_PER_EPOCH)
826-
validatorMonitor = newClone(ValidatorMonitor.init())
827-
dag = init(ChainDAGRef, defaultRuntimeConfig, db, validatorMonitor, {})
828-
state = (ref ForkedHashedBeaconState)(
829-
kind: ConsensusFork.Altair,
830-
altairData: altair.HashedBeaconState(data: altair.BeaconState(
831-
slot: 10.Slot)))
832-
root = Eth2Digest()
833-
834-
db.putCorruptState(ConsensusFork.Altair, root)
835-
836-
let restoreAddr = addr dag.headState
837-
838-
func restore() =
839-
assign(state[], restoreAddr[])
840-
841-
check:
842-
state[].altairData.data.slot == 10.Slot
843-
not db.getState(root, state[].altairData.data, restore)
844-
845-
# assign() has switched the case object fork
846-
state[].kind == ConsensusFork.Phase0
847-
state[].phase0Data.data.slot != 10.Slot
848-
849-
test "sanity check Bellatrix and cross-fork getState rollback" & preset():
850-
var
851-
db = makeTestDB(SLOTS_PER_EPOCH)
852-
validatorMonitor = newClone(ValidatorMonitor.init())
853-
dag = init(ChainDAGRef, defaultRuntimeConfig, db, validatorMonitor, {})
854-
state = (ref ForkedHashedBeaconState)(
855-
kind: ConsensusFork.Bellatrix,
856-
bellatrixData: bellatrix.HashedBeaconState(data: bellatrix.BeaconState(
857-
slot: 10.Slot)))
858-
root = Eth2Digest()
859-
860-
db.putCorruptState(ConsensusFork.Bellatrix, root)
861-
862-
let restoreAddr = addr dag.headState
863-
864-
func restore() =
865-
assign(state[], restoreAddr[])
866-
867-
check:
868-
state[].bellatrixData.data.slot == 10.Slot
869-
not db.getState(root, state[].bellatrixData.data, restore)
870-
871-
# assign() has switched the case object fork
872-
state[].kind == ConsensusFork.Phase0
873-
state[].phase0Data.data.slot != 10.Slot
874-
875-
test "sanity check Capella and cross-fork getState rollback" & preset():
876-
var
877-
db = makeTestDB(SLOTS_PER_EPOCH)
878-
validatorMonitor = newClone(ValidatorMonitor.init())
879-
dag = init(ChainDAGRef, defaultRuntimeConfig, db, validatorMonitor, {})
880-
state = (ref ForkedHashedBeaconState)(
881-
kind: ConsensusFork.Capella,
882-
capellaData: capella.HashedBeaconState(data: capella.BeaconState(
883-
slot: 10.Slot)))
884-
root = Eth2Digest()
885-
886-
db.putCorruptState(ConsensusFork.Capella, root)
887-
888-
let restoreAddr = addr dag.headState
889-
890-
func restore() =
891-
assign(state[], restoreAddr[])
892-
893-
check:
894-
state[].capellaData.data.slot == 10.Slot
895-
not db.getState(root, state[].capellaData.data, restore)
896-
897-
# assign() has switched the case object fork
898-
state[].kind == ConsensusFork.Phase0
899-
state[].phase0Data.data.slot != 10.Slot
900-
901-
test "sanity check Deneb and cross-fork getState rollback" & preset():
902-
var
903-
db = makeTestDB(SLOTS_PER_EPOCH)
904-
validatorMonitor = newClone(ValidatorMonitor.init())
905-
dag = init(ChainDAGRef, defaultRuntimeConfig, db, validatorMonitor, {})
906-
state = (ref ForkedHashedBeaconState)(
907-
kind: ConsensusFork.Deneb,
908-
denebData: deneb.HashedBeaconState(data: deneb.BeaconState(
909-
slot: 10.Slot)))
910-
root = Eth2Digest()
911-
912-
db.putCorruptState(ConsensusFork.Deneb, root)
913-
914-
let restoreAddr = addr dag.headState
915-
916-
func restore() =
917-
assign(state[], restoreAddr[])
918-
919-
check:
920-
state[].denebData.data.slot == 10.Slot
921-
not db.getState(root, state[].denebData.data, restore)
922-
923-
# assign() has switched the case object fork
924-
state[].kind == ConsensusFork.Phase0
925-
state[].phase0Data.data.slot != 10.Slot
926-
927-
test "sanity check Electra and cross-fork getState rollback" & preset():
928-
var
929-
db = makeTestDB(SLOTS_PER_EPOCH)
930-
validatorMonitor = newClone(ValidatorMonitor.init())
931-
dag = init(ChainDAGRef, defaultRuntimeConfig, db, validatorMonitor, {})
932-
state = (ref ForkedHashedBeaconState)(
933-
kind: ConsensusFork.Electra,
934-
electraData: electra.HashedBeaconState(data: electra.BeaconState(
935-
slot: 10.Slot)))
936-
root = Eth2Digest()
937-
938-
db.putCorruptState(ConsensusFork.Electra, root)
939-
940-
let restoreAddr = addr dag.headState
941-
942-
func restore() =
943-
assign(state[], restoreAddr[])
944-
945-
check:
946-
state[].electraData.data.slot == 10.Slot
947-
not db.getState(root, state[].electraData.data, restore)
948-
949-
# assign() has switched the case object fork
950-
state[].kind == ConsensusFork.Phase0
951-
state[].phase0Data.data.slot != 10.Slot
952-
953-
test "sanity check Fulu and cross-fork getState rollback" & preset():
954-
var
955-
db = makeTestDB(SLOTS_PER_EPOCH)
956-
validatorMonitor = newClone(ValidatorMonitor.init())
957-
dag = init(ChainDAGRef, defaultRuntimeConfig, db, validatorMonitor, {})
958-
state = (ref ForkedHashedBeaconState)(
959-
kind: ConsensusFork.Fulu,
960-
fuluData: fulu.HashedBeaconState(data: fulu.BeaconState(
961-
slot: 10.Slot)))
962-
root = Eth2Digest()
800+
template doRollbackTest(consensusFork: static ConsensusFork): untyped =
801+
block:
802+
let cfg = defaultRuntimeConfig
803+
var
804+
db = makeTestDB(SLOTS_PER_EPOCH)
805+
validatorMonitor = newClone(ValidatorMonitor.init())
806+
dag = init(ChainDAGRef, cfg, db, validatorMonitor, {})
807+
state = ForkedHashedBeaconState.new(
808+
(ref consensusFork.BeaconState)(slot: 10.Slot)[])
809+
root = Eth2Digest()
963810

964-
db.putCorruptState(ConsensusFork.Fulu, root)
811+
db.putCorruptState(consensusFork, root)
965812

966-
let restoreAddr = addr dag.headState
813+
let restoreAddr = addr dag.headState
967814

968-
func restore() =
969-
assign(state[], restoreAddr[])
815+
func restore() =
816+
assign(state[], restoreAddr[])
970817

971-
check:
972-
state[].fuluData.data.slot == 10.Slot
973-
not db.getState(root, state[].fuluData.data, restore)
818+
withState(state[]):
819+
check:
820+
forkyState.data.slot == 10.Slot
821+
not db.getState(root, forkyState.data, restore)
974822

975823
# assign() has switched the case object fork
976-
state[].kind == ConsensusFork.Phase0
977-
state[].phase0Data.data.slot != 10.Slot
824+
check:
825+
state[].kind == ConsensusFork.Phase0
826+
state[].phase0Data.data.slot != 10.Slot
827+
828+
withAll(ConsensusFork):
829+
var name = "sanity check " & $consensusFork &
830+
(if consensusFork > ConsensusFork.Phase0: " and cross-fork" else: "") &
831+
" getState rollback"
832+
test name & preset():
833+
when consensusFork >= ConsensusFork.Gloas:
834+
skip()
835+
else:
836+
doRollbackTest(consensusFork)
978837

979838
test "find ancestors" & preset():
980839
var db = BeaconChainDB.new("", inMemory = true)

0 commit comments

Comments
 (0)