Ensure websocket event serializer cache is effective if subscription iden differs (#42226)

Since someone websocket subscriptions will use an iden of 2 for
state_changed event (most comment), and some will use another
number for all events, the cache would not be used because the
iden number was different.  We now cache only the event and
use a fast replace to insert the iden number into the serailized
response.
This commit is contained in:
J. Nick Koston authored and GitHub committed 2020-10-23 01:28:22 +02:00
1 parent de35d58fd4
commit 4a3b40a3ef
2 files changed
+51 -5

No files matched your search

@@ -1,6 +1,7 @@
"""Test Websocket API messages module."""
from homeassistant.components.websocket_api.messages import (
_cached_event_message as lru_event_cache,
cached_event_message,
message_to_json,
)
@@ -24,6 +25,7 @@ async def test_cached_event_message(hass):
await hass.async_block_till_done()
assert len(events) == 2
lru_event_cache.cache_clear()
msg0 = cached_event_message(2, events[0])
assert msg0 == cached_event_message(2, events[0])
@@ -33,18 +35,49 @@ async def test_cached_event_message(hass):
assert msg0 != msg1
cache_info = cached_event_message.cache_info()
cache_info = lru_event_cache.cache_info()
assert cache_info.hits == 2
assert cache_info.misses == 2
assert cache_info.currsize == 2
cached_event_message(2, events[1])
cache_info = cached_event_message.cache_info()
cache_info = lru_event_cache.cache_info()
assert cache_info.hits == 3
assert cache_info.misses == 2
assert cache_info.currsize == 2
async def test_cached_event_message_with_different_idens(hass):
"""Test that we cache event messages when the subscrition idens differ."""
events = []
@callback
def _event_listener(event):
events.append(event)
hass.bus.async_listen(EVENT_STATE_CHANGED, _event_listener)
hass.states.async_set("light.window", "on")
await hass.async_block_till_done()
assert len(events) == 1
lru_event_cache.cache_clear()
msg0 = cached_event_message(2, events[0])
msg1 = cached_event_message(3, events[0])
msg2 = cached_event_message(4, events[0])
assert msg0 != msg1
assert msg0 != msg2
cache_info = lru_event_cache.cache_info()
assert cache_info.hits == 2
assert cache_info.misses == 1
assert cache_info.currsize == 1
async def test_message_to_json(caplog):
"""Test we can serialize websocket messages."""