コード例 #1
0
ファイル: test_event_filter.py プロジェクト: lsta/pai
def test_zone_generated_alarm_changes_match(mocker):
    label_provider = mocker.MagicMock(return_value="Beer")

    payload = binascii.unhexlify(
        'e2ff1cc414130b010f2c1801030000000000024f66666963652020202020202020202000d9'
    )
    raw = LiveEventMessage.parse(payload)
    event_ = LiveEvent(raw, event_map, label_provider=label_provider)

    assert EventTagFilter(['generated_alarm=True']).match(event_) is True
    assert EventTagFilter(['generated_alarm=False']).match(event_) is False
    assert EventTagFilter(['generated_alarm=']).match(event_) is True

    assert EventTagFilter(['-generated_alarm=']).match(event_) is False
    assert EventTagFilter(['-generated_alarm=True']).match(event_) is False
    assert EventTagFilter(['-generated_alarm=False']).match(event_) is True

    assert EventTagFilter(['zone-generated_alarm=beer']).match(event_) is True
    assert EventTagFilter(['zone+generated_alarm=beer']).match(event_) is False

    assert EventTagFilter(['generated_alarm=True+presently_in_alarm=True'
                           ]).match(event_) is True
    assert EventTagFilter(['generated_alarm=True-presently_in_alarm=True'
                           ]).match(event_) is False

    assert EventTagFilter(['-generated_alarm=False']).match(event_) is True

    with pytest.raises(AssertionError):
        EventTagFilter(['-=False'])

    with pytest.raises(AssertionError):
        EventTagFilter(['-""=False'])
コード例 #2
0
ファイル: test_event_parsing.py プロジェクト: j0nathan33/pai
def test_event_winload_connected():
    payload = b'\xe2\xff\xaa\xb0\x14\x13\x01\x04\x0b$-\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7'

    raw = LiveEvent.parse(payload)
    event = Event(event_map, raw)
    assert "Special events: WinLoad in (connected)" == event.message
    print(event)
コード例 #3
0
ファイル: test_event_parsing.py プロジェクト: j0nathan33/pai
def test_event_clock_restore():
    payload = b'\xe2\xff\xaa\xb1\x14\x13\x01\x04\x0b$%\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2'

    raw = LiveEvent.parse(payload)
    event = Event(event_map, raw)
    assert "Trouble restore: Clock loss restore" == event.message
    print(event)
コード例 #4
0
ファイル: test_event_parsing.py プロジェクト: j0nathan33/pai
def test_disconnect_event():
    payload = b'\xe0\xff\xe1\xe8\x14\x13\x02\x11\x0f%-\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H'

    raw = LiveEvent.parse(payload)
    event = Event(event_map, raw)
    assert "Special events: WinLoad out (disconnected)" == event.message
    print(event)
コード例 #5
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_door_user2(mocker):
    payload = b"\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x06\x01\x05\x01\x00\x00\x00\x00\x02Living room     \x00\xd3"

    raw = LiveEvent.parse(payload)

    def label_provider(type, id):
        if type == "user":
            assert id == 5
            return "Test"
        elif type == "partition":
            assert id == 5
            return "First floor"
        elif type == "door":
            assert id == 5
            return "Door 1"
        else:
            assert False

    mocker.patch.dict(
        event_map[6], {"message": "User {@user#minor} access on door {@door}"}
    )

    event_ = event.LiveEvent(raw, event_map, label_provider=label_provider)

    assert "User Test access on door Door 1" == event_.message
    print(event_)
コード例 #6
0
ファイル: test_event_parsing.py プロジェクト: j0nathan33/pai
def test_door_user2():
    payload = b'\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x06\x01\x05\x01\x00\x00\x00\x00\x02Living room     \x00\xd3'

    raw = LiveEvent.parse(payload)

    def label_provider(type, id):
        if type == 'user':
            assert id == 5
            return 'Test'
        elif type == 'partition':
            assert id == 5
            return 'First floor'
        elif type == 'door':
            assert id == 5
            return 'Door 1'
        else:
            assert False

    # monkey patch
    event_map[6]['message'] = 'User {@user#minor} access on door {@door}'

    event = Event(event_map, raw, label_provider=label_provider)

    assert "User Test access on door Door 1" == event.message
    print(event)
コード例 #7
0
ファイル: test_event_filter.py プロジェクト: lsta/pai
def test_zone_generated_alarm_match(mocker):
    label_provider = mocker.MagicMock(return_value="Beer")

    payload = binascii.unhexlify(
        'e2ff1cc414130b010f2c1801030000000000024f66666963652020202020202020202000d9'
    )
    raw = LiveEventMessage.parse(payload)
    event_ = LiveEvent(raw, event_map, label_provider=label_provider)
    assert "Zone Office in alarm" == event_.message

    assert EventTagFilter(['zone+alarm']).match(event_) is True
    label_provider.assert_called_once_with("zone", 3)

    assert EventTagFilter(['zone-alarm']).match(event_) is False

    # Live event label
    assert EventTagFilter(['zone,alarm,"Office"']).match(event_) is True
    assert EventTagFilter(['zone,alarm,-"Office"']).match(event_) is False
    assert EventTagFilter(['zone,alarm,Office']).match(event_) is True
    assert EventTagFilter(['zone,alarm,-Office']).match(event_) is False
    assert EventTagFilter(['zone,alarm,Offic']).match(event_) is False

    # returned from label_provider
    assert EventTagFilter(['zone,alarm,Beer']).match(event_) is True
    assert EventTagFilter(['zone,alarm,-Beer']).match(event_) is False
コード例 #8
0
def test_partition_armed_by_pai():
    payload = binascii.unhexlify(
        'e2ff187914130b0e0e3b0c0101000000000000000000000000000000000000000000000009'
    )
    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    assert "Special arming [partition:1]: arming with Winload by [user:0]" == event_.message
    print(event_)
コード例 #9
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_partition_disarmed_by_user_master():
    payload = binascii.unhexlify(
        "e2ffe86e1414030d15390d0801000000000001546573740000000000000000000000000074"
    )
    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    assert "[partition:8] disarmed with [user:1] master code" == event_.message
    print(event_)
コード例 #10
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_partition_disarmed_by_user():
    payload = binascii.unhexlify(
        "e2ffe85e1414030d152c0e0802000000000001546573740000000000000000000000000059"
    )
    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    assert "[partition:8] disarmed with [user:2] code" == event_.message
    print(event_)
コード例 #11
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_partition_armed_by_user():
    payload = binascii.unhexlify(
        "e2ffe8601414030d152d0a0802000000000001546573740000000000000000000000000058"
    )
    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    assert "Arming [partition:8] with [user:2] code" == event_.message
    print(event_)
コード例 #12
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_zone_alarm_restored():
    payload = binascii.unhexlify(
        "e2ff1cd914130b010f2f1a0102000000000002456e7472616e636520202020202020200096"
    )
    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    assert "Zone Entrance alarm restore" == event_.message
    print(event_)
コード例 #13
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_zone_generated_alarm():
    payload = binascii.unhexlify(
        "e2ff1cc414130b010f2c1801030000000000024f66666963652020202020202020202000d9"
    )
    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    assert "Zone Office in alarm" == event_.message
    print(event_)
コード例 #14
0
ファイル: test_event_parsing.py プロジェクト: j0nathan33/pai
def test_zone_open():
    payload = b'\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x01\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcd'

    raw = LiveEvent.parse(payload)
    event = Event(event_map, raw, label_provider=label_provider)

    assert event.change == {'open': True}
    assert "Zone Living room open" == event.message
    print(event)
コード例 #15
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_zone_open():
    payload = b"\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x01\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcd"

    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map, label_provider=label_provider)

    assert event_.change == {"open": True}
    assert "Zone Living room open" == event_.message
    print(event_)
コード例 #16
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_event_clock_restore():
    payload = b"\xe2\xff\xaa\xb1\x14\x13\x01\x04\x0b$%\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2"

    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    print(event_)

    assert "Trouble restore: Clock loss restore" == event_.message
    assert all(t in event_.tags for t in ["trouble", "clock"])
コード例 #17
0
def test_handler_two_messages():
    def event_handler(message):
        print("event")
        return "event"

    async def get_eeprom_result(mhm):
        return await mhm.wait_for_message(
            lambda m: m.fields.value.po.command == 0x5)

    event_response_bin = b'\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x00\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcc'

    eeprom_response_bin = binascii.unhexlify(
        '524700009f0041133e001e0e0400000000060a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121510010705004e85'
    )

    loop = asyncio.get_event_loop()
    mh = AsyncMessageManager(loop)

    event_handler = EventMessageHandler(event_handler)
    mh.register_handler(event_handler)

    # running
    task_handle_wait = loop.create_task(asyncio.sleep(0.1))
    task_get_eeprom = loop.create_task(get_eeprom_result(mh))
    task_handle_event1 = loop.create_task(
        mh._handle_message(LiveEvent.parse(event_response_bin)))
    loop.create_task(
        mh._handle_message(ReadEEPROMResponse.parse(eeprom_response_bin)))
    task_handle_event2 = loop.create_task(
        mh._handle_message(LiveEvent.parse(event_response_bin)))

    # assert 2 == len(mh.handlers)

    loop.run_until_complete(
        asyncio.gather(task_handle_wait, task_get_eeprom, loop=loop))

    assert 1 == len(mh.handlers)

    assert task_handle_event1.result(
    ) == "event"  # failed to parse response message return None. Maybe needs to throw something.
    assert isinstance(task_get_eeprom.result(), Container)
    assert task_handle_event2.result() == "event"

    assert 1 == len(mh.handlers)
コード例 #18
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_door_user(mocker):
    payload = b"\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x06\x01\x05\x01\x00\x00\x00\x00\x02Living room     \x00\xd3"

    raw = LiveEvent.parse(payload)

    mocker.patch.dict(event_map[6], {"message": "User {@user} access on door {@door}"})

    event_ = event.LiveEvent(raw, event_map, label_provider=label_provider)

    assert "User Test access on door Door 1" == event_.message
    print(event_)
コード例 #19
0
ファイル: test_event_parsing.py プロジェクト: j0nathan33/pai
def test_door_user():
    payload = b'\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x06\x01\x05\x01\x00\x00\x00\x00\x02Living room     \x00\xd3'

    raw = LiveEvent.parse(payload)

    # monkey patch
    event_map[6]['message'] = 'User {@user} access on door {@door}'

    event = Event(event_map, raw, label_provider=label_provider)

    assert "User Test access on door Door 1" == event.message
    print(event)
コード例 #20
0
def test_handler_timeout():
    def event_handler(message):
        print("event")
        return "event"

    async def get_eeprom_result(mhm):
        try:
            return await mhm.wait_for_message(
                lambda m: m.fields.value.po.command == 0x5, timeout=0.1)
        except asyncio.TimeoutError:
            return None

    async def post_eeprom_message(mhm):
        await asyncio.sleep(0.2)

        eeprom_response_bin = binascii.unhexlify(
            '524700009f0041133e001e0e0400000000060a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121510010705004e85'
        )

        return await mhm._handle_message(
            ReadEEPROMResponse.parse(eeprom_response_bin))

    loop = asyncio.get_event_loop()
    mh = AsyncMessageManager(loop)

    # running
    task_handle_wait = loop.create_task(asyncio.sleep(0.1))
    task_get_eeprom = loop.create_task(get_eeprom_result(mh))
    loop.create_task(post_eeprom_message(mh))

    assert 0 == len(mh.handlers)

    loop.run_until_complete(
        asyncio.gather(task_handle_wait, task_get_eeprom, loop=loop))

    assert 1 == len(mh.handlers)

    event_handler = EventMessageHandler(event_handler)
    mh.register_handler(event_handler)

    event_response_bin = b'\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x00\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcc'
    task_handle_event1 = mh.schedule_message_handling(
        LiveEvent.parse(event_response_bin))

    loop.run_until_complete(task_handle_event1)

    assert 1 == len(mh.handlers)

    result = task_get_eeprom.result()

    assert result is None
コード例 #21
0
ファイル: test_current_state.py プロジェクト: lsta/pai
def test_current_alarm(mocker):
    alarm = Paradox(None)
    mocker.spy(alarm.storage, 'update_container_object')
    alarm.panel = Panel_EVO192(alarm, 5)

    send_initial_status(alarm)

    payload = binascii.unhexlify('e2ff1cc414130b010f2c1801030000000000024f66666963652020202020202020202000d9')
    raw = LiveEvent.parse(payload)
    alarm.handle_event_message(raw)

    alarm.storage.update_container_object.assert_any_call('partition', 'Partition_1', {
        'current_state': 'triggered'
    })
コード例 #22
0
def test_handler_timeout():
    def event_handler(message):
        print("event received")

    async def get_eeprom_result(mhm):
        return await mhm.wait_for_message(
            lambda m: m.fields.value.po.command == 0x5, timeout=0.1)

    async def post_eeprom_message(mhm):
        await asyncio.sleep(0.2)

        eeprom_response_bin = binascii.unhexlify(
            "524700009f0041133e001e0e0400000000060a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121510010705004e85"
        )

        return await mhm.schedule_message_handling(
            ReadEEPROMResponse.parse(eeprom_response_bin))

    loop = asyncio.get_event_loop()
    mh = AsyncMessageManager(loop)

    # running
    task_get_eeprom = loop.create_task(get_eeprom_result(mh))
    loop.create_task(post_eeprom_message(mh))

    assert 0 == len(mh.handler_registry)

    with pytest.raises(asyncio.TimeoutError):
        loop.run_until_complete(task_get_eeprom)

    assert 0 == len(mh.handler_registry)

    # Also test EventMessageHandler
    event_handler = EventMessageHandler(event_handler)
    mh.register_handler(event_handler)

    event_response_bin = b"\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x00\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcc"
    task_handle_event1 = mh.schedule_message_handling(
        LiveEvent.parse(event_response_bin))

    assert 1 == len(mh.handler_registry)

    loop.run_until_complete(task_handle_event1)

    assert 1 == len(mh.handler_registry)
コード例 #23
0
ファイル: test_current_state.py プロジェクト: jakezp/pai-1
async def test_current_alarm(mocker):
    mocker.patch('paradox.lib.utils.main_thread_loop', asyncio.get_event_loop())
    alarm = Paradox(None)
    alarm.panel = Panel_EVO192(alarm, 5)
    mocker.spy(alarm.storage, 'update_container_object')

    send_initial_status(alarm)

    payload = binascii.unhexlify('e2ff1cc414130b010f2c1801030000000000024f66666963652020202020202020202000d9')
    raw = LiveEvent.parse(payload)
    alarm.handle_event_message(raw)

    await asyncio.sleep(0.01)

    alarm.storage.update_container_object.assert_any_call('partition', 'Partition_1', {
        'current_state': 'triggered'
    })
    alarm.panel = None
コード例 #24
0
def test_event_handler():
    eh = EventMessageHandler(print_beer)

    loop = asyncio.get_event_loop()
    mh = AsyncMessageManager(loop)

    mh.register_handler(eh)

    assert 1 == len(mh.handler_registry)

    payload = b"\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x00\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcc"

    message = LiveEvent.parse(payload)

    coro = asyncio.ensure_future(mh.schedule_message_handling(message))
    loop.run_until_complete(coro)

    assert 1 == len(mh.handler_registry)
コード例 #25
0
ファイル: test_event_parsing.py プロジェクト: j0nathan33/pai
def test_zone_ok():
    payload = b'\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x00\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcc'

    raw = LiveEvent.parse(payload)

    def label_provider(type, id):
        assert type == 'partition'
        assert id == 1
        return 'First floor'

    # monkey patch
    event_map[0]['message'] = 'Zone {label} OK in partition {@partition}'

    event = Event(event_map, raw, label_provider=label_provider)

    assert event.change == {'open': False}

    assert "Zone Living room OK in partition First floor" == event.message
    print(event)
コード例 #26
0
def test_event_handler():
    eh = EventMessageHandler(lambda m: "beer")

    loop = asyncio.get_event_loop()
    mh = AsyncMessageManager(loop)

    mh.register_handler(eh)

    assert 1 == len(mh.handlers)

    payload = b'\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x00\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcc'

    message = LiveEvent.parse(payload)

    coro = asyncio.ensure_future(mh._handle_message(message))
    loop.run_until_complete(coro)
    assert "beer" == coro.result()

    assert 1 == len(mh.handlers)
コード例 #27
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_zone_ok(mocker):
    payload = b"\xe2\xff\xad\x06\x14\x13\x01\x04\x0e\x10\x00\x01\x05\x00\x00\x00\x00\x00\x02Living room     \x00\xcc"

    raw = LiveEvent.parse(payload)

    def my_label_provider(type, id):
        assert type == "partition"
        assert id == 1
        return "First floor"

    mocker.patch.dict(
        event_map[0], {"message": "Zone {label} OK in partition {@partition}"}
    )

    event_ = event.LiveEvent(raw, event_map, label_provider=my_label_provider)

    assert event_.change == {"open": False}

    assert "Zone Living room OK in partition First floor" == event_.message
    print(event_)
コード例 #28
0
ファイル: test_current_state.py プロジェクト: torretahacs/pai
async def test_current_alarm(mocker):
    mocker.patch("paradox.lib.utils.main_thread_loop",
                 asyncio.get_event_loop())
    alarm = Paradox(None)

    alarm.panel = create_evo192_panel(alarm)
    mocker.spy(alarm.storage, "update_container_object")

    send_initial_status(alarm)

    payload = binascii.unhexlify(
        "e2ff1cc414130b010f2c1801030000000000024f66666963652020202020202020202000d9"
    )
    raw = LiveEvent.parse(payload)
    alarm.handle_event_message(raw)

    await asyncio.sleep(0.01)

    alarm.storage.update_container_object.assert_any_call(
        "partition", "Partition_1", {"current_state": "triggered"})
    alarm.panel = None
コード例 #29
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_door_access():
    payload = b"\xe0\xff\xc1d\x14\x13\x0c\x05\x11\x19\x06\x00\x01\n\x00\x00\x00\x00\x03V\x99LIKS DOOR\x00\x00\x00\x00\x00+\x1b"
    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    assert "[user:10] access on door VLIKS DOOR" == event_.message
    print(event_)
コード例 #30
0
ファイル: test_event_parsing.py プロジェクト: torretahacs/pai
def test_door_access_granted():
    payload = b"\xe0\xff\xc1c\x14\x13\x0c\x05\x11\x19>\x00\n\x01\x00\x00\x00\x00\x01First Lastname \x001\x5d"
    raw = LiveEvent.parse(payload)
    event_ = event.LiveEvent(raw, event_map)
    assert "[door:1] access granted to user First Lastname" == event_.message
    print(event_)