Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from random import Random

from eth2spec.debug.random_value import get_random_ssz_object, RandomizationMode
from eth2spec.test.exceptions import SkippedTest
from eth2spec.utils.ssz.ssz_impl import serialize
from eth2spec.utils.ssz.ssz_typing import (
BasicView,
Expand Down Expand Up @@ -54,9 +55,10 @@ def valid_cases():
yield (
f"proglist_{name}_{mode.to_name()}_{length}",
valid_test_case(
lambda rng=rng, mode=mode, typ=typ, length=length: progressive_list_case_fn(
lambda rng, mode=mode, typ=typ, length=length: progressive_list_case_fn(
rng, mode, typ, length
)
),
rng,
),
)

Expand All @@ -75,34 +77,38 @@ def invalid_cases():
f"proglist_{name}_{length}_{mode.to_name()}_{description}",
invalid_test_case(
ProgressiveList[typ],
lambda rng=rng,
mode=mode,
typ=typ,
length=length,
data=data: serialize(
lambda rng, mode=mode, typ=typ, length=length, data=data: serialize(
progressive_list_case_fn(rng, mode, typ, length)
)[:-1]
+ data,
rng,
),
)
if typ.type_byte_length() > 1:
if length > 0:

def the_test(rng, mode=mode, typ=typ, length=length):
serialized = serialize(progressive_list_case_fn(rng, mode, typ, length))
if len(serialized) == 0:
raise SkippedTest("Cannot invalidate by removing a byte")
return serialized[:-1]

yield (
f"proglist_{name}_{length}_{mode.to_name()}_one_byte_less",
invalid_test_case(
ProgressiveList[typ],
lambda rng=rng, mode=mode, typ=typ, length=length: serialize(
progressive_list_case_fn(rng, mode, typ, length)
)[:-1],
the_test,
rng,
),
)
yield (
f"proglist_{name}_{length}_{mode.to_name()}_one_byte_more",
invalid_test_case(
ProgressiveList[typ],
lambda rng=rng, mode=mode, typ=typ, length=length: serialize(
lambda rng, mode=mode, typ=typ, length=length: serialize(
progressive_list_case_fn(rng, mode, typ, length)
)
+ serialize(uint_case_fn(rng, mode, uint8)),
rng,
),
)
28 changes: 15 additions & 13 deletions tests/generators/runners/ssz_generic_cases/ssz_basic_vector.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,10 @@ def valid_cases():
yield (
f"vec_{name}_{length}_{mode.to_name()}",
valid_test_case(
lambda rng=rng, mode=mode, typ=typ, length=length: basic_vector_case_fn(
lambda rng, mode=mode, typ=typ, length=length: basic_vector_case_fn(
rng, mode, typ, length
)
),
rng,
),
)

Expand All @@ -79,14 +80,11 @@ def invalid_cases():
f"vec_{name}_{length}_{mode.to_name()}_{description}",
invalid_test_case(
Vector[typ, length],
lambda rng=rng,
mode=mode,
typ=typ,
length=length,
data=data: serialize(basic_vector_case_fn(rng, mode, typ, length))[
:-1
]
lambda rng, mode=mode, typ=typ, length=length, data=data: serialize(
basic_vector_case_fn(rng, mode, typ, length)
)[:-1]
+ data,
rng,
),
)
if length == 1:
Expand All @@ -100,36 +98,40 @@ def invalid_cases():
f"vec_{name}_{length}_{mode.to_name()}_one_less",
invalid_test_case(
Vector[typ, length],
lambda rng=rng, mode=mode, typ=typ, length=length: serialize(
lambda rng, mode=mode, typ=typ, length=length: serialize(
basic_vector_case_fn(rng, mode, typ, length - 1)
),
rng,
),
)
yield (
f"vec_{name}_{length}_{mode.to_name()}_one_more",
invalid_test_case(
Vector[typ, length],
lambda rng=rng, mode=mode, typ=typ, length=length: serialize(
lambda rng, mode=mode, typ=typ, length=length: serialize(
basic_vector_case_fn(rng, mode, typ, length + 1)
),
rng,
),
)
yield (
f"vec_{name}_{length}_{mode.to_name()}_one_byte_less",
invalid_test_case(
Vector[typ, length],
lambda rng=rng, mode=mode, typ=typ, length=length: serialize(
lambda rng, mode=mode, typ=typ, length=length: serialize(
basic_vector_case_fn(rng, mode, typ, length)
)[:-1],
rng,
),
)
yield (
f"vec_{name}_{length}_{mode.to_name()}_one_byte_more",
invalid_test_case(
Vector[typ, length],
lambda rng=rng, mode=mode, typ=typ, length=length: serialize(
lambda rng, mode=mode, typ=typ, length=length: serialize(
basic_vector_case_fn(rng, mode, typ, length)
)
+ serialize(basic_vector_case_fn(rng, mode, uint8, 1)),
rng,
),
)
8 changes: 5 additions & 3 deletions tests/generators/runners/ssz_generic_cases/ssz_bitlist.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,10 @@ def valid_cases():
yield (
f"bitlist_{size}_{mode.to_name()}_{variation}",
valid_test_case(
lambda rng=rng, mode=mode, size=size, variation=variation: bitlist_case_fn(
lambda rng, mode=mode, size=size, variation=variation: bitlist_case_fn(
rng, mode, size, force_final_bit=[None, True, False][variation % 3]
)
),
rng,
),
)

Expand Down Expand Up @@ -77,8 +78,9 @@ def invalid_cases():
f"bitlist_{typ_limit}_but_{test_limit}",
invalid_test_case(
Bitlist[typ_limit],
lambda rng=rng, test_limit=test_limit: serialize(
lambda rng, test_limit=test_limit: serialize(
bitlist_case_fn(rng, RandomizationMode.mode_max_count, test_limit)
),
rng,
),
)
6 changes: 4 additions & 2 deletions tests/generators/runners/ssz_generic_cases/ssz_bitvector.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ def valid_cases():
yield (
f"bitvec_{size}_{mode.to_name()}",
valid_test_case(
lambda rng=rng, mode=mode, size=size: bitvector_case_fn(rng, mode, size)
lambda rng, mode=mode, size=size: bitvector_case_fn(rng, mode, size),
rng,
),
)

Expand Down Expand Up @@ -72,8 +73,9 @@ def invalid_cases():
f"bitvec_{typ_size}_{mode.to_name()}_{test_size}",
invalid_test_case(
Bitvector[typ_size],
lambda rng=rng, mode=mode, test_size=test_size, typ_size=typ_size: serialize(
lambda rng, mode=mode, test_size=test_size, typ_size=typ_size: serialize(
bitvector_case_fn(rng, mode, test_size, invalid_making_pos=typ_size)
),
rng,
),
)
41 changes: 19 additions & 22 deletions tests/generators/runners/ssz_generic_cases/ssz_compatible_union.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,46 +47,45 @@ def valid_compatible_union_cases(rng: Random, name: str, typ: type[View]):
yield (
f"{name}_{mode.to_name()}_selector_{option}",
valid_test_case(
lambda rng=rng,
mode=mode,
typ=typ,
elem_type=elem_type,
option=option: deserialize(
lambda rng, mode=mode, typ=typ, elem_type=elem_type, option=option: deserialize(
typ,
bytes([option]) + serialize(container_case_fn(rng, mode, elem_type)),
)
),
rng,
),
)
for mode in list(RandomizationMode):
for variation in range(3):
yield (
f"{name}_{mode.to_name()}_selector_{option}_chaos_{variation}",
valid_test_case(
lambda rng=rng,
lambda rng,
mode=mode,
typ=typ,
elem_type=elem_type,
option=option: deserialize(
typ,
bytes([option])
+ serialize(container_case_fn(rng, mode, elem_type, chaos=True)),
)
),
rng,
),
)
if mode == RandomizationMode.mode_random:
for variation in range(10):
yield (
f"{name}_{mode.to_name()}_selector_{option}_{variation}",
valid_test_case(
lambda rng=rng,
lambda rng,
mode=mode,
typ=typ,
elem_type=elem_type,
option=option: deserialize(
typ,
bytes([option])
+ serialize(container_case_fn(rng, mode, elem_type)),
)
),
rng,
),
)

Expand Down Expand Up @@ -120,9 +119,7 @@ def invalid_cases():
for option_a, option_b in permutations(options, 2):
elem_type_b = options[option_b]

def the_test(
rng=rng, mode=mode, typ=typ, elem_type_b=elem_type_b, option_a=option_a
):
def the_test(rng, mode=mode, typ=typ, elem_type_b=elem_type_b, option_a=option_a):
serialized = bytes([option_a]) + serialize(
container_case_fn(rng, mode, elem_type_b)
)
Expand All @@ -136,26 +133,26 @@ def the_test(

yield (
f"{name}_{mode.to_name()}_selector_{option_a}_with_{option_b}_data",
invalid_test_case(typ, the_test),
invalid_test_case(typ, the_test, rng),
)

# Unsupported type option. Always invalid
for option in range(0, 255):
if option not in options:

def the_test(rng=rng, mode=mode, typ=typ, option=option):
def the_test(rng, mode=mode, typ=typ, option=option):
serialized = serialize(container_case_fn(rng, mode, typ))
serialized = bytes([option]) + serialized[1:]
return serialized

yield (
f"{name}_{mode.to_name()}_selector_{option}_invalid",
invalid_test_case(typ, the_test),
invalid_test_case(typ, the_test, rng),
)

# Extra byte between selector and data. Not guaranteed to invalidate for variable length data types
def the_test(
rng=rng,
rng,
mode=mode,
typ=typ,
):
Expand All @@ -169,12 +166,12 @@ def the_test(

yield (
f"{name}_{mode.to_name()}_extra_padding",
invalid_test_case(typ, the_test),
invalid_test_case(typ, the_test, rng),
)

# Raw data, without selector. Not guaranteed to invalidate if first byte randomly is a valid selector
def the_test(
rng=rng,
rng,
mode=mode,
typ=typ,
):
Expand All @@ -188,12 +185,12 @@ def the_test(

yield (
f"{name}_{mode.to_name()}_selector_missing",
invalid_test_case(typ, the_test),
invalid_test_case(typ, the_test, rng),
)

# Extra byte at end. Not guaranteed to invalidate for variable length data types
def the_test(
rng=rng,
rng,
mode=mode,
typ=typ,
):
Expand All @@ -207,5 +204,5 @@ def the_test(

yield (
f"{name}_{mode.to_name()}_extra_byte",
invalid_test_case(typ, the_test),
invalid_test_case(typ, the_test, rng),
)
Loading