Ejemplo n.º 1
0
async def test_init_api_mode(api, monkeypatch):
    monkeypatch.setattr(api._uart, "baudrate", 57600)
    api.enter_at_command_mode = mock.AsyncMock(return_value=True)

    res = await api.init_api_mode()
    assert res is None
    assert api.enter_at_command_mode.call_count == 1

    api.enter_at_command_mode = mock.AsyncMock(return_value=False)

    res = await api.init_api_mode()
    assert res is False
    assert api.enter_at_command_mode.call_count == 10

    async def enter_at_mode():
        if api._uart.baudrate == 9600:
            return True
        return False

    api._uart.baudrate = 57600
    api.enter_at_command_mode = mock.MagicMock(side_effect=enter_at_mode)
    api.api_mode_at_commands = mock.AsyncMock(return_value=True)

    res = await api.init_api_mode()
    assert res is True
    assert api.enter_at_command_mode.call_count == 5
Ejemplo n.º 2
0
async def _test_start_network(
    app,
    ai_status=0xFF,
    api_mode=True,
    api_config_succeeds=True,
    ee=1,
    eo=2,
    zs=2,
    legacy_module=False,
):
    ai_tries = 5
    app.state.node_info.nwk = mock.sentinel.nwk

    def _at_command_mock(cmd, *args):
        nonlocal ai_tries
        if not api_mode:
            raise asyncio.TimeoutError
        if cmd == "CE" and legacy_module:
            raise RuntimeError

        ai_tries -= 1 if cmd == "AI" else 0
        return {
            "AI": ai_status if ai_tries < 0 else 0xFF,
            "CE": 1 if ai_status == 0 else 0,
            "EO": eo,
            "EE": ee,
            "ID": 0x25DCF87E03EA5906,
            "MY": 0xFFFE if ai_status else 0x0000,
            "NJ": mock.sentinel.at_nj,
            "OI": 0xDD94,
            "OP": mock.sentinel.at_op,
            "SH": 0x08070605,
            "SL": 0x04030201,
            "ZS": zs,
        }.get(cmd, None)

    def init_api_mode_mock():
        nonlocal api_mode
        api_mode = api_config_succeeds
        return api_config_succeeds

    with mock.patch("zigpy_xbee.api.XBee") as XBee_mock:
        api_mock = mock.MagicMock()
        api_mock._at_command = mock.AsyncMock(side_effect=_at_command_mock)
        api_mock.init_api_mode = mock.AsyncMock(side_effect=init_api_mode_mock)

        XBee_mock.new = mock.AsyncMock(return_value=api_mock)

        await app.connect()

    app.form_network = mock.AsyncMock()
    await app.load_network_info()
    await app.start_network()
    return app
Ejemplo n.º 3
0
async def test_get_association_state(app):
    ai_results = (0xFF, 0xFF, 0xFF, 0xFF, mock.sentinel.ai)
    app._api._at_command = mock.AsyncMock(
        spec=XBee._at_command,
        side_effect=ai_results,
    )
    ai = await app._get_association_state()
    assert app._api._at_command.call_count == len(ai_results)
    assert ai is mock.sentinel.ai
Ejemplo n.º 4
0
def app(monkeypatch):
    monkeypatch.setattr(application, "TIMEOUT_TX_STATUS", 0.1)
    monkeypatch.setattr(application, "TIMEOUT_REPLY", 0.1)
    monkeypatch.setattr(application, "TIMEOUT_REPLY_EXTENDED", 0.1)
    app = application.ControllerApplication(APP_CONFIG)
    api = XBee(APP_CONFIG[config.CONF_DEVICE])
    monkeypatch.setattr(api, "_command", mock.AsyncMock())
    app._api = api

    app.state.node_info.nwk = 0x0000
    app.state.node_info.ieee = t.EUI64.convert("aa:bb:cc:dd:ee:ff:00:11")
    return app
Ejemplo n.º 5
0
async def test_api_mode_at_commands(api):
    api.command_mode_at_cmd = mock.AsyncMock(
        return_value=mock.sentinel.api_mode)

    res = await api.api_mode_at_commands(57600)
    assert res is True

    async def mock_at_cmd(cmd):
        if cmd == "ATWR\r":
            return False
        return True

    api.command_mode_at_cmd = mock_at_cmd
    res = await api.api_mode_at_commands(57600)
    assert res is None
Ejemplo n.º 6
0
async def test_reconnect_multiple_disconnects(monkeypatch, caplog):
    api = xbee_api.XBee(DEVICE_CONFIG)
    connect_mock = mock.AsyncMock(return_value=True)
    monkeypatch.setattr(uart, "connect", connect_mock)

    await api.connect()

    caplog.set_level(logging.DEBUG)
    connect_mock.reset_mock()
    connect_mock.side_effect = [OSError, mock.sentinel.uart_reconnect]
    api.connection_lost("connection lost")
    await asyncio.sleep(0.3)
    api.connection_lost("connection lost 2")
    await asyncio.sleep(0.3)

    assert "Cancelling reconnection attempt" in caplog.messages
    assert api._uart is mock.sentinel.uart_reconnect
    assert connect_mock.call_count == 2
Ejemplo n.º 7
0
async def test_form_network(app):
    legacy_module = False

    async def mock_at_command(cmd, *args):
        if cmd == "MY":
            return 0x0000
        elif cmd == "WR":
            app._api.coordinator_started_event.set()
        elif cmd == "CE" and legacy_module:
            raise RuntimeError
        return None

    app._api._at_command = mock.MagicMock(spec=XBee._at_command,
                                          side_effect=mock_at_command)
    app._api._queued_at = mock.MagicMock(spec=XBee._at_command,
                                         side_effect=mock_at_command)
    app._get_association_state = mock.AsyncMock(
        spec=application.ControllerApplication._get_association_state,
        return_value=0x00,
    )

    app.write_network_info = mock.MagicMock(wraps=app.write_network_info)

    await app.form_network()
    assert app._api._at_command.call_count >= 1
    assert app._api._queued_at.call_count >= 7

    network_info = app.write_network_info.mock_calls[0][2]["network_info"]

    app._api._queued_at.assert_any_call("SC", 1 << (network_info.channel - 11))
    app._api._queued_at.assert_any_call("KY", b"ZigBeeAlliance09")

    app._api._at_command.reset_mock()
    app._api._queued_at.reset_mock()
    legacy_module = True
    await app.form_network()
    assert app._api._at_command.call_count >= 1
    assert app._api._queued_at.call_count >= 7

    network_info = app.write_network_info.mock_calls[0][2]["network_info"]

    app._api._queued_at.assert_any_call("SC", 1 << (network_info.channel - 11))
    app._api._queued_at.assert_any_call("KY", b"ZigBeeAlliance09")
Ejemplo n.º 8
0
async def test_reconnect_multiple_attempts(monkeypatch, caplog):
    api = xbee_api.XBee(DEVICE_CONFIG)
    connect_mock = mock.AsyncMock(return_value=True)
    monkeypatch.setattr(uart, "connect", connect_mock)

    await api.connect()

    caplog.set_level(logging.DEBUG)
    connect_mock.reset_mock()
    connect_mock.side_effect = [
        asyncio.TimeoutError,
        OSError,
        mock.sentinel.uart_reconnect,
    ]

    with mock.patch("asyncio.sleep"):
        api.connection_lost("connection lost")
        await api._conn_lost_task

    assert api._uart is mock.sentinel.uart_reconnect
    assert connect_mock.call_count == 3
Ejemplo n.º 9
0
async def test_permit(app):
    app._api._at_command = mock.AsyncMock()
    time_s = 30
    await app.permit_ncp(time_s)
    assert app._api._at_command.call_count == 2
    assert app._api._at_command.call_args_list[0][0][1] == time_s
Ejemplo n.º 10
0
async def test_enter_at_command_mode(api):
    api.command_mode_at_cmd = mock.AsyncMock(
        return_value=mock.sentinel.at_response)

    res = await api.enter_at_command_mode()
    assert res == mock.sentinel.at_response
Ejemplo n.º 11
0
async def test_connect(monkeypatch):
    api = xbee_api.XBee(DEVICE_CONFIG)
    monkeypatch.setattr(uart, "connect", mock.AsyncMock())
    await api.connect()