Skip to content

Commit 9c47f60

Browse files
committed
new(tests): EOF Validation embedded containers
1 parent 84d28db commit 9c47f60

File tree

1 file changed

+153
-0
lines changed

1 file changed

+153
-0
lines changed

tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py

+153
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,159 @@ def test_subcontainer_wrong_size(
585585
)
586586

587587

588+
empty_container = Container(
589+
name="embedded_container_zero_container_size",
590+
sections=[
591+
Section.Code(
592+
code=Op.PUSH1[0] + Op.RJUMPI[0] + Op.STOP,
593+
max_stack_height=1,
594+
),
595+
Section.Container(
596+
container=Container(
597+
raw_bytes=([]), # Empty subcontainer
598+
)
599+
),
600+
],
601+
)
602+
603+
604+
@pytest.mark.parametrize(
605+
"truncate",
606+
[
607+
(-1, None),
608+
(12, EOFException.INCOMPLETE_SECTION_NUMBER),
609+
(13, EOFException.INCOMPLETE_SECTION_NUMBER),
610+
(14, EOFException.MISSING_HEADERS_TERMINATOR),
611+
(15, EOFException.INCOMPLETE_SECTION_SIZE),
612+
(16, EOFException.INCOMPLETE_SECTION_SIZE),
613+
(17, EOFException.INCOMPLETE_SECTION_SIZE),
614+
(18, EOFException.MISSING_HEADERS_TERMINATOR),
615+
],
616+
)
617+
def test_truncated_subcontainer(eof_test, truncate):
618+
"""Test truncated container in subcontainer header description."""
619+
container = Container(
620+
sections=[
621+
Section.Code(
622+
code=Op.RETURNCODE[0](0, 0),
623+
),
624+
stop_sub_container,
625+
],
626+
kind=ContainerKind.INITCODE,
627+
)
628+
truncate_at = truncate[0]
629+
truncate_error = truncate[1]
630+
if truncate_at > 0:
631+
container = Container(
632+
raw_bytes=container.bytecode[0:truncate_at],
633+
validity_error=truncate_error,
634+
)
635+
eof_test(container=container)
636+
637+
638+
@pytest.mark.parametrize(
639+
"container,exception",
640+
[
641+
pytest.param(
642+
empty_container,
643+
EOFException.ZERO_SECTION_SIZE,
644+
),
645+
pytest.param(
646+
Container(
647+
name="embedded_container_non_zero_section_size_zero_container_size",
648+
raw_bytes=(
649+
[
650+
0xEF,
651+
0x00,
652+
0x01, # Version: 1
653+
0x01, # Types Length: 4
654+
0x00,
655+
0x04,
656+
0x02, # Code Sections (Length: 1)
657+
0x00,
658+
0x01,
659+
0x00, # Code Section 0 (Length: 6)
660+
0x06,
661+
0x03, # Container Sections (Length: 1)
662+
0x00,
663+
0x01,
664+
0x00, # Container Section 0 (Length: 20)
665+
0x00,
666+
0x00,
667+
0x14,
668+
0xFF, # Data Length: 0
669+
0x00,
670+
0x00,
671+
0x00, # Terminator
672+
# Code Section 0 types
673+
0x00, # Inputs: 0
674+
0x80, # Outputs: 0 (Non-returning function)
675+
0x00, # Max Stack Height: 1
676+
0x01,
677+
# Code Section 0
678+
0x60, # [0] PUSH1(0)
679+
0x00,
680+
0xE1, # [2] RJUMPI(0)
681+
0x00,
682+
0x00,
683+
0x00, # [5] STOP
684+
# --- Error: Invalid Container Content ---#
685+
]
686+
),
687+
),
688+
EOFException.INVALID_SECTION_BODIES_SIZE,
689+
),
690+
pytest.param(
691+
Container(
692+
name="embedded_container_zero_section_size",
693+
raw_bytes=(
694+
[
695+
0xEF,
696+
0x00,
697+
0x01, # Version: 1
698+
0x01, # Types Length: 4
699+
0x00,
700+
0x04,
701+
0x02, # Code Sections (Length: 1)
702+
0x00,
703+
0x01,
704+
0x00, # Code Section 0 (Length: 6)
705+
0x06,
706+
# --- Error: Invalid Container Header (zero section size) ---#
707+
0x03,
708+
0x00,
709+
0x00,
710+
0xFF,
711+
0x00,
712+
0x00,
713+
0x00,
714+
0x00,
715+
0x80,
716+
0x00,
717+
0x01,
718+
0x60,
719+
0x00,
720+
0xE1,
721+
0x00,
722+
0x00,
723+
0x00,
724+
]
725+
),
726+
),
727+
EOFException.ZERO_SECTION_SIZE,
728+
),
729+
],
730+
)
731+
def test_subcontainer_zero_section_size(
732+
eof_test: EOFTestFiller, container: Container, exception: EOFException
733+
):
734+
"""Test subcontainers with declared or non-declared zero section sizes."""
735+
eof_test(
736+
container=container,
737+
expect_exception=exception,
738+
)
739+
740+
588741
deep_container_parametrize = pytest.mark.parametrize(
589742
["deepest_container", "exception"],
590743
[

0 commit comments

Comments
 (0)