chore(compose): add docker-compose.yml
This commit is contained in:
81
services/collector/tests/test_protocol_parser.py
Normal file
81
services/collector/tests/test_protocol_parser.py
Normal file
@@ -0,0 +1,81 @@
|
||||
import struct
|
||||
|
||||
import pytest
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from protocol_parser import ProtocolParser
|
||||
|
||||
|
||||
def build_packet(timestamp_ms: int, rms_db_x10: int, freq_hz: int) -> bytes:
|
||||
sof = bytes([ProtocolParser.SOF])
|
||||
header = bytes([ProtocolParser.TYPE_AUDIO_V1, ProtocolParser.PAYLOAD_LEN])
|
||||
payload = struct.pack("<IhH", timestamp_ms, rms_db_x10, freq_hz)
|
||||
|
||||
crc_data = header + payload # bytes 1..10 in the wire format
|
||||
crc = ProtocolParser._crc8_atm(crc_data)
|
||||
|
||||
return sof + header + payload + bytes([crc])
|
||||
|
||||
|
||||
def test_valid_packet():
|
||||
p = ProtocolParser()
|
||||
raw = build_packet(timestamp_ms=1234, rms_db_x10=-123, freq_hz=440)
|
||||
|
||||
packets = p.feed(raw)
|
||||
|
||||
assert len(packets) == 1
|
||||
pkt = packets[0]
|
||||
assert pkt.valid is True
|
||||
assert pkt.timestamp_ms == 1234
|
||||
assert pkt.rms_db == -12.3
|
||||
assert pkt.freq_hz == 440
|
||||
|
||||
st = p.get_stats()
|
||||
assert st.packets_received == 1
|
||||
assert st.crc_errors == 0
|
||||
|
||||
|
||||
def test_bad_crc_packet():
|
||||
p = ProtocolParser()
|
||||
raw = bytearray(build_packet(timestamp_ms=1, rms_db_x10=-10, freq_hz=1000))
|
||||
raw[-1] ^= 0xFF # ломаем CRC
|
||||
|
||||
packets = p.feed(bytes(raw))
|
||||
|
||||
assert packets == []
|
||||
st = p.get_stats()
|
||||
assert st.packets_received == 0
|
||||
assert st.crc_errors == 1
|
||||
|
||||
|
||||
def test_garbage_then_valid_packet_resync():
|
||||
p = ProtocolParser()
|
||||
|
||||
garbage = b"\x00\xff\xaa\x01\x02\x03\x04" # содержит ложный SOF и мусор
|
||||
raw = garbage + build_packet(timestamp_ms=777, rms_db_x10=-321, freq_hz=1234)
|
||||
|
||||
packets = p.feed(raw)
|
||||
|
||||
assert len(packets) == 1
|
||||
assert packets[0].timestamp_ms == 777
|
||||
assert packets[0].rms_db == -32.1
|
||||
assert packets[0].freq_hz == 1234
|
||||
assert p.get_stats().length_errors >= 1 # парсер должен "проглотить" мусор
|
||||
|
||||
|
||||
def test_two_packets_in_one_chunk():
|
||||
p = ProtocolParser()
|
||||
|
||||
raw = build_packet(timestamp_ms=10, rms_db_x10=-100, freq_hz=500) + build_packet(
|
||||
timestamp_ms=20, rms_db_x10=-200, freq_hz=600
|
||||
)
|
||||
|
||||
packets = p.feed(raw)
|
||||
|
||||
assert len(packets) == 2
|
||||
assert packets[0].timestamp_ms == 10
|
||||
assert packets[1].timestamp_ms == 20
|
||||
Reference in New Issue
Block a user