Skip to content

Commit

Permalink
Merge 210ec20 into a480841
Browse files Browse the repository at this point in the history
  • Loading branch information
Adminiuga committed Sep 19, 2019
2 parents a480841 + 210ec20 commit 6d1e08e
Show file tree
Hide file tree
Showing 15 changed files with 505 additions and 154 deletions.
22 changes: 21 additions & 1 deletion tests/test_application.py
Expand Up @@ -203,7 +203,21 @@ def test_deserialize(app, ieee):

def test_handle_message(app, ieee):
dev = mock.MagicMock()
app.handle_message(dev, False, 260, 1, 1, 1, 1, 1, [])
app.handle_message(dev, 260, 1, 1, 1, [])
assert dev.handle_message.call_count == 1


def test_handle_message_uninitialized_dev(app, ieee):
dev = device.Device(app, ieee, 0x1234)
dev.handle_message = mock.MagicMock()
app.handle_message(dev, 260, 1, 1, 1, [])
assert dev.handle_message.call_count == 0

dev.status = device.Status.ZDO_INIT
app.handle_message(dev, 260, 1, 1, 1, [])
assert dev.handle_message.call_count == 0

app.handle_message(dev, 260, 0, 1, 1, [])
assert dev.handle_message.call_count == 1


Expand All @@ -230,3 +244,9 @@ async def test_broadcast(app):
@pytest.mark.asyncio
async def test_shutdown(app):
await app.shutdown()


def test_get_dst_address(app):
r = app.get_dst_address(mock.MagicMock())
assert r.addrmode == 3
assert r.endpoint == 1
80 changes: 68 additions & 12 deletions tests/test_device.py
@@ -1,19 +1,20 @@
import asyncio
from unittest import mock

from asynctest import CoroutineMock
import pytest

import zigpy.types as t
from zigpy.application import ControllerApplication
from zigpy import device, endpoint
from zigpy.application import ControllerApplication
import zigpy.exceptions
import zigpy.types as t
from zigpy.zdo import types as zdo_t


@pytest.fixture
def dev():
def dev(monkeypatch):
monkeypatch.setattr(device, "APS_REPLY_TIMEOUT_EXTENDED", 0.1)
app_mock = mock.MagicMock(spec_set=ControllerApplication)
app_mock.remove.side_effect = asyncio.coroutine(mock.MagicMock())
app_mock.request.side_effect = asyncio.coroutine(mock.MagicMock())
ieee = t.EUI64(map(t.uint8_t, [0, 1, 2, 3, 4, 5, 6, 7]))
return device.Device(app_mock, ieee, 65535)

Expand Down Expand Up @@ -74,19 +75,26 @@ async def mockepinit(self):

@pytest.mark.asyncio
async def test_request(dev):
seq = mock.sentinel.tsn

async def mock_req(*args, **kwargs):
dev._pending[seq].result.set_result(mock.sentinel.result)
return 0, ""

dev.application.request.side_effect = mock_req
assert dev.last_seen is None
await dev.request(1, 2, 3, 3, 4, b"")
r = await dev.request(1, 2, 3, 3, seq, b"")
assert r is mock.sentinel.result
assert dev._application.request.call_count == 1
assert dev._application.get_sequence.call_count == 0
assert dev.last_seen is not None


@pytest.mark.asyncio
async def test_failed_request(dev):
assert dev.last_seen is None
dev._application.request.side_effect = Exception
with pytest.raises(Exception):
await dev.request(1, 2, 3, 4, b"")
dev._application.request = CoroutineMock(return_value=(1, "error"))
with pytest.raises(zigpy.exceptions.DeliveryError):
await dev.request(1, 2, 3, 4, 5, b"")
assert dev.last_seen is None


Expand All @@ -104,14 +112,62 @@ def test_deserialize(dev):


def test_handle_message_no_endpoint(dev):
dev.handle_message(False, 99, 98, 97, 97, 1, 0, [])
dev.handle_message(99, 98, 97, 97, b"aabbcc")


def test_handle_message(dev):
ep = dev.add_endpoint(3)
dev.deserialize = mock.MagicMock(
return_value=[
mock.sentinel.tsn,
mock.sentinel.cmd_id,
mock.sentinel.is_reply,
mock.sentinel.args,
]
)
ep.handle_message = mock.MagicMock()
dev.handle_message(99, 98, 3, 3, b"abcd")
assert ep.handle_message.call_count == 1


def test_handle_message_reply(dev):
ep = dev.add_endpoint(3)
ep.handle_message = mock.MagicMock()
dev.handle_message(False, 99, 98, 3, 3, 1, 0, [])
tsn = mock.sentinel.tsn
req_mock = mock.MagicMock()
dev._pending[tsn] = req_mock
dev.deserialize = mock.MagicMock(
side_effect=(
(tsn, mock.sentinel.cmd_id, True, mock.sentinel.args),
(mock.sentinel.another_tsn, mock.sentinel.cmd_id, True, mock.sentinel.args),
(tsn, mock.sentinel.cmd_id, True, mock.sentinel.args),
)
)
dev.handle_message(99, 98, 3, 3, b"abcd")
assert ep.handle_message.call_count == 0
assert req_mock.result.set_result.call_count == 1
assert req_mock.result.set_result.call_args[0][0] is mock.sentinel.args

req_mock.reset_mock()
dev.handle_message(99, 98, 3, 3, b"abcd")
assert ep.handle_message.call_count == 1
assert ep.handle_message.call_args[0][-1] is mock.sentinel.args
assert req_mock.result.set_result.call_count == 0

req_mock.reset_mock()
req_mock.result.set_result.side_effect = asyncio.InvalidStateError
ep.handle_message.reset_mock()
dev.handle_message(99, 98, 3, 3, b"abcd")
assert ep.handle_message.call_count == 0
assert req_mock.result.set_result.call_count == 1


def test_handle_message_deserialize_error(dev):
ep = dev.add_endpoint(3)
dev.deserialize = mock.MagicMock(side_effect=ValueError)
ep.handle_message = mock.MagicMock()
dev.handle_message(99, 98, 3, 3, b"abcd")
assert ep.handle_message.call_count == 0


def test_endpoint_getitem(dev):
Expand Down
10 changes: 5 additions & 5 deletions tests/test_endpoint.py
Expand Up @@ -115,19 +115,19 @@ def test_multiple_add_output_cluster(ep):
def test_handle_message(ep):
c = ep.add_input_cluster(0)
c.handle_message = mock.MagicMock()
ep.handle_message(False, 0, 0, 0, 1, [])
c.handle_message.assert_called_once_with(False, 0, 1, [])
ep.handle_message(0, 0, 0, 1, [])
c.handle_message.assert_called_once_with(0, 1, [])


def test_handle_message_output(ep):
c = ep.add_output_cluster(0)
c.handle_message = mock.MagicMock()
ep.handle_message(False, 0, 0, 0, 1, [])
c.handle_message.assert_called_once_with(False, 0, 1, [])
ep.handle_message(0, 0, 0, 1, [])
c.handle_message.assert_called_once_with(0, 1, [])


def test_handle_request_unknown(ep):
ep.handle_message(False, 0, 99, 0, 0, [])
ep.handle_message(0, 99, 0, 0, [])


def test_cluster_attr(ep):
Expand Down
22 changes: 17 additions & 5 deletions tests/test_zcl.py
Expand Up @@ -152,20 +152,20 @@ def test_attribute_report(cluster):
attr.attrid = 4
attr.value = zcl.foundation.TypeValue()
attr.value.value = 1
cluster.handle_message(False, 0, 0x0A, [[attr]])
cluster.handle_message(0, 0x0A, [[attr]])
assert cluster._attr_cache[4] == 1


def test_handle_request_unknown(cluster):
cluster.handle_message(False, 0, 0xFF, [])
cluster.handle_message(0, 0xFF, [])


def test_handle_cluster_request(cluster):
cluster.handle_message(False, 0, 256, [])
cluster.handle_message(0, 256, [])


def test_handle_unexpected_reply(cluster):
cluster.handle_message(True, 0, 0, [])
cluster.handle_message(0, 0, [])


def _mk_rar(attrid, value, status=0):
Expand Down Expand Up @@ -437,5 +437,17 @@ def test_general_command_reply(cluster):
assert cluster.request.call_count == 0
assert cluster.reply.call_count == 1
cluster.reply.assert_called_with(
True, cmd_id, mock.ANY, True, [], manufacturer=0x4567
True, cmd_id, mock.ANY, True, [], manufacturer=0x4567, tsn=None
)

cluster.request.reset_mock()
cluster.reply.reset_mock()
cluster.general_command(
cmd_id, True, [], manufacturer=0x4567, tsn=mock.sentinel.tsn
)

assert cluster.request.call_count == 0
assert cluster.reply.call_count == 1
cluster.reply.assert_called_with(
True, cmd_id, mock.ANY, True, [], manufacturer=0x4567, tsn=mock.sentinel.tsn
)
3 changes: 3 additions & 0 deletions tests/test_zcl_clusters.py
Expand Up @@ -204,6 +204,7 @@ async def get_ota_mock(*args):
mock.sentinel.image_type,
mock.sentinel.current_file_version,
mock.sentinel.hw_version,
tsn=0x21,
)


Expand Down Expand Up @@ -296,6 +297,7 @@ async def get_ota_mock(*args):
mock.sentinel.max_data_size,
mock.sentinel.addr,
mock.sentinel.delay,
tsn=0x21,
)


Expand Down Expand Up @@ -381,6 +383,7 @@ async def test_ota_handle_upgrade_end(ota_cluster):
mock.sentinel.manufacturer_id,
mock.sentinel.image_type,
mock.sentinel.image_version,
tsn=0x21,
)

assert ota_cluster.upgrade_end_response.call_count == 1
Expand Down

0 comments on commit 6d1e08e

Please sign in to comment.