@@ -1009,14 +1009,30 @@ def test_named_data_segments(self) -> None:
10091009EXAMPLE_HEADER_DATA : bytes = (
10101010 # Magic bytes
10111011 b"eh00"
1012- # uint32_t header size (little endian)
1012+ # uint32_t header size (little endian). 0x20 --> 32 bytes.
10131013 + b"\x20 \x00 \x00 \x00 "
10141014 # uint64_t program size
10151015 + b"\x44 \x33 \x44 \x33 \x22 \x11 \x22 \x11 "
10161016 # uint64_t segment base offset
10171017 + b"\x88 \x77 \x88 \x77 \x66 \x55 \x66 \x55 "
10181018 # uint64_t segment data size
10191019 + b"\x22 \x33 \x22 \x33 \x44 \x55 \x44 \x55 "
1020+ # Padding; provide at least NUM_HEAD_BYTES for the header.
1021+ + b"\x99 " * (_ExtendedHeader .NUM_HEAD_BYTES - 32 )
1022+ )
1023+
1024+ # Minimum fields in an extended header (no segment data size).
1025+ EXAMPLE_HEADER_DATA_MIN : bytes = (
1026+ # Magic bytes
1027+ b"eh00"
1028+ # uint32_t header size (little endian). 0x18 --> 24 bytes.
1029+ + b"\x18 \x00 \x00 \x00 "
1030+ # uint64_t program size
1031+ + b"\x44 \x33 \x44 \x33 \x22 \x11 \x22 \x11 "
1032+ # uint64_t segment base offset
1033+ + b"\x88 \x77 \x88 \x77 \x66 \x55 \x66 \x55 "
1034+ # Padding; provide at least NUM_HEAD_BYTES for the header.
1035+ + b"\x99 " * (_ExtendedHeader .NUM_HEAD_BYTES - 24 )
10201036)
10211037
10221038
@@ -1028,7 +1044,7 @@ def test_to_bytes(self) -> None:
10281044 segment_data_size = EXAMPLE_SEGMENT_DATA_SIZE ,
10291045 )
10301046 self .assertTrue (eh .is_valid ())
1031- self .assertEqual (eh .to_bytes (), EXAMPLE_HEADER_DATA )
1047+ self .assertEqual (eh .to_bytes (), EXAMPLE_HEADER_DATA [ 0 : 32 ] )
10321048
10331049 def test_to_bytes_with_non_defaults (self ) -> None :
10341050 eh = _ExtendedHeader (
@@ -1045,11 +1061,11 @@ def test_to_bytes_with_non_defaults(self) -> None:
10451061
10461062 # But still produces a valid output header, since to_bytes() ignores
10471063 # magic and length.
1048- self .assertEqual (eh .to_bytes (), EXAMPLE_HEADER_DATA )
1064+ self .assertEqual (eh .to_bytes (), EXAMPLE_HEADER_DATA [ 0 : 32 ] )
10491065
10501066 def test_from_bytes_valid (self ) -> None :
10511067 # Parse the serialized extended header.
1052- eh = _ExtendedHeader .from_bytes (EXAMPLE_HEADER_DATA )
1068+ eh = _ExtendedHeader .from_bytes (EXAMPLE_HEADER_DATA [ 0 : 32 ] )
10531069
10541070 # This is a valid header: good magic and length.
10551071 self .assertTrue (eh .is_valid ())
@@ -1060,6 +1076,20 @@ def test_from_bytes_valid(self) -> None:
10601076 self .assertEqual (eh .segment_base_offset , EXAMPLE_SEGMENT_BASE_OFFSET )
10611077 self .assertEqual (eh .segment_data_size , EXAMPLE_SEGMENT_DATA_SIZE )
10621078
1079+ def test_from_bytes_minimum (self ) -> None :
1080+ # Parse the serialized extended header.
1081+ eh = _ExtendedHeader .from_bytes (EXAMPLE_HEADER_DATA_MIN )
1082+
1083+ # This is a valid header: good magic and length.
1084+ self .assertTrue (eh .is_valid ())
1085+
1086+ self .assertEqual (eh .magic , _ExtendedHeader .EXPECTED_MAGIC )
1087+ self .assertEqual (eh .length , _ExtendedHeader .MINIMUM_LENGTH )
1088+ self .assertEqual (eh .program_size , EXAMPLE_PROGRAM_SIZE )
1089+ self .assertEqual (eh .segment_base_offset , EXAMPLE_SEGMENT_BASE_OFFSET )
1090+ # Does not contain segment_data_size; should be 0
1091+ self .assertEqual (eh .segment_data_size , 0 )
1092+
10631093 def test_from_bytes_with_more_data_than_necessary (self ) -> None :
10641094 # Pass in more data than necessary to parse the header.
10651095 header_data_with_suffix = EXAMPLE_HEADER_DATA + b"\x55 " * 16
@@ -1167,4 +1197,5 @@ def test_from_bytes_invalid_length(self) -> None:
11671197 self .assertEqual (eh .length , 16 )
11681198 self .assertEqual (eh .program_size , EXAMPLE_PROGRAM_SIZE )
11691199 self .assertEqual (eh .segment_base_offset , EXAMPLE_SEGMENT_BASE_OFFSET )
1170- self .assertEqual (eh .segment_data_size , EXAMPLE_SEGMENT_DATA_SIZE )
1200+ # Length cut short; segment_data_size parsed as 0.
1201+ self .assertEqual (eh .segment_data_size , 0 )
0 commit comments