"""Tests for protocol.py message parsing.""" import struct import unittest from simtrace2_pysniff.protocol import ( parse_message, MSG_HDR_FMT, MSG_HDR_SIZE, MSG_HDR_SIZE, flags_to_names, CHANGE_FLAG_CARD_INSERT, CHANGE_FLAG_TIMEOUT_WT, DATA_FLAG_ERROR_CHECKSUM, DATA_FLAG_ERROR_MALFORMED, DATA_FLAG_ERROR_INCOMPLETE, SIMTRACE_MSGC_SNIFF, SIMTRACE_MSGT_SNIFF_CHANGE, SIMTRACE_MSGT_SNIFF_FIDI, SIMTRACE_MSGT_SNIFF_ATR, SIMTRACE_MSGT_SNIFF_PPS, SIMTRACE_MSGT_SNIFF_TPDU, ) def _build_hdr(msg_class, msg_type, slot_nr=0, seq_nr=0, payload=b''): msg_len = MSG_HDR_SIZE + len(payload) return struct.pack(MSG_HDR_FMT, msg_class, msg_type, seq_nr, slot_nr, 0, msg_len) + payload class TestParseMessage(unittest.TestCase): def test_empty_buffer(self): msg, consumed = parse_message(b'') self.assertIsNone(msg) self.assertEqual(consumed, 0) def test_too_short_for_header(self): msg, consumed = parse_message(b'\x00' * 5) self.assertIsNone(msg) self.assertEqual(consumed, 0) def test_non_sniff_class_skipped(self): payload = b'junk_data' buf = _build_hdr(0, 0, payload=payload) msg, consumed = parse_message(buf) self.assertIsNone(msg) self.assertEqual(consumed, len(buf)) def test_msg_len_smaller_than_header_skip(self): buf = _build_hdr(SIMTRACE_MSGC_SNIFF, SIMTRACE_MSGT_SNIFF_CHANGE) buf = bytearray(buf) struct.pack_into('