Prefilter noisy apple devices from bluetooth (#77808)

This commit is contained in:
J. Nick Koston 2022-09-04 20:57:40 -04:00 committed by GitHub
parent c5100d2895
commit 804e4ab989
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 106 additions and 40 deletions

View file

@ -1291,16 +1291,16 @@ async def test_register_callback_by_manufacturer_id(
cancel = bluetooth.async_register_callback(
hass,
_fake_subscriber,
{MANUFACTURER_ID: 76},
{MANUFACTURER_ID: 21},
BluetoothScanningMode.ACTIVE,
)
assert len(mock_bleak_scanner_start.mock_calls) == 1
apple_device = BLEDevice("44:44:33:11:23:45", "apple")
apple_device = BLEDevice("44:44:33:11:23:45", "rtx")
apple_adv = AdvertisementData(
local_name="apple",
manufacturer_data={76: b"\xd8.\xad\xcd\r\x85"},
local_name="rtx",
manufacturer_data={21: b"\xd8.\xad\xcd\r\x85"},
)
inject_advertisement(hass, apple_device, apple_adv)
@ -1316,9 +1316,59 @@ async def test_register_callback_by_manufacturer_id(
assert len(callbacks) == 1
service_info: BluetoothServiceInfo = callbacks[0][0]
assert service_info.name == "apple"
assert service_info.manufacturer == "Apple, Inc."
assert service_info.manufacturer_id == 76
assert service_info.name == "rtx"
assert service_info.manufacturer == "RTX Telecom A/S"
assert service_info.manufacturer_id == 21
async def test_filtering_noisy_apple_devices(
hass, mock_bleak_scanner_start, enable_bluetooth
):
"""Test filtering noisy apple devices."""
mock_bt = []
callbacks = []
def _fake_subscriber(
service_info: BluetoothServiceInfo, change: BluetoothChange
) -> None:
"""Fake subscriber for the BleakScanner."""
callbacks.append((service_info, change))
with patch(
"homeassistant.components.bluetooth.async_get_bluetooth", return_value=mock_bt
):
await async_setup_with_default_adapter(hass)
with patch.object(hass.config_entries.flow, "async_init"):
hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED)
await hass.async_block_till_done()
cancel = bluetooth.async_register_callback(
hass,
_fake_subscriber,
{MANUFACTURER_ID: 21},
BluetoothScanningMode.ACTIVE,
)
assert len(mock_bleak_scanner_start.mock_calls) == 1
apple_device = BLEDevice("44:44:33:11:23:45", "rtx")
apple_adv = AdvertisementData(
local_name="noisy",
manufacturer_data={76: b"\xd8.\xad\xcd\r\x85"},
)
inject_advertisement(hass, apple_device, apple_adv)
empty_device = BLEDevice("11:22:33:44:55:66", "empty")
empty_adv = AdvertisementData(local_name="empty")
inject_advertisement(hass, empty_device, empty_adv)
await hass.async_block_till_done()
cancel()
assert len(callbacks) == 0
async def test_register_callback_by_address_connectable_manufacturer_id(
@ -1346,21 +1396,21 @@ async def test_register_callback_by_address_connectable_manufacturer_id(
cancel = bluetooth.async_register_callback(
hass,
_fake_subscriber,
{MANUFACTURER_ID: 76, CONNECTABLE: False, ADDRESS: "44:44:33:11:23:45"},
{MANUFACTURER_ID: 21, CONNECTABLE: False, ADDRESS: "44:44:33:11:23:45"},
BluetoothScanningMode.ACTIVE,
)
assert len(mock_bleak_scanner_start.mock_calls) == 1
apple_device = BLEDevice("44:44:33:11:23:45", "apple")
apple_device = BLEDevice("44:44:33:11:23:45", "rtx")
apple_adv = AdvertisementData(
local_name="apple",
manufacturer_data={76: b"\xd8.\xad\xcd\r\x85"},
local_name="rtx",
manufacturer_data={21: b"\xd8.\xad\xcd\r\x85"},
)
inject_advertisement(hass, apple_device, apple_adv)
apple_device_wrong_address = BLEDevice("44:44:33:11:23:46", "apple")
apple_device_wrong_address = BLEDevice("44:44:33:11:23:46", "rtx")
inject_advertisement(hass, apple_device_wrong_address, apple_adv)
await hass.async_block_till_done()
@ -1370,9 +1420,9 @@ async def test_register_callback_by_address_connectable_manufacturer_id(
assert len(callbacks) == 1
service_info: BluetoothServiceInfo = callbacks[0][0]
assert service_info.name == "apple"
assert service_info.manufacturer == "Apple, Inc."
assert service_info.manufacturer_id == 76
assert service_info.name == "rtx"
assert service_info.manufacturer == "RTX Telecom A/S"
assert service_info.manufacturer_id == 21
async def test_register_callback_by_manufacturer_id_and_address(
@ -1400,19 +1450,19 @@ async def test_register_callback_by_manufacturer_id_and_address(
cancel = bluetooth.async_register_callback(
hass,
_fake_subscriber,
{MANUFACTURER_ID: 76, ADDRESS: "44:44:33:11:23:45"},
{MANUFACTURER_ID: 21, ADDRESS: "44:44:33:11:23:45"},
BluetoothScanningMode.ACTIVE,
)
assert len(mock_bleak_scanner_start.mock_calls) == 1
apple_device = BLEDevice("44:44:33:11:23:45", "apple")
apple_adv = AdvertisementData(
local_name="apple",
manufacturer_data={76: b"\xd8.\xad\xcd\r\x85"},
rtx_device = BLEDevice("44:44:33:11:23:45", "rtx")
rtx_adv = AdvertisementData(
local_name="rtx",
manufacturer_data={21: b"\xd8.\xad\xcd\r\x85"},
)
inject_advertisement(hass, apple_device, apple_adv)
inject_advertisement(hass, rtx_device, rtx_adv)
yale_device = BLEDevice("44:44:33:11:23:45", "apple")
yale_adv = AdvertisementData(
@ -1426,7 +1476,7 @@ async def test_register_callback_by_manufacturer_id_and_address(
other_apple_device = BLEDevice("44:44:33:11:23:22", "apple")
other_apple_adv = AdvertisementData(
local_name="apple",
manufacturer_data={76: b"\xd8.\xad\xcd\r\x85"},
manufacturer_data={21: b"\xd8.\xad\xcd\r\x85"},
)
inject_advertisement(hass, other_apple_device, other_apple_adv)
@ -1435,9 +1485,9 @@ async def test_register_callback_by_manufacturer_id_and_address(
assert len(callbacks) == 1
service_info: BluetoothServiceInfo = callbacks[0][0]
assert service_info.name == "apple"
assert service_info.manufacturer == "Apple, Inc."
assert service_info.manufacturer_id == 76
assert service_info.name == "rtx"
assert service_info.manufacturer == "RTX Telecom A/S"
assert service_info.manufacturer_id == 21
async def test_register_callback_by_service_uuid_and_address(
@ -1603,31 +1653,31 @@ async def test_register_callback_by_local_name(
cancel = bluetooth.async_register_callback(
hass,
_fake_subscriber,
{LOCAL_NAME: "apple"},
{LOCAL_NAME: "rtx"},
BluetoothScanningMode.ACTIVE,
)
assert len(mock_bleak_scanner_start.mock_calls) == 1
apple_device = BLEDevice("44:44:33:11:23:45", "apple")
apple_adv = AdvertisementData(
local_name="apple",
manufacturer_data={76: b"\xd8.\xad\xcd\r\x85"},
rtx_device = BLEDevice("44:44:33:11:23:45", "rtx")
rtx_adv = AdvertisementData(
local_name="rtx",
manufacturer_data={21: b"\xd8.\xad\xcd\r\x85"},
)
inject_advertisement(hass, apple_device, apple_adv)
inject_advertisement(hass, rtx_device, rtx_adv)
empty_device = BLEDevice("11:22:33:44:55:66", "empty")
empty_adv = AdvertisementData(local_name="empty")
inject_advertisement(hass, empty_device, empty_adv)
apple_device_2 = BLEDevice("44:44:33:11:23:45", "apple")
apple_adv_2 = AdvertisementData(
local_name="apple2",
manufacturer_data={76: b"\xd8.\xad\xcd\r\x85"},
rtx_device_2 = BLEDevice("44:44:33:11:23:45", "rtx")
rtx_adv_2 = AdvertisementData(
local_name="rtx2",
manufacturer_data={21: b"\xd8.\xad\xcd\r\x85"},
)
inject_advertisement(hass, apple_device_2, apple_adv_2)
inject_advertisement(hass, rtx_device_2, rtx_adv_2)
await hass.async_block_till_done()
@ -1636,9 +1686,9 @@ async def test_register_callback_by_local_name(
assert len(callbacks) == 1
service_info: BluetoothServiceInfo = callbacks[0][0]
assert service_info.name == "apple"
assert service_info.manufacturer == "Apple, Inc."
assert service_info.manufacturer_id == 76
assert service_info.name == "rtx"
assert service_info.manufacturer == "RTX Telecom A/S"
assert service_info.manufacturer_id == 21
async def test_register_callback_by_local_name_overly_broad(