From 6f299e72451197051879f4a6cfea8e7c28de60e8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 30 May 2019 16:23:42 -0700 Subject: [PATCH] Improve error handling (#24204) --- homeassistant/components/ssdp/__init__.py | 6 ++--- tests/components/ssdp/test_init.py | 29 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/ssdp/__init__.py b/homeassistant/components/ssdp/__init__.py index af24dd22a89..aecca614e73 100644 --- a/homeassistant/components/ssdp/__init__.py +++ b/homeassistant/components/ssdp/__init__.py @@ -135,15 +135,15 @@ class Scanner: if not xml: resp = await session.get(xml_location, timeout=5) xml = await resp.text() - except aiohttp.ClientError as err: + except (aiohttp.ClientError, asyncio.TimeoutError) as err: _LOGGER.debug("Error fetching %s: %s", xml_location, err) - return None + return {} try: tree = ElementTree.fromstring(xml) except ElementTree.ParseError as err: _LOGGER.debug("Error parsing %s: %s", xml_location, err) - return None + return {} return util.etree_to_dict(tree).get('root', {}).get('device', {}) diff --git a/tests/components/ssdp/test_init.py b/tests/components/ssdp/test_init.py index 7ded5f12329..4b1e27d2dc8 100644 --- a/tests/components/ssdp/test_init.py +++ b/tests/components/ssdp/test_init.py @@ -1,6 +1,10 @@ """Test the SSDP integration.""" +import asyncio from unittest.mock import patch, Mock +import aiohttp +import pytest + from homeassistant.generated import ssdp as gn_ssdp from homeassistant.components import ssdp @@ -76,3 +80,28 @@ async def test_scan_match_device_type(hass, aioclient_mock): assert len(mock_init.mock_calls) == 1 assert mock_init.mock_calls[0][1][0] == 'mock-domain' assert mock_init.mock_calls[0][2]['context'] == {'source': 'ssdp'} + + +@pytest.mark.parametrize('exc', [asyncio.TimeoutError, aiohttp.ClientError]) +async def test_scan_description_fetch_fail(hass, aioclient_mock, exc): + """Test failing to fetch description.""" + aioclient_mock.get('http://1.1.1.1', exc=exc) + scanner = ssdp.Scanner(hass) + + with patch('netdisco.ssdp.scan', return_value=[ + Mock(st="mock-st", location='http://1.1.1.1') + ]): + await scanner.async_scan(None) + + +async def test_scan_description_parse_fail(hass, aioclient_mock): + """Test invalid XML.""" + aioclient_mock.get('http://1.1.1.1', text=""" +INVALIDXML + """) + scanner = ssdp.Scanner(hass) + + with patch('netdisco.ssdp.scan', return_value=[ + Mock(st="mock-st", location='http://1.1.1.1') + ]): + await scanner.async_scan(None)