mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 12:59:34 +00:00
Patch aiohttp client session close (#34769)
* Patch aiohttp client session close * Add test * Restore close regardless of auto_cleanup * Close session instead of detaching and do not restore * Delint test * Add frame helper * Use frame helper * Test warning log when closing session * Clean up * Correct docstring * Do not change shutdown * Fix tests
This commit is contained in:
@@ -8,9 +8,11 @@ from homeassistant.core import EVENT_HOMEASSISTANT_CLOSE
|
||||
import homeassistant.helpers.aiohttp_client as client
|
||||
from homeassistant.setup import async_setup_component
|
||||
|
||||
from tests.async_mock import Mock, patch
|
||||
|
||||
@pytest.fixture
|
||||
def camera_client(hass, hass_client):
|
||||
|
||||
@pytest.fixture(name="camera_client")
|
||||
def camera_client_fixture(hass, hass_client):
|
||||
"""Fixture to fetch camera streams."""
|
||||
assert hass.loop.run_until_complete(
|
||||
async_setup_component(
|
||||
@@ -91,6 +93,82 @@ async def test_get_clientsession_cleanup_without_ssl(hass):
|
||||
assert hass.data[client.DATA_CONNECTOR_NOTVERIFY].closed
|
||||
|
||||
|
||||
async def test_get_clientsession_patched_close(hass):
|
||||
"""Test closing clientsession does not work."""
|
||||
with patch("aiohttp.ClientSession.close") as mock_close:
|
||||
session = client.async_get_clientsession(hass)
|
||||
|
||||
assert isinstance(hass.data[client.DATA_CLIENTSESSION], aiohttp.ClientSession)
|
||||
assert isinstance(hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector)
|
||||
|
||||
with pytest.raises(RuntimeError):
|
||||
await session.close()
|
||||
|
||||
assert mock_close.call_count == 0
|
||||
|
||||
|
||||
async def test_warning_close_session_integration(hass, caplog):
|
||||
"""Test log warning message when closing the session from integration context."""
|
||||
with patch(
|
||||
"homeassistant.helpers.frame.extract_stack",
|
||||
return_value=[
|
||||
Mock(
|
||||
filename="/home/paulus/homeassistant/core.py",
|
||||
lineno="23",
|
||||
line="do_something()",
|
||||
),
|
||||
Mock(
|
||||
filename="/home/paulus/homeassistant/components/hue/light.py",
|
||||
lineno="23",
|
||||
line="await session.close()",
|
||||
),
|
||||
Mock(
|
||||
filename="/home/paulus/aiohue/lights.py",
|
||||
lineno="2",
|
||||
line="something()",
|
||||
),
|
||||
],
|
||||
):
|
||||
session = client.async_get_clientsession(hass)
|
||||
await session.close()
|
||||
assert (
|
||||
"Detected integration that closes the Home Assistant aiohttp session. "
|
||||
"Please report issue for hue using this method at "
|
||||
"homeassistant/components/hue/light.py, line 23: await session.close()"
|
||||
) in caplog.text
|
||||
|
||||
|
||||
async def test_warning_close_session_custom(hass, caplog):
|
||||
"""Test log warning message when closing the session from custom context."""
|
||||
with patch(
|
||||
"homeassistant.helpers.frame.extract_stack",
|
||||
return_value=[
|
||||
Mock(
|
||||
filename="/home/paulus/homeassistant/core.py",
|
||||
lineno="23",
|
||||
line="do_something()",
|
||||
),
|
||||
Mock(
|
||||
filename="/home/paulus/config/custom_components/hue/light.py",
|
||||
lineno="23",
|
||||
line="await session.close()",
|
||||
),
|
||||
Mock(
|
||||
filename="/home/paulus/aiohue/lights.py",
|
||||
lineno="2",
|
||||
line="something()",
|
||||
),
|
||||
],
|
||||
):
|
||||
session = client.async_get_clientsession(hass)
|
||||
await session.close()
|
||||
assert (
|
||||
"Detected integration that closes the Home Assistant aiohttp session. "
|
||||
"Please report issue to the custom component author for hue using this method at "
|
||||
"custom_components/hue/light.py, line 23: await session.close()" in caplog.text
|
||||
)
|
||||
|
||||
|
||||
async def test_async_aiohttp_proxy_stream(aioclient_mock, camera_client):
|
||||
"""Test that it fetches the given url."""
|
||||
aioclient_mock.get("http://example.com/mjpeg_stream", content=b"Frame1Frame2Frame3")
|
||||
|
||||
Reference in New Issue
Block a user