mirror of
https://github.com/esphome/esphome.git
synced 2025-06-15 06:46:59 +02:00
72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
"""Integration test for shared buffer optimization with multiple API connections."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
|
|
from aioesphomeapi import EntityState
|
|
import pytest
|
|
|
|
from .types import APIClientConnectedFactory, RunCompiledFunction
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_host_mode_many_entities_multiple_connections(
|
|
yaml_config: str,
|
|
run_compiled: RunCompiledFunction,
|
|
api_client_connected: APIClientConnectedFactory,
|
|
) -> None:
|
|
"""Test shared buffer optimization with multiple API connections."""
|
|
# Write, compile and run the ESPHome device
|
|
loop = asyncio.get_running_loop()
|
|
async with (
|
|
run_compiled(yaml_config),
|
|
api_client_connected() as client1,
|
|
api_client_connected() as client2,
|
|
):
|
|
# Subscribe both clients to state changes
|
|
states1: dict[int, EntityState] = {}
|
|
states2: dict[int, EntityState] = {}
|
|
|
|
client1_ready = loop.create_future()
|
|
client2_ready = loop.create_future()
|
|
|
|
def on_state1(state: EntityState) -> None:
|
|
states1[state.key] = state
|
|
if len(states1) >= 20 and not client1_ready.done():
|
|
client1_ready.set_result(len(states1))
|
|
|
|
def on_state2(state: EntityState) -> None:
|
|
states2[state.key] = state
|
|
if len(states2) >= 20 and not client2_ready.done():
|
|
client2_ready.set_result(len(states2))
|
|
|
|
client1.subscribe_states(on_state1)
|
|
client2.subscribe_states(on_state2)
|
|
|
|
# Wait for both clients to receive states
|
|
try:
|
|
count1, count2 = await asyncio.gather(
|
|
asyncio.wait_for(client1_ready, timeout=10.0),
|
|
asyncio.wait_for(client2_ready, timeout=10.0),
|
|
)
|
|
except asyncio.TimeoutError:
|
|
pytest.fail(
|
|
f"One or both clients did not receive enough states within 10 seconds. "
|
|
f"Client1: {len(states1)}, Client2: {len(states2)}"
|
|
)
|
|
|
|
# Verify both clients received states successfully
|
|
assert count1 >= 20, (
|
|
f"Client 1 should have received at least 20 states, got {count1}"
|
|
)
|
|
assert count2 >= 20, (
|
|
f"Client 2 should have received at least 20 states, got {count2}"
|
|
)
|
|
|
|
# Verify both clients received the same entity keys (same device state)
|
|
common_keys = set(states1.keys()) & set(states2.keys())
|
|
assert len(common_keys) >= 20, (
|
|
f"Expected at least 20 common entity keys, got {len(common_keys)}"
|
|
)
|