Esempio n. 1
0
    def test_homekit_class(self, mock_acc_driver):
        """Test interaction between the HomeKit class and pyhap."""
        with patch(PATH_HOMEKIT + '.accessories.HomeBridge') as mock_bridge:
            homekit = HomeKit(self.hass, 51826)
            homekit.setup_bridge(b'123-45-678')

        mock_bridge.reset_mock()
        self.hass.states.set('demo.demo1', 'on')
        self.hass.states.set('demo.demo2', 'off')

        with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc, \
            patch(PATH_HOMEKIT + '.import_types') as mock_import_types, \
                patch('homeassistant.util.get_local_ip') as mock_ip:
            mock_get_acc.side_effect = ['TempSensor', 'Window']
            mock_ip.return_value = IP_ADDRESS
            homekit.start_driver(Event(EVENT_HOMEASSISTANT_START))

        path = self.hass.config.path(HOMEKIT_FILE)

        self.assertEqual(mock_import_types.call_count, 1)
        self.assertEqual(mock_get_acc.call_count, 2)
        self.assertEqual(mock_bridge.mock_calls,
                         [call().add_accessory('TempSensor'),
                          call().add_accessory('Window')])
        self.assertEqual(mock_acc_driver.mock_calls,
                         [call(homekit.bridge, 51826, IP_ADDRESS, path),
                          call().start()])
        mock_acc_driver.reset_mock()

        self.hass.bus.fire(EVENT_HOMEASSISTANT_STOP)
        self.hass.block_till_done()

        self.assertEqual(mock_acc_driver.mock_calls, [call().stop()])
Esempio n. 2
0
async def test_homekit_reset_accessories(hass):
    """Test adding too many accessories to HomeKit."""
    entity_id = "light.demo"
    homekit = HomeKit(hass, None, None, None, {}, {entity_id: {}}, None)
    homekit.bridge = Mock()

    with patch(PATH_HOMEKIT + ".HomeKit", return_value=homekit), patch(
            PATH_HOMEKIT + ".HomeKit.setup"), patch(
                "pyhap.accessory.Bridge.add_accessory"
            ) as mock_add_accessory, patch(
                "pyhap.accessory_driver.AccessoryDriver.config_changed"
            ) as hk_driver_config_changed:

        assert await setup.async_setup_component(hass, DOMAIN, {DOMAIN: {}})

        aid = generate_aid(entity_id)
        homekit.bridge.accessories = {aid: "acc"}
        homekit.status = STATUS_RUNNING

        await hass.services.async_call(
            DOMAIN,
            SERVICE_HOMEKIT_RESET_ACCESSORY,
            {ATTR_ENTITY_ID: entity_id},
            blocking=True,
        )
        await hass.async_block_till_done()

        assert 2 == hk_driver_config_changed.call_count
        assert mock_add_accessory.called
        homekit.status = STATUS_READY
async def test_homekit_start(hass, hk_driver, debounce_patcher):
    """Test HomeKit start method."""
    pin = b'123-45-678'
    homekit = HomeKit(hass, None, None, {}, {'cover.demo': {}})
    homekit.bridge = 'bridge'
    homekit.driver = hk_driver

    hass.states.async_set('light.demo', 'on')
    state = hass.states.async_all()[0]

    with patch(PATH_HOMEKIT + '.HomeKit.add_bridge_accessory') as \
        mock_add_acc, \
        patch(PATH_HOMEKIT + '.show_setup_message') as mock_setup_msg, \
        patch('pyhap.accessory_driver.AccessoryDriver.add_accessory') as \
        hk_driver_add_acc, \
        patch('pyhap.accessory_driver.AccessoryDriver.start') as \
            hk_driver_start:
        await hass.async_add_job(homekit.start)

    mock_add_acc.assert_called_with(state)
    mock_setup_msg.assert_called_with(hass, pin)
    hk_driver_add_acc.assert_called_with('bridge')
    assert hk_driver_start.called
    assert homekit.status == STATUS_RUNNING

    # Test start() if already started
    hk_driver_start.reset_mock()
    await hass.async_add_job(homekit.start)
    assert not hk_driver_start.called
Esempio n. 4
0
async def test_homekit_start_with_a_broken_accessory(hass, hk_driver,
                                                     debounce_patcher):
    """Test HomeKit start method."""
    pin = b"123-45-678"
    entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], [])

    assert await setup.async_setup_component(hass, DOMAIN, {DOMAIN: {}})

    homekit = HomeKit(hass, None, None, None, entity_filter, {}, None, None)
    homekit.bridge = Mock()
    homekit.bridge.accessories = []
    homekit.driver = hk_driver

    hass.states.async_set("light.demo", "on")
    hass.states.async_set("light.broken", "on")

    with patch(
            f"{PATH_HOMEKIT}.get_accessory", side_effect=Exception
    ), patch(f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch(
            "pyhap.accessory_driver.AccessoryDriver.add_accessory",
    ) as hk_driver_add_acc, patch(
            "pyhap.accessory_driver.AccessoryDriver.start") as hk_driver_start:
        await homekit.async_start()

    mock_setup_msg.assert_called_with(hass, pin, ANY)
    hk_driver_add_acc.assert_called_with(homekit.bridge)
    assert hk_driver_start.called
    assert homekit.status == STATUS_RUNNING

    # Test start() if already started
    hk_driver_start.reset_mock()
    await homekit.async_start()
    assert not hk_driver_start.called
Esempio n. 5
0
    def test_homekit_setup_ip_address(self):
        """Test setup with given IP address."""
        homekit = HomeKit(self.hass, DEFAULT_PORT, '172.0.0.0', {}, {})

        with patch(PATH_HOMEKIT + '.accessories.HomeDriver') as mock_driver:
            homekit.setup()
        mock_driver.assert_called_with(ANY, DEFAULT_PORT, '172.0.0.0', ANY)
Esempio n. 6
0
async def test_homekit_start(hass, hk_driver, debounce_patcher):
    """Test HomeKit start method."""
    pin = b'123-45-678'
    homekit = HomeKit(hass, None, None, None, {}, {'cover.demo': {}}, None)
    homekit.bridge = Mock()
    homekit.bridge.accessories = []
    homekit.driver = hk_driver

    hass.states.async_set('light.demo', 'on')
    state = hass.states.async_all()[0]

    with patch(PATH_HOMEKIT + '.HomeKit.add_bridge_accessory') as \
        mock_add_acc, \
        patch(PATH_HOMEKIT + '.show_setup_message') as mock_setup_msg, \
        patch('pyhap.accessory_driver.AccessoryDriver.add_accessory') as \
        hk_driver_add_acc, \
        patch('pyhap.accessory_driver.AccessoryDriver.start') as \
            hk_driver_start:
        await hass.async_add_job(homekit.start)

    mock_add_acc.assert_called_with(state)
    mock_setup_msg.assert_called_with(hass, pin)
    hk_driver_add_acc.assert_called_with(homekit.bridge)
    assert hk_driver_start.called
    assert homekit.status == STATUS_RUNNING

    # Test start() if already started
    hk_driver_start.reset_mock()
    await hass.async_add_job(homekit.start)
    assert not hk_driver_start.called
Esempio n. 7
0
async def test_homekit_start(hass, hk_driver, debounce_patcher):
    """Test HomeKit start method."""
    pin = b"123-45-678"
    homekit = HomeKit(hass, None, None, None, {}, {"cover.demo": {}}, None,
                      None)
    homekit.bridge = Mock()
    homekit.bridge.accessories = []
    homekit.driver = hk_driver
    homekit._filter = Mock(return_value=True)

    hass.states.async_set("light.demo", "on")
    state = hass.states.async_all()[0]

    with patch(
            f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory"
    ) as mock_add_acc, patch(
            f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch(
                "pyhap.accessory_driver.AccessoryDriver.add_accessory"
            ) as hk_driver_add_acc, patch(
                "pyhap.accessory_driver.AccessoryDriver.start"
            ) as hk_driver_start:
        await homekit.async_start()

    mock_add_acc.assert_called_with(state)
    mock_setup_msg.assert_called_with(hass, pin, ANY)
    hk_driver_add_acc.assert_called_with(homekit.bridge)
    assert hk_driver_start.called
    assert homekit.status == STATUS_RUNNING

    # Test start() if already started
    hk_driver_start.reset_mock()
    await homekit.async_start()
    assert not hk_driver_start.called
Esempio n. 8
0
    def test_homekit_setup_ip_address(self):
        """Test setup with given IP address."""
        homekit = HomeKit(self.hass, DEFAULT_PORT, '172.0.0.0', {}, {})

        with patch(PATH_HOMEKIT + '.accessories.HomeDriver') as mock_driver:
            homekit.setup()
        mock_driver.assert_called_with(ANY, DEFAULT_PORT, '172.0.0.0', ANY)
Esempio n. 9
0
async def test_homekit_too_many_accessories(hass, hk_driver):
    """Test adding too many accessories to HomeKit."""
    entry = await async_init_integration(hass)

    entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], [])

    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        entity_filter,
        {},
        DEFAULT_SAFE_MODE,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )
    homekit.bridge = Mock()
    # The bridge itself counts as an accessory
    homekit.bridge.accessories = range(MAX_DEVICES)
    homekit.driver = hk_driver

    hass.states.async_set("light.demo", "on")

    with patch("pyhap.accessory_driver.AccessoryDriver.start"), patch(
        "pyhap.accessory_driver.AccessoryDriver.add_accessory"
    ), patch("homeassistant.components.homekit._LOGGER.warning") as mock_warn, patch(
        f"{PATH_HOMEKIT}.show_setup_message"
    ):
        await homekit.async_start()
        await hass.async_block_till_done()
        assert mock_warn.called is True
Esempio n. 10
0
async def test_homekit_add_accessory(hass):
    """Add accessory if config exists and get_acc returns an accessory."""
    entry = await async_init_integration(hass)

    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        lambda entity_id: True,
        {},
        DEFAULT_SAFE_MODE,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )
    homekit.driver = "driver"
    homekit.bridge = mock_bridge = Mock()
    homekit.bridge.accessories = range(10)

    await async_init_integration(hass)

    with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc:
        mock_get_acc.side_effect = [None, "acc", None]
        homekit.add_bridge_accessory(State("light.demo", "on"))
        mock_get_acc.assert_called_with(hass, "driver", ANY, 1403373688, {})
        assert not mock_bridge.add_accessory.called

        homekit.add_bridge_accessory(State("demo.test", "on"))
        mock_get_acc.assert_called_with(hass, "driver", ANY, 600325356, {})
        assert mock_bridge.add_accessory.called

        homekit.add_bridge_accessory(State("demo.test_2", "on"))
        mock_get_acc.assert_called_with(hass, "driver", ANY, 1467253281, {})
        mock_bridge.add_accessory.assert_called_with("acc")
Esempio n. 11
0
async def test_homekit_entity_filter(hass):
    """Test the entity filter."""
    entry = await async_init_integration(hass)

    entity_filter = generate_filter(["cover"], ["demo.test"], [], [])
    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        entity_filter,
        {},
        DEFAULT_SAFE_MODE,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )
    homekit.bridge = Mock()
    homekit.bridge.accessories = {}

    with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc:
        mock_get_acc.return_value = None

        homekit.add_bridge_accessory(State("cover.test", "open"))
        assert mock_get_acc.called is True
        mock_get_acc.reset_mock()

        homekit.add_bridge_accessory(State("demo.test", "on"))
        assert mock_get_acc.called is True
        mock_get_acc.reset_mock()

        homekit.add_bridge_accessory(State("light.demo", "light"))
        assert mock_get_acc.called is False
Esempio n. 12
0
async def test_homekit_remove_accessory():
    """Remove accessory from bridge."""
    homekit = HomeKit("hass", None, None, None, lambda entity_id: True, {},
                      None)
    homekit.driver = "driver"
    homekit.bridge = mock_bridge = Mock()
    mock_bridge.accessories = {"light.demo": "acc"}

    acc = homekit.remove_bridge_accessory("light.demo")
    assert acc == "acc"
    assert len(mock_bridge.accessories) == 0
Esempio n. 13
0
async def test_homekit_too_many_accessories(hass, hk_driver):
    """Test adding too many accessories to HomeKit."""
    homekit = HomeKit(hass, None, None, None, None, None, None)
    homekit.bridge = Mock()
    homekit.bridge.accessories = range(MAX_DEVICES + 1)
    homekit.driver = hk_driver

    with patch("pyhap.accessory_driver.AccessoryDriver.start"), patch(
            "pyhap.accessory_driver.AccessoryDriver.add_accessory"
    ), patch("homeassistant.components.homekit._LOGGER.warning") as mock_warn:
        await hass.async_add_job(homekit.start)
        assert mock_warn.called is True
Esempio n. 14
0
async def test_homekit_start_with_a_broken_accessory(hass, hk_driver,
                                                     debounce_patcher):
    """Test HomeKit start method."""
    pin = b"123-45-678"
    entry = MockConfigEntry(domain=DOMAIN,
                            data={
                                CONF_NAME: "mock_name",
                                CONF_PORT: 12345
                            })
    entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], [])

    await async_init_entry(hass, entry)
    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        entity_filter,
        {},
        DEFAULT_SAFE_MODE,
        HOMEKIT_MODE_BRIDGE,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )

    homekit.bridge = Mock()
    homekit.bridge.accessories = []
    homekit.driver = hk_driver
    homekit.driver.accessory = Accessory(hk_driver, "any")

    hass.states.async_set("light.demo", "on")
    hass.states.async_set("light.broken", "on")

    with patch(f"{PATH_HOMEKIT}.get_accessory", side_effect=Exception), patch(
            f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch(
                "pyhap.accessory_driver.AccessoryDriver.add_accessory",
            ) as hk_driver_add_acc, patch(
                "pyhap.accessory_driver.AccessoryDriver.start_service"
            ) as hk_driver_start:
        await homekit.async_start()

    await hass.async_block_till_done()
    mock_setup_msg.assert_called_with(hass, entry.entry_id, None, pin, ANY)
    hk_driver_add_acc.assert_called_with(homekit.bridge)
    assert hk_driver_start.called
    assert homekit.status == STATUS_RUNNING

    # Test start() if already started
    hk_driver_start.reset_mock()
    await homekit.async_start()
    await hass.async_block_till_done()
    assert not hk_driver_start.called
Esempio n. 15
0
async def test_homekit_too_many_accessories(hass, hk_driver):
    """Test adding too many accessories to HomeKit."""
    homekit = HomeKit(hass, None, None, None, None, None, None)
    homekit.bridge = Mock()
    homekit.bridge.accessories = range(MAX_DEVICES + 1)
    homekit.driver = hk_driver

    with patch('pyhap.accessory_driver.AccessoryDriver.start'), \
            patch('pyhap.accessory_driver.AccessoryDriver.add_accessory'), \
            patch('homeassistant.components.homekit._LOGGER.warning') \
            as mock_warn:
        await hass.async_add_job(homekit.start)
        assert mock_warn.called is True
Esempio n. 16
0
async def test_homekit_reset_accessories(hass):
    """Test adding too many accessories to HomeKit."""

    entry = MockConfigEntry(domain=DOMAIN,
                            data={
                                CONF_NAME: "mock_name",
                                CONF_PORT: 12345
                            })
    entity_id = "light.demo"
    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        {},
        {entity_id: {}},
        DEFAULT_SAFE_MODE,
        advertise_ip=None,
        interface_choice=None,
        entry_id=entry.entry_id,
    )
    homekit.bridge = Mock()
    homekit.bridge.accessories = {}

    with patch(f"{PATH_HOMEKIT}.HomeKit", return_value=homekit), patch(
            f"{PATH_HOMEKIT}.HomeKit.setup"), patch(
                "pyhap.accessory.Bridge.add_accessory"
            ) as mock_add_accessory, patch(
                "pyhap.accessory_driver.AccessoryDriver.config_changed"
            ) as hk_driver_config_changed, patch(
                "pyhap.accessory_driver.AccessoryDriver.start"):
        await async_init_entry(hass, entry)

        aid = hass.data[DOMAIN][entry.entry_id][
            AID_STORAGE].get_or_allocate_aid_for_entity_id(entity_id)
        homekit.bridge.accessories = {aid: "acc"}
        homekit.status = STATUS_RUNNING

        await hass.services.async_call(
            DOMAIN,
            SERVICE_HOMEKIT_RESET_ACCESSORY,
            {ATTR_ENTITY_ID: entity_id},
            blocking=True,
        )
        await hass.async_block_till_done()

        assert 2 == hk_driver_config_changed.call_count
        assert mock_add_accessory.called
        homekit.status = STATUS_READY
Esempio n. 17
0
async def test_homekit_setup_interface_choice(hass, hk_driver):
    """Test setup with interface choice of Default."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        data={CONF_NAME: "mock_name", CONF_PORT: 12345},
        source=SOURCE_IMPORT,
    )
    homekit = HomeKit(
        hass,
        BRIDGE_NAME,
        DEFAULT_PORT,
        "0.0.0.0",
        {},
        {},
        None,
        None,
        InterfaceChoice.Default,
        entry_id=entry.entry_id,
    )

    path = get_persist_fullpath_for_entry_id(hass, entry.entry_id)
    with patch(
        f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver
    ) as mock_driver:
        await hass.async_add_executor_job(homekit.setup)
    mock_driver.assert_called_with(
        hass,
        entry.entry_id,
        BRIDGE_NAME,
        address="0.0.0.0",
        port=DEFAULT_PORT,
        persist_file=path,
        advertised_address=None,
        interface_choice=InterfaceChoice.Default,
    )
Esempio n. 18
0
async def test_homekit_setup_interface_choice(hass, hk_driver):
    """Test setup with interface choice of Default."""
    homekit = HomeKit(
        hass,
        BRIDGE_NAME,
        DEFAULT_PORT,
        "0.0.0.0",
        {},
        {},
        None,
        None,
        InterfaceChoice.Default,
    )

    with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver",
               return_value=hk_driver) as mock_driver:
        await hass.async_add_executor_job(homekit.setup)
    mock_driver.assert_called_with(
        hass,
        address="0.0.0.0",
        port=DEFAULT_PORT,
        persist_file=ANY,
        advertised_address=None,
        interface_choice=InterfaceChoice.Default,
    )
Esempio n. 19
0
async def test_homekit_setup(hass, hk_driver):
    """Test setup of bridge and driver."""
    homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {},
                      DEFAULT_SAFE_MODE)

    with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver",
               return_value=hk_driver) as mock_driver, patch(
                   "homeassistant.util.get_local_ip") as mock_ip:
        mock_ip.return_value = IP_ADDRESS
        await hass.async_add_executor_job(homekit.setup)

    path = hass.config.path(HOMEKIT_FILE)
    assert isinstance(homekit.bridge, HomeBridge)
    mock_driver.assert_called_with(
        hass,
        address=IP_ADDRESS,
        port=DEFAULT_PORT,
        persist_file=path,
        advertised_address=None,
        interface_choice=None,
    )
    assert homekit.driver.safe_mode is False

    # Test if stop listener is setup
    assert hass.bus.async_listeners().get(EVENT_HOMEASSISTANT_STOP) == 1
Esempio n. 20
0
async def test_homekit_setup_safe_mode(hass, hk_driver):
    """Test if safe_mode flag is set."""
    homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, True)

    with patch(PATH_HOMEKIT + ".HomeDriver", return_value=hk_driver):
        await hass.async_add_job(homekit.setup)
    assert homekit.driver.safe_mode is True
Esempio n. 21
0
async def test_homekit_setup_safe_mode(hass, hk_driver):
    """Test if safe_mode flag is set."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        data={
            CONF_NAME: "mock_name",
            CONF_PORT: 12345
        },
        source=SOURCE_IMPORT,
    )
    homekit = HomeKit(
        hass,
        BRIDGE_NAME,
        DEFAULT_PORT,
        None,
        {},
        {},
        True,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )

    with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver",
               return_value=hk_driver):
        await hass.async_add_executor_job(homekit.setup, MagicMock())
    assert homekit.driver.safe_mode is True
Esempio n. 22
0
async def test_homekit_setup_advertise_ip(hass, hk_driver):
    """Test setup with given IP address to advertise."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        data={CONF_NAME: "mock_name", CONF_PORT: 12345},
        source=SOURCE_IMPORT,
    )
    homekit = HomeKit(
        hass,
        BRIDGE_NAME,
        DEFAULT_PORT,
        "0.0.0.0",
        {},
        {},
        None,
        "192.168.1.100",
        entry_id=entry.entry_id,
    )

    zeroconf_instance = MagicMock()
    path = get_persist_fullpath_for_entry_id(hass, entry.entry_id)
    with patch(
        f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver
    ) as mock_driver:
        await hass.async_add_executor_job(homekit.setup, zeroconf_instance)
    mock_driver.assert_called_with(
        hass,
        entry.entry_id,
        BRIDGE_NAME,
        address="0.0.0.0",
        port=DEFAULT_PORT,
        persist_file=path,
        advertised_address="192.168.1.100",
        zeroconf_instance=zeroconf_instance,
    )
Esempio n. 23
0
async def test_homekit_start(hass, hk_driver, debounce_patcher):
    """Test HomeKit start method."""
    entry = await async_init_integration(hass)

    pin = b"123-45-678"
    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        {},
        {},
        DEFAULT_SAFE_MODE,
        advertise_ip=None,
        interface_choice=None,
        entry_id=entry.entry_id,
    )
    homekit.bridge = Mock()
    homekit.bridge.accessories = []
    homekit.driver = hk_driver
    homekit._filter = Mock(return_value=True)

    hass.states.async_set("light.demo", "on")
    state = hass.states.async_all()[0]

    with patch(
            f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory"
    ) as mock_add_acc, patch(
            f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch(
                "pyhap.accessory_driver.AccessoryDriver.add_accessory"
            ) as hk_driver_add_acc, patch(
                "pyhap.accessory_driver.AccessoryDriver.start"
            ) as hk_driver_start:
        await homekit.async_start()

    await hass.async_block_till_done()
    mock_add_acc.assert_called_with(state)
    mock_setup_msg.assert_called_with(hass, entry.entry_id, None, pin, ANY)
    hk_driver_add_acc.assert_called_with(homekit.bridge)
    assert hk_driver_start.called
    assert homekit.status == STATUS_RUNNING

    # Test start() if already started
    hk_driver_start.reset_mock()
    await homekit.async_start()
    await hass.async_block_till_done()
    assert not hk_driver_start.called
Esempio n. 24
0
    def test_homekit_setup(self):
        """Test setup of bridge and driver."""
        homekit = HomeKit(self.hass, DEFAULT_PORT, {}, {})

        with patch(PATH_HOMEKIT + '.accessories.HomeDriver') as mock_driver, \
                patch('homeassistant.util.get_local_ip') as mock_ip:
            mock_ip.return_value = IP_ADDRESS
            homekit.setup()

        path = self.hass.config.path(HOMEKIT_FILE)
        self.assertTrue(isinstance(homekit.bridge, HomeBridge))
        self.assertEqual(mock_driver.mock_calls, [
            call(homekit.bridge, DEFAULT_PORT, IP_ADDRESS, path)])

        # Test if stop listener is setup
        self.assertEqual(
            self.hass.bus.listeners.get(EVENT_HOMEASSISTANT_STOP), 1)
Esempio n. 25
0
async def test_homekit_stop(hass):
    """Test HomeKit stop method."""
    homekit = HomeKit(hass, None, None, None, None)
    homekit.driver = Mock()

    assert homekit.status == STATUS_READY
    await hass.async_add_job(homekit.stop)
    homekit.status = STATUS_WAIT
    await hass.async_add_job(homekit.stop)
    homekit.status = STATUS_STOPPED
    await hass.async_add_job(homekit.stop)
    assert homekit.driver.stop.called is False

    # Test if driver is started
    homekit.status = STATUS_RUNNING
    await hass.async_add_job(homekit.stop)
    assert homekit.driver.stop.called is True
Esempio n. 26
0
async def test_homekit_warn_add_accessory_bridge(hass, acc_category,
                                                 mock_zeroconf, caplog):
    """Test we warn when adding cameras or tvs to a bridge."""
    entry = await async_init_integration(hass)

    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        lambda entity_id: True,
        {},
        HOMEKIT_MODE_BRIDGE,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )
    homekit.driver = "driver"
    homekit.bridge = mock_bridge = Mock()
    homekit.bridge.accessories = range(10)

    mock_camera_acc = Mock(category=acc_category)

    await async_init_integration(hass)

    with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc:
        mock_get_acc.side_effect = [None, mock_camera_acc, None]
        homekit.add_bridge_accessory(State("light.demo", "on"))
        mock_get_acc.assert_called_with(hass, "driver", ANY, 1403373688, {})
        assert not mock_bridge.add_accessory.called

        homekit.add_bridge_accessory(State("camera.test", "on"))
        mock_get_acc.assert_called_with(hass, "driver", ANY, 1508819236, {})
        assert mock_bridge.add_accessory.called

    assert "accessory mode" in caplog.text
Esempio n. 27
0
async def test_homekit_setup_ip_address(hass, hk_driver):
    """Test setup with given IP address."""
    homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, '172.0.0.0', {}, {})

    with patch(PATH_HOMEKIT + '.accessories.HomeDriver',
               return_value=hk_driver) as mock_driver:
        await hass.async_add_job(homekit.setup)
    mock_driver.assert_called_with(
        hass, address='172.0.0.0', port=DEFAULT_PORT, persist_file=ANY)
Esempio n. 28
0
    def test_homekit_stop(self):
        """Test HomeKit stop method."""
        homekit = HomeKit(None, None, None, None, None)
        homekit.driver = Mock()

        # Test if started = False
        homekit.stop()
        self.assertFalse(homekit.driver.stop.called)

        # Test if driver not started
        homekit.started = True
        homekit.driver.configure_mock(**{'run_sentinel': None})
        homekit.stop()
        self.assertFalse(homekit.driver.stop.called)

        # Test if driver is started
        homekit.driver.configure_mock(**{'run_sentinel': 'sentinel'})
        homekit.stop()
        self.assertTrue(homekit.driver.stop.called)
Esempio n. 29
0
async def test_homekit_start_in_accessory_mode(hass, hk_driver, device_reg,
                                               debounce_patcher):
    """Test HomeKit start method in accessory mode."""
    entry = await async_init_integration(hass)

    pin = b"123-45-678"
    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        {},
        {},
        DEFAULT_SAFE_MODE,
        HOMEKIT_MODE_ACCESSORY,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )
    homekit.bridge = Mock()
    homekit.bridge.accessories = []
    homekit.driver = hk_driver
    # pylint: disable=protected-access
    homekit._filter = Mock(return_value=True)
    homekit.driver.accessory = Accessory(hk_driver, "any")

    hass.states.async_set("light.demo", "on")

    with patch(
            f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory"
    ) as mock_add_acc, patch(
            "pyhap.accessory_driver.AccessoryDriver.add_accessory"), patch(
                f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch(
                    "pyhap.accessory_driver.AccessoryDriver.start_service"
                ) as hk_driver_start:
        await homekit.async_start()

    await hass.async_block_till_done()
    mock_add_acc.assert_not_called()
    mock_setup_msg.assert_called_with(hass, entry.entry_id, None, pin, ANY)
    assert hk_driver_start.called
    assert homekit.status == STATUS_RUNNING
Esempio n. 30
0
async def test_homekit_stop(hass):
    """Test HomeKit stop method."""
    entry = await async_init_integration(hass)

    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        {},
        {},
        DEFAULT_SAFE_MODE,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )
    homekit.driver = Mock()

    await async_init_integration(hass)

    assert homekit.status == STATUS_READY
    await homekit.async_stop()
    await hass.async_block_till_done()
    homekit.status = STATUS_WAIT
    await homekit.async_stop()
    await hass.async_block_till_done()
    homekit.status = STATUS_STOPPED
    await homekit.async_stop()
    await hass.async_block_till_done()
    assert homekit.driver.stop.called is False

    # Test if driver is started
    homekit.status = STATUS_RUNNING
    await homekit.async_stop()
    await hass.async_block_till_done()
    assert homekit.driver.stop.called is True
Esempio n. 31
0
async def test_homekit_too_many_accessories(hass, hk_driver, caplog):
    """Test adding too many accessories to HomeKit."""
    entry = await async_init_integration(hass)

    entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], [])

    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        entity_filter,
        {},
        DEFAULT_SAFE_MODE,
        HOMEKIT_MODE_BRIDGE,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )

    def _mock_bridge(*_):
        mock_bridge = HomeBridge(hass, hk_driver, "mock_bridge")
        # The bridge itself counts as an accessory
        mock_bridge.accessories = range(MAX_DEVICES)
        return mock_bridge

    homekit.driver = hk_driver
    homekit.driver.accessory = Accessory(hk_driver, "any")

    hass.states.async_set("light.demo", "on")
    hass.states.async_set("light.demo2", "on")
    hass.states.async_set("light.demo3", "on")

    with patch("pyhap.accessory_driver.AccessoryDriver.start_service"), patch(
        "pyhap.accessory_driver.AccessoryDriver.add_accessory"
    ), patch(f"{PATH_HOMEKIT}.show_setup_message"), patch(
        f"{PATH_HOMEKIT}.accessories.HomeBridge", _mock_bridge
    ):
        await homekit.async_start()
        await hass.async_block_till_done()
        assert "would exceeded" in caplog.text
Esempio n. 32
0
    def test_homekit_class(self, mock_acc_driver):
        """Test interaction between the HomeKit class and pyhap."""
        with patch(PATH_HOMEKIT + '.accessories.HomeBridge') as mock_bridge:
            homekit = HomeKit(self.hass, 51826)
            homekit.setup_bridge(b'123-45-678')

        mock_bridge.reset_mock()
        self.hass.states.set('demo.demo1', 'on')
        self.hass.states.set('demo.demo2', 'off')

        with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc, \
            patch(PATH_HOMEKIT + '.import_types') as mock_import_types, \
                patch('homeassistant.util.get_local_ip') as mock_ip:
            mock_get_acc.side_effect = ['TempSensor', 'Window']
            mock_ip.return_value = IP_ADDRESS
            homekit.start_driver(Event(EVENT_HOMEASSISTANT_START))

        path = self.hass.config.path(HOMEKIT_FILE)

        self.assertEqual(mock_import_types.call_count, 1)
        self.assertEqual(mock_get_acc.call_count, 2)
        self.assertEqual(mock_bridge.mock_calls, [
            call().add_accessory('TempSensor'),
            call().add_accessory('Window')
        ])
        self.assertEqual(
            mock_acc_driver.mock_calls,
            [call(homekit.bridge, 51826, IP_ADDRESS, path),
             call().start()])
        mock_acc_driver.reset_mock()

        self.hass.bus.fire(EVENT_HOMEASSISTANT_STOP)
        self.hass.block_till_done()

        self.assertEqual(mock_acc_driver.mock_calls, [call().stop()])
Esempio n. 33
0
async def test_homekit_remove_accessory(hass):
    """Remove accessory from bridge."""
    entry = await async_init_integration(hass)

    homekit = HomeKit(
        hass,
        None,
        None,
        None,
        lambda entity_id: True,
        {},
        DEFAULT_SAFE_MODE,
        advertise_ip=None,
        entry_id=entry.entry_id,
    )
    homekit.driver = "driver"
    homekit.bridge = mock_bridge = Mock()
    mock_bridge.accessories = {"light.demo": "acc"}

    acc = homekit.remove_bridge_accessory("light.demo")
    assert acc == "acc"
    assert len(mock_bridge.accessories) == 0
Esempio n. 34
0
    def test_homekit_stop(self):
        """Test HomeKit stop method."""
        homekit = HomeKit(None, None, None, None)
        homekit.driver = Mock()

        # Test if started = False
        homekit.stop()
        self.assertFalse(homekit.driver.stop.called)

        # Test if driver not started
        homekit.started = True
        homekit.driver.configure_mock(**{'run_sentinel': None})
        homekit.stop()
        self.assertFalse(homekit.driver.stop.called)

        # Test if driver is started
        homekit.driver.configure_mock(**{'run_sentinel': 'sentinel'})
        homekit.stop()
        self.assertTrue(homekit.driver.stop.called)
Esempio n. 35
0
def _mock_homekit(hass, entry, homekit_mode, entity_filter=None):
    return HomeKit(
        hass=hass,
        name=BRIDGE_NAME,
        port=DEFAULT_PORT,
        ip_address=None,
        entity_filter=entity_filter or generate_filter([], [], [], []),
        exclude_accessory_mode=False,
        entity_config={},
        homekit_mode=homekit_mode,
        advertise_ip=None,
        entry_id=entry.entry_id,
        entry_title=entry.title,
    )
Esempio n. 36
0
async def test_homekit_add_accessory():
    """Add accessory if config exists and get_acc returns an accessory."""
    homekit = HomeKit('hass', None, None, None, lambda entity_id: True, {})
    homekit.driver = 'driver'
    homekit.bridge = mock_bridge = Mock()

    with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc:

        mock_get_acc.side_effect = [None, 'acc', None]
        homekit.add_bridge_accessory(State('light.demo', 'on'))
        mock_get_acc.assert_called_with('hass', 'driver', ANY, 363398124, {})
        assert not mock_bridge.add_accessory.called

        homekit.add_bridge_accessory(State('demo.test', 'on'))
        mock_get_acc.assert_called_with('hass', 'driver', ANY, 294192020, {})
        assert mock_bridge.add_accessory.called

        homekit.add_bridge_accessory(State('demo.test_2', 'on'))
        mock_get_acc.assert_called_with('hass', 'driver', ANY, 429982757, {})
        mock_bridge.add_accessory.assert_called_with('acc')
Esempio n. 37
0
async def test_homekit_add_accessory():
    """Add accessory if config exists and get_acc returns an accessory."""
    homekit = HomeKit('hass', None, None, lambda entity_id: True, {})
    homekit.driver = 'driver'
    homekit.bridge = mock_bridge = Mock()

    with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc:

        mock_get_acc.side_effect = [None, 'acc', None]
        homekit.add_bridge_accessory(State('light.demo', 'on'))
        mock_get_acc.assert_called_with('hass', 'driver', ANY, 363398124, {})
        assert not mock_bridge.add_accessory.called

        homekit.add_bridge_accessory(State('demo.test', 'on'))
        mock_get_acc.assert_called_with('hass', 'driver', ANY, 294192020, {})
        assert mock_bridge.add_accessory.called

        homekit.add_bridge_accessory(State('demo.test_2', 'on'))
        mock_get_acc.assert_called_with('hass', 'driver', ANY, 429982757, {})
        mock_bridge.add_accessory.assert_called_with('acc')
Esempio n. 38
0
    def test_homekit_add_accessory(self):
        """Add accessory if config exists and get_acc returns an accessory."""
        homekit = HomeKit(self.hass, None, lambda entity_id: True, {})
        homekit.bridge = HomeBridge(self.hass)

        with patch(PATH_HOMEKIT + '.accessories.HomeBridge.add_accessory') \
            as mock_add_acc, \
                patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc:
            mock_get_acc.side_effect = [None, 'acc', None]
            homekit.add_bridge_accessory(State('light.demo', 'on'))
            self.assertEqual(mock_get_acc.call_args,
                             call(self.hass, ANY, 363398124, {}))
            self.assertFalse(mock_add_acc.called)
            homekit.add_bridge_accessory(State('demo.test', 'on'))
            self.assertEqual(mock_get_acc.call_args,
                             call(self.hass, ANY, 294192020, {}))
            self.assertTrue(mock_add_acc.called)
            homekit.add_bridge_accessory(State('demo.test_2', 'on'))
            self.assertEqual(mock_get_acc.call_args,
                             call(self.hass, ANY, 429982757, {}))
            self.assertEqual(mock_add_acc.mock_calls, [call('acc')])
Esempio n. 39
0
    def test_homekit_entity_filter(self):
        """Test the entity filter."""
        entity_filter = generate_filter(['cover'], ['demo.test'], [], [])
        homekit = HomeKit(self.hass, None, entity_filter, {})

        with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc:
            mock_get_acc.return_value = None

            homekit.add_bridge_accessory(State('cover.test', 'open'))
            self.assertTrue(mock_get_acc.called)
            mock_get_acc.reset_mock()

            homekit.add_bridge_accessory(State('demo.test', 'on'))
            self.assertTrue(mock_get_acc.called)
            mock_get_acc.reset_mock()

            homekit.add_bridge_accessory(State('light.demo', 'light'))
            self.assertFalse(mock_get_acc.called)
Esempio n. 40
0
    def test_homekit_start(self, mock_add_bridge_acc, mock_show_setup_msg):
        """Test HomeKit start method."""
        homekit = HomeKit(self.hass, None, {}, {'cover.demo': {}})
        homekit.bridge = HomeBridge(self.hass)
        homekit.driver = Mock()

        self.hass.states.set('light.demo', 'on')
        state = self.hass.states.all()[0]

        homekit.start()

        self.assertEqual(mock_add_bridge_acc.mock_calls, [call(state)])
        self.assertEqual(mock_show_setup_msg.mock_calls, [
            call(self.hass, homekit.bridge)])
        self.assertEqual(homekit.driver.mock_calls, [call.start()])
        self.assertTrue(homekit.started)

        # Test start() if already started
        homekit.driver.reset_mock()
        homekit.start()
        self.assertEqual(homekit.driver.mock_calls, [])