Handle exception handling websocket command (#16927)

* Handle exception handling websocket command

* lint

* Lint2
This commit is contained in:
Paulus Schoutsen 2018-09-27 23:10:07 +02:00 committed by GitHub
parent bac71d3d22
commit a7248d4574
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 2 deletions

View File

@ -40,6 +40,7 @@ ERR_ID_REUSE = 1
ERR_INVALID_FORMAT = 2 ERR_INVALID_FORMAT = 2
ERR_NOT_FOUND = 3 ERR_NOT_FOUND = 3
ERR_UNKNOWN_COMMAND = 4 ERR_UNKNOWN_COMMAND = 4
ERR_UNKNOWN_ERROR = 5
TYPE_AUTH = 'auth' TYPE_AUTH = 'auth'
TYPE_AUTH_INVALID = 'auth_invalid' TYPE_AUTH_INVALID = 'auth_invalid'
@ -405,7 +406,13 @@ class ActiveConnection:
else: else:
handler, schema = handlers[msg['type']] handler, schema = handlers[msg['type']]
try:
handler(self.hass, self, schema(msg)) handler(self.hass, self, schema(msg))
except Exception: # pylint: disable=broad-except
_LOGGER.exception('Error handling message: %s', msg)
self.to_write.put_nowait(error_message(
cur_id, ERR_UNKNOWN_ERROR,
'Unknown error.'))
last_id = cur_id last_id = cur_id
msg = await wsock.receive_json() msg = await wsock.receive_json()

View File

@ -1,6 +1,6 @@
"""Tests for the Home Assistant Websocket API.""" """Tests for the Home Assistant Websocket API."""
import asyncio import asyncio
from unittest.mock import patch from unittest.mock import patch, Mock
from aiohttp import WSMsgType from aiohttp import WSMsgType
from async_timeout import timeout from async_timeout import timeout
@ -539,3 +539,20 @@ async def test_call_service_context_no_user(hass, aiohttp_client):
assert call.service == 'test_service' assert call.service == 'test_service'
assert call.data == {'hello': 'world'} assert call.data == {'hello': 'world'}
assert call.context.user_id is None assert call.context.user_id is None
async def test_handler_failing(hass, websocket_client):
"""Test a command that raises."""
hass.components.websocket_api.async_register_command(
'bla', Mock(side_effect=TypeError),
wapi.BASE_COMMAND_MESSAGE_SCHEMA.extend({'type': 'bla'}))
await websocket_client.send_json({
'id': 5,
'type': 'bla',
})
msg = await websocket_client.receive_json()
assert msg['id'] == 5
assert msg['type'] == wapi.TYPE_RESULT
assert not msg['success']
assert msg['error']['code'] == wapi.ERR_UNKNOWN_ERROR