diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md index d288015..81c9e90 100644 --- a/tests/fixtures/README.md +++ b/tests/fixtures/README.md @@ -54,6 +54,15 @@ removed before production firmware was built and flashed. validated file above. Its 3,589 skipped startup bytes and one candidate-header rejection are deterministic, and extracting its 151 valid frames reproduces `direct_usb_73e5680.trk` byte-for-byte. +- `ble_reconnect_483ace3.trk` — SHA-256 + `c4a0d795cdf9d490acaca0144c3ad33f85bbfb2214d3f7abdfe515c4e5f25398`. + This is the resumed half of a real macOS receiver interruption against exact + firmware commit `483ace3`. It contains 2,576 contiguous samples, sequences + 1,992 through 4,567, with zero packet/sample gaps, resets, CRC failures, + reported drops, loop overruns, trailing bytes, or timestamp saturation. The + final status records one disconnect and one deliberate frame replay, with + zero notification failures or invalid ACKs. It validates that the 10.24-second + queue covered the measured resubscription interval without permanent loss. `tests/test_trikke_protocol.py` verifies the hashes, parses the captures in fragmented chunks, and asserts these signatures so the hardware evidence remains diff --git a/tests/fixtures/ble_reconnect_483ace3.trk b/tests/fixtures/ble_reconnect_483ace3.trk new file mode 100644 index 0000000..882251c Binary files /dev/null and b/tests/fixtures/ble_reconnect_483ace3.trk differ diff --git a/tests/test_trikke_protocol.py b/tests/test_trikke_protocol.py index cc07c30..cd0fbe7 100644 --- a/tests/test_trikke_protocol.py +++ b/tests/test_trikke_protocol.py @@ -291,6 +291,24 @@ class ProtocolContractTest(unittest.TestCase): "timing_anomalies": 2, "gaps": [], }, + "ble_reconnect_483ace3.trk": { + "sha256": "c4a0d795cdf9d490acaca0144c3ad33f85bbfb2214d3f7abdfe515c4e5f25398", + "sample_count": 2576, + "first_sequence": 1992, + "last_sequence": 4567, + "max_dropped": 0, + "timing_anomalies": 1293, + "gaps": [], + "final_status": { + "sensor_read_failure_count": 0, + "queue_overflow_count": 0, + "transport_begin_retry_count": 187, + "transport_disconnect_count": 1, + "transport_send_failure_count": 0, + "transport_replay_count": 1, + "transport_invalid_ack_count": 0, + }, + }, } for name, contract in expected.items(): @@ -348,6 +366,13 @@ class ProtocolContractTest(unittest.TestCase): integrity.final_dropped_sample_count, ) self.assertEqual(0, integrity.final_loop_overrun_count) + if "final_status" in contract: + self.assertIsNotNone(integrity.final_status) + for field, value in contract["final_status"].items(): + self.assertEqual( + value, + getattr(integrity.final_status, field), + ) gaps = [ (