From 3bad2275cc7592e982f6053d5ea68eabf61c253d Mon Sep 17 00:00:00 2001 From: Jay Date: Tue, 18 Aug 2026 14:28:10 -0400 Subject: [PATCH] preserve BLE disconnect race stress evidence --- tests/fixtures/README.md | 10 ++++++++++ tests/fixtures/ble_mtu_race_4bf00eb.trk | Bin 0 -> 45884 bytes tests/test_trikke_protocol.py | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 tests/fixtures/ble_mtu_race_4bf00eb.trk diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md index 603cfb2..8ec6bb3 100644 --- a/tests/fixtures/README.md +++ b/tests/fixtures/README.md @@ -68,6 +68,16 @@ removed before production firmware was built and flashed. maximum; cumulative error is 152 us over 25.75 seconds. This records bounded BLE scheduling jitter without rate drift and requires timestamp-derived `dt` in future fusion work. +- `ble_mtu_race_4bf00eb.trk` — SHA-256 + `4a231b54a3c7320fd69cac869b830e94aca8f704f946881b9cdfd21991bfa41f`. + This exact-commit stress capture followed six rapid subscribe, first-fragment, + and disconnect cycles aimed at the MTU lookup race. Telemetry remained live + afterward: the capture contains 1,848 CRC-valid samples with zero packet gaps, + resets, send failures, or invalid ACKs, while status records exactly six + disconnects and six replays. The test deliberately withheld application ACKs + beyond the 10.24-second queue window, so sequences 1,024 through 4,021 were + intentionally lost; the single 2,998-sample gap, matching queue-overflow total, + demonstrates bounded buffer exhaustion rather than a suspended output task. `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_mtu_race_4bf00eb.trk b/tests/fixtures/ble_mtu_race_4bf00eb.trk new file mode 100644 index 0000000000000000000000000000000000000000..b74bad93b70f63fe5418ca2a42455ae5ed4108b3 GIT binary patch literal 45884 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

End?*+z0t-iOe=jPOnLrd3$SoM2eC z&hWD^bCPz*#rU2mEL#`U3&XdbB+PRX&UAQ<;bdX1OBKo){B6BdhR?)lC$ zFZ707gSGxy)}Pl^SCb6HrLzt5oNs{Ufjlsk;d60Xx9Z1bGQ2wS<-^VqUFKT{$fl`> zoGUCFH)`4F$a%uDH4AS>{2;$~zOalpe!Gx5-vz?lFR=y~Z?WJ%5#!yHt?lg2g@!RE z{1(7Wt2JLF3|(Tbk*lc;Ux?Fr!#^pLVaB`5KD$_SS&ZX1fvC$}A}ot>+!dr=b7}ad z&yDwgnPEO|Ysm&_cX`BEv-)p+{a2Wut>Da`@1|pUGWk z^1y3_Wxkrun!W6gpL)RM^2ZWNaJbK(^F%}v5e>sZbxR#x9^nA-#P3vaiCcKD?p z@)7vCTZQ?Uz>A;%PVHf_IPLQ-zo1g`OTAxw^5EMe^+Qu%G;VW_4 z*yoEf8Lrx3x0UV_U1krg>&YwT3(M@Xv+NiBy5BJWCifTq5%z$vQj8m6cKM(%=Z(9P z{ubgx!m|0|o+Wnku=VG@uZ?V)z4S*6^PE54*-g$bED@)5+wp5OrFpn%%_Eln^ zC)p)A>Z8IKH^vCt!rwk7%x%zX(&QD73v=E$bG?=2o=*sK`SJ0-271yk*M05@Gv-ev zSWD?Jzi08Zuq?J>ON?ha4_}MZd6)3(IVBmcxnx1hXGDiC@jELGvT5Skv%)f;*)8mS zKNr7ATpeTf@VsHj%9zizeCdUN;WK$BnY`^qVcD4U)0n{9OTye&S5$1Mbq41gUKZxM z#Jbquv`A(6Mx55Y#;^U9WEj{m@7Y&G=X?M7z1e1$uL{d@Z}wqTRYx7F~$ zuM5j^1AfneTE`p0GCgl4e(?uy3iC1Xw;!nAy%qXHe%4v|*0&AwINB+9pw-q>8J3FE z#^&Ykw=KB0)s+iGm&Letx<`P|d`FnqQjp8nHt!09?H!S4cbMq;V3Ob>Z?4PUZM Nn6KF@)z0s`{(m->Ud#Xh literal 0 HcmV?d00001 diff --git a/tests/test_trikke_protocol.py b/tests/test_trikke_protocol.py index cd0fbe7..d27cd6e 100644 --- a/tests/test_trikke_protocol.py +++ b/tests/test_trikke_protocol.py @@ -309,6 +309,24 @@ class ProtocolContractTest(unittest.TestCase): "transport_invalid_ack_count": 0, }, }, + "ble_mtu_race_4bf00eb.trk": { + "sha256": "4a231b54a3c7320fd69cac869b830e94aca8f704f946881b9cdfd21991bfa41f", + "sample_count": 1848, + "first_sequence": 0, + "last_sequence": 4845, + "max_dropped": 2998, + "timing_anomalies": 412, + "gaps": [(1023, 4022, 29_990_016)], + "final_status": { + "sensor_read_failure_count": 0, + "queue_overflow_count": 2998, + "transport_begin_retry_count": 2471, + "transport_disconnect_count": 6, + "transport_send_failure_count": 0, + "transport_replay_count": 6, + "transport_invalid_ack_count": 0, + }, + }, } for name, contract in expected.items():