From c2a4981e25c87a54458fccac7fab222e3d519bf7 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 7 Sep 2026 16:22:42 +0200 Subject: [PATCH] [api] Order the wrong wire type assertions on the raw socket The barrier was a command on the aioesphomeapi connection, which nothing orders against the raw frames under test; a well formed frame on the raw socket itself now closes each block and the assertion checks the exact states seen since the marker. --- .../integration/test_api_decode_wire_types.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/integration/test_api_decode_wire_types.py b/tests/integration/test_api_decode_wire_types.py index e3a93a46c2..5c8444273a 100644 --- a/tests/integration/test_api_decode_wire_types.py +++ b/tests/integration/test_api_decode_wire_types.py @@ -87,23 +87,31 @@ async def test_api_decode_wire_types( await raw.send_raw( SWITCH_COMMAND, tag(1, WIRE_VARINT) + encode_varint(switch.key) + on ) - # A later command on the same connection proves the bad frames were fully consumed; - # the number state arriving means any switch state from them would already be here - client.number_command(number.key, -77.5) - await waiter.expect(number_is(-77.5)) - assert len(switch_states) == seen + # Ordered on the raw socket itself: this frame cannot be parsed before the bad ones, so + # the only switch state since the marker must be the one it produces + await raw.send_raw(SWITCH_COMMAND, key + on) + await waiter.expect(switch_is(True), label="switch on after wrong wire types") + assert switch_states[seen:] == [True] + await raw.send_raw(SWITCH_COMMAND, key + off) + await waiter.expect(switch_is(False)) # Truncated bodies stop the decode loop without taking the connection down: a tag with its # continuation bit set and nothing after it, a length prefix past the end of the payload, # and a fixed32 with two of its four bytes + seen = len(switch_states) await raw.send_raw(SWITCH_COMMAND, key + b"\x80") await raw.send_raw(SWITCH_COMMAND, key + tag(2, WIRE_LENGTH) + b"\x7f" + b"ab") await raw.send_raw(SWITCH_COMMAND, tag(1, WIRE_FIXED32) + b"\x01\x02") await raw.send_raw(SWITCH_COMMAND, key + on) await waiter.expect(switch_is(True), label="switch on after truncated frames") + assert switch_states[seen:] == [True] await raw.send_raw(SWITCH_COMMAND, key + off) await waiter.expect(switch_is(False)) + # A negative number goes through the fixed32 float path of a normal client + client.number_command(number.key, -77.5) + await waiter.expect(number_is(-77.5)) + # An unknown field ahead of the known ones is skipped; field 200 needs a two byte tag await raw.send_raw( SWITCH_COMMAND, tag(200, WIRE_VARINT) + encode_varint(300) + key + on