ChillerDragon
4f845ea7ee
This change added a version flag to chunk header ``ChunkHeader()`` no longer works! You now have to do ``ChunkHeader(version = '0.6')`` or ``ChunkHeader(version = '0.7')`` This fixes 0.6 chunk header packing. It has a suddle difference to 0.7 and it is now packed correctly. Also unpacking 0.6.5 chunk headers is fixed by reading the correct size.
169 lines
4.9 KiB
Python
169 lines
4.9 KiB
Python
from twnet_parser.packet import \
|
|
ChunkHeaderParser
|
|
from twnet_parser.chunk_header import \
|
|
ChunkHeader
|
|
|
|
from tests.helper import cmp_bytes_as_bin
|
|
|
|
def test_chunk_header_unpack_vital1() -> None:
|
|
parser = ChunkHeaderParser()
|
|
header: ChunkHeader = parser.parse_header7(b'\x40\x10\x0a')
|
|
|
|
assert header.flags.resend is False
|
|
assert header.flags.vital is True
|
|
|
|
assert header.size == 16
|
|
assert header.seq == 10
|
|
|
|
def test_chunk_header_pack_vital1() -> None:
|
|
header: ChunkHeader = ChunkHeader(version = '0.7')
|
|
|
|
header.flags.resend = False
|
|
header.flags.vital = True
|
|
header.size = 16
|
|
header.seq = 10
|
|
|
|
assert bytes([0b01000000, 0b00010000, 0b00001010]) == b'\x40\x10\x0a'
|
|
|
|
cmp_bytes_as_bin(header.pack(), b'\x40\x10\x0a')
|
|
assert header.pack() == b'\x40\x10\x0a'
|
|
|
|
def test_chunk_header_pack_resend() -> None:
|
|
header: ChunkHeader = ChunkHeader(version = '0.7')
|
|
|
|
header.flags.resend = True
|
|
header.flags.vital = False
|
|
header.size = 16
|
|
header.seq = 0
|
|
|
|
assert bytes([0b10000000, 0b00010000]) == b'\x80\x10'
|
|
|
|
cmp_bytes_as_bin(header.pack(), b'\x80\x10')
|
|
assert header.pack() == b'\x80\x10'
|
|
|
|
def test_chunk_header_pack_no_flags1() -> None:
|
|
header: ChunkHeader = ChunkHeader(version = '0.7')
|
|
|
|
header.flags.resend = False
|
|
header.flags.vital = False
|
|
header.size = 16
|
|
header.seq = 0
|
|
|
|
assert bytes([0b00000000, 0b00010000]) == b'\x00\x10'
|
|
|
|
cmp_bytes_as_bin(header.pack(), b'\x00\x10')
|
|
assert header.pack() == b'\x00\x10'
|
|
|
|
def test_chunk_header_pack_no_flags2() -> None:
|
|
header: ChunkHeader = ChunkHeader(version = '0.7')
|
|
|
|
header.flags.resend = False
|
|
header.flags.vital = False
|
|
header.seq = 0
|
|
|
|
header.size = 17
|
|
assert bytes([0b00000000, 0b00010001]) == b'\x00\x11'
|
|
cmp_bytes_as_bin(header.pack(), b'\x00\x11')
|
|
assert header.pack() == b'\x00\x11'
|
|
|
|
header.size = 18
|
|
assert bytes([0b00000000, 0b00010010]) == b'\x00\x12'
|
|
cmp_bytes_as_bin(header.pack(), b'\x00\x12')
|
|
assert header.pack() == b'\x00\x12'
|
|
|
|
header.size = 19
|
|
assert bytes([0b00000000, 0b00010011]) == b'\x00\x13'
|
|
cmp_bytes_as_bin(header.pack(), b'\x00\x13')
|
|
assert header.pack() == b'\x00\x13'
|
|
|
|
header.size = 20
|
|
assert bytes([0b00000000, 0b00010100]) == b'\x00\x14'
|
|
cmp_bytes_as_bin(header.pack(), b'\x00\x14')
|
|
assert header.pack() == b'\x00\x14'
|
|
|
|
header.size = 21
|
|
assert bytes([0b00000000, 0b00010101]) == b'\x00\x15'
|
|
cmp_bytes_as_bin(header.pack(), b'\x00\x15')
|
|
assert header.pack() == b'\x00\x15'
|
|
|
|
def test_chunk_header_pack_no_flags_max_size() -> None:
|
|
header: ChunkHeader = ChunkHeader(version = '0.7')
|
|
|
|
header.flags.resend = False
|
|
header.flags.vital = False
|
|
header.seq = 0
|
|
|
|
header.size = 4094
|
|
#
|
|
# from libtw2 docs
|
|
# https://github.com/heinrich5991/libtw2/blob/7885c99974ee445ce13297b72ae3e7c6ea3b969d/doc/packet7.md
|
|
#
|
|
# chunk7_header_nonvital:
|
|
# [ 1] flag_resend
|
|
# [ 1] flag_vital
|
|
# [ 6] <----------
|
|
# [ 2] padding |-- size
|
|
# [ 6] <----------
|
|
#
|
|
# FFss ssss PPss ssss
|
|
assert bytes([0b0011_1111, 0b0011_1110]) == b'\x3f\x3e'
|
|
cmp_bytes_as_bin(header.pack(), b'\x3f\x3e')
|
|
assert header.pack() == b'\x3f\x3e'
|
|
|
|
header.size = 4095
|
|
#
|
|
# from libtw2 docs
|
|
# https://github.com/heinrich5991/libtw2/blob/7885c99974ee445ce13297b72ae3e7c6ea3b969d/doc/packet7.md
|
|
#
|
|
# chunk7_header_nonvital:
|
|
# [ 1] flag_resend
|
|
# [ 1] flag_vital
|
|
# [ 6] <----------
|
|
# [ 2] padding |-- size
|
|
# [ 6] <----------
|
|
#
|
|
# FFss ssss PPss ssss
|
|
assert bytes([0b0011_1111, 0b0011_1111]) == b'\x3f\x3f'
|
|
cmp_bytes_as_bin(header.pack(), b'\x3f\x3f')
|
|
assert header.pack() == b'\x3f\x3f'
|
|
|
|
|
|
def test_chunk_header_pack_no_flags_out_of_bounds_size() -> None:
|
|
header: ChunkHeader = ChunkHeader(version = '0.7')
|
|
|
|
header.flags.resend = False
|
|
header.flags.vital = False
|
|
header.seq = 0
|
|
|
|
header.size = 4096
|
|
#
|
|
# from libtw2 docs
|
|
# https://github.com/heinrich5991/libtw2/blob/7885c99974ee445ce13297b72ae3e7c6ea3b969d/doc/packet7.md
|
|
#
|
|
# chunk7_header_nonvital:
|
|
# [ 1] flag_resend
|
|
# [ 1] flag_vital
|
|
# [ 6] <----------
|
|
# [ 2] padding |-- size
|
|
# [ 6] <----------
|
|
#
|
|
# FFss ssss PPss ssss
|
|
assert bytes([0b0000_0000, 0b0000_0000]) == b'\x00\x00'
|
|
# ^
|
|
# does overflow to zero
|
|
# should we error here instead?
|
|
# TODO: https://gitlab.com/teeworlds-network/twnet_parser/-/issues/2
|
|
cmp_bytes_as_bin(header.pack(), b'\x00\x00')
|
|
assert header.pack() == b'\x00\x00'
|
|
|
|
|
|
def test_chunk_header_unpack_vital2() -> None:
|
|
parser = ChunkHeaderParser()
|
|
header: ChunkHeader = parser.parse_header7(b'\x40\x10\x09')
|
|
|
|
assert header.flags.resend is False
|
|
assert header.flags.vital is True
|
|
|
|
assert header.size == 16
|
|
assert header.seq == 9
|