mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 15:17:35 +00:00
Update bleak to 1.0.1 (#147742)
Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
parent
5287f4de81
commit
fca6dc264f
@ -15,12 +15,12 @@
|
||||
],
|
||||
"quality_scale": "internal",
|
||||
"requirements": [
|
||||
"bleak==0.22.3",
|
||||
"bleak-retry-connector==3.9.0",
|
||||
"bluetooth-adapters==0.21.4",
|
||||
"bleak==1.0.1",
|
||||
"bleak-retry-connector==4.0.0",
|
||||
"bluetooth-adapters==2.0.0",
|
||||
"bluetooth-auto-recovery==1.5.2",
|
||||
"bluetooth-data-tools==1.28.2",
|
||||
"dbus-fast==2.43.0",
|
||||
"habluetooth==3.49.0"
|
||||
"habluetooth==4.0.1"
|
||||
]
|
||||
}
|
||||
|
@ -22,5 +22,5 @@
|
||||
"integration_type": "device",
|
||||
"iot_class": "local_polling",
|
||||
"loggers": ["eq3btsmart"],
|
||||
"requirements": ["eq3btsmart==2.1.0", "bleak-esphome==2.16.0"]
|
||||
"requirements": ["eq3btsmart==2.1.0", "bleak-esphome==3.1.0"]
|
||||
}
|
||||
|
@ -19,7 +19,7 @@
|
||||
"requirements": [
|
||||
"aioesphomeapi==34.2.0",
|
||||
"esphome-dashboard-api==1.3.0",
|
||||
"bleak-esphome==2.16.0"
|
||||
"bleak-esphome==3.1.0"
|
||||
],
|
||||
"zeroconf": ["_esphomelib._tcp.local."]
|
||||
}
|
||||
|
@ -2,14 +2,42 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from microbot import MicroBotApiClient
|
||||
from collections.abc import Generator
|
||||
from contextlib import contextmanager
|
||||
|
||||
import bleak
|
||||
|
||||
from homeassistant.components import bluetooth
|
||||
from homeassistant.const import CONF_ACCESS_TOKEN, CONF_ADDRESS, Platform
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import ConfigEntryNotReady
|
||||
|
||||
from .coordinator import MicroBotConfigEntry, MicroBotDataUpdateCoordinator
|
||||
|
||||
@contextmanager
|
||||
def patch_unused_bleak_discover_import() -> Generator[None]:
|
||||
"""Patch bleak.discover import in microbot. It is unused and was removed in bleak 1.0.0."""
|
||||
|
||||
def getattr_bleak(name: str) -> object:
|
||||
if name == "discover":
|
||||
return None
|
||||
raise AttributeError
|
||||
|
||||
original_func = bleak.__dict__.get("__getattr__")
|
||||
bleak.__dict__["__getattr__"] = getattr_bleak
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
if original_func is not None:
|
||||
bleak.__dict__["__getattr__"] = original_func
|
||||
|
||||
|
||||
with patch_unused_bleak_discover_import():
|
||||
from microbot import MicroBotApiClient
|
||||
|
||||
from .coordinator import ( # noqa: E402
|
||||
MicroBotConfigEntry,
|
||||
MicroBotDataUpdateCoordinator,
|
||||
)
|
||||
|
||||
PLATFORMS: list[str] = [Platform.SWITCH]
|
||||
|
||||
|
@ -20,9 +20,9 @@ audioop-lts==0.2.1
|
||||
av==13.1.0
|
||||
awesomeversion==25.5.0
|
||||
bcrypt==4.3.0
|
||||
bleak-retry-connector==3.9.0
|
||||
bleak==0.22.3
|
||||
bluetooth-adapters==0.21.4
|
||||
bleak-retry-connector==4.0.0
|
||||
bleak==1.0.1
|
||||
bluetooth-adapters==2.0.0
|
||||
bluetooth-auto-recovery==1.5.2
|
||||
bluetooth-data-tools==1.28.2
|
||||
cached-ipaddress==0.10.0
|
||||
@ -34,7 +34,7 @@ dbus-fast==2.43.0
|
||||
fnv-hash-fast==1.5.0
|
||||
go2rtc-client==0.2.1
|
||||
ha-ffmpeg==3.2.2
|
||||
habluetooth==3.49.0
|
||||
habluetooth==4.0.1
|
||||
hass-nabucasa==0.106.0
|
||||
hassil==2.2.3
|
||||
home-assistant-bluetooth==1.13.1
|
||||
|
10
requirements_all.txt
generated
10
requirements_all.txt
generated
@ -616,13 +616,13 @@ bizkaibus==0.1.1
|
||||
|
||||
# homeassistant.components.eq3btsmart
|
||||
# homeassistant.components.esphome
|
||||
bleak-esphome==2.16.0
|
||||
bleak-esphome==3.1.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
bleak-retry-connector==3.9.0
|
||||
bleak-retry-connector==4.0.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
bleak==0.22.3
|
||||
bleak==1.0.1
|
||||
|
||||
# homeassistant.components.blebox
|
||||
blebox-uniapi==2.5.0
|
||||
@ -643,7 +643,7 @@ bluemaestro-ble==0.4.1
|
||||
# bluepy==1.3.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
bluetooth-adapters==0.21.4
|
||||
bluetooth-adapters==2.0.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
bluetooth-auto-recovery==1.5.2
|
||||
@ -1124,7 +1124,7 @@ ha-silabs-firmware-client==0.2.0
|
||||
habiticalib==0.4.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
habluetooth==3.49.0
|
||||
habluetooth==4.0.1
|
||||
|
||||
# homeassistant.components.cloud
|
||||
hass-nabucasa==0.106.0
|
||||
|
10
requirements_test_all.txt
generated
10
requirements_test_all.txt
generated
@ -550,13 +550,13 @@ bimmer-connected[china]==0.17.2
|
||||
|
||||
# homeassistant.components.eq3btsmart
|
||||
# homeassistant.components.esphome
|
||||
bleak-esphome==2.16.0
|
||||
bleak-esphome==3.1.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
bleak-retry-connector==3.9.0
|
||||
bleak-retry-connector==4.0.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
bleak==0.22.3
|
||||
bleak==1.0.1
|
||||
|
||||
# homeassistant.components.blebox
|
||||
blebox-uniapi==2.5.0
|
||||
@ -574,7 +574,7 @@ bluemaestro-ble==0.4.1
|
||||
# bluepy==1.3.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
bluetooth-adapters==0.21.4
|
||||
bluetooth-adapters==2.0.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
bluetooth-auto-recovery==1.5.2
|
||||
@ -985,7 +985,7 @@ ha-silabs-firmware-client==0.2.0
|
||||
habiticalib==0.4.0
|
||||
|
||||
# homeassistant.components.bluetooth
|
||||
habluetooth==3.49.0
|
||||
habluetooth==4.0.1
|
||||
|
||||
# homeassistant.components.cloud
|
||||
hass-nabucasa==0.106.0
|
||||
|
@ -27,6 +27,7 @@ PACKAGE_CHECK_VERSION_RANGE = {
|
||||
"aiohttp": "SemVer",
|
||||
"attrs": "CalVer",
|
||||
"awesomeversion": "CalVer",
|
||||
"bleak": "SemVer",
|
||||
"grpcio": "SemVer",
|
||||
"httpx": "SemVer",
|
||||
"mashumaro": "SemVer",
|
||||
@ -297,10 +298,6 @@ PYTHON_VERSION_CHECK_EXCEPTIONS: dict[str, dict[str, set[str]]] = {
|
||||
# - domain is the integration domain
|
||||
# - package is the package (can be transitive) referencing the dependency
|
||||
# - dependencyX should be the name of the referenced dependency
|
||||
"bluetooth": {
|
||||
# https://github.com/hbldh/bleak/pull/1718 (not yet released)
|
||||
"homeassistant": {"bleak"}
|
||||
},
|
||||
"python_script": {
|
||||
# Security audits are needed for each Python version
|
||||
"homeassistant": {"restrictedpython"}
|
||||
@ -501,17 +498,9 @@ def get_requirements(integration: Integration, packages: set[str]) -> set[str]:
|
||||
continue
|
||||
|
||||
# Check for restrictive version limits on Python
|
||||
if (
|
||||
(requires_python := metadata(package)["Requires-Python"])
|
||||
and not all(
|
||||
_is_dependency_version_range_valid(version_part, "SemVer")
|
||||
for version_part in requires_python.split(",")
|
||||
)
|
||||
# "bleak" is a transient dependency of 53 integrations, and we don't
|
||||
# want to add the whole list to PYTHON_VERSION_CHECK_EXCEPTIONS
|
||||
# This extra check can be removed when bleak is updated
|
||||
# https://github.com/hbldh/bleak/pull/1718
|
||||
and (package in packages or package != "bleak")
|
||||
if (requires_python := metadata(package)["Requires-Python"]) and not all(
|
||||
_is_dependency_version_range_valid(version_part, "SemVer")
|
||||
for version_part in requires_python.split(",")
|
||||
):
|
||||
needs_python_version_check_exception = True
|
||||
integration.add_warning_or_error(
|
||||
|
@ -1,11 +1,11 @@
|
||||
"""Tests for the Bluetooth integration."""
|
||||
|
||||
from collections.abc import Iterable
|
||||
from collections.abc import Generator, Iterable
|
||||
from contextlib import contextmanager
|
||||
import itertools
|
||||
import time
|
||||
from typing import Any
|
||||
from unittest.mock import MagicMock, patch
|
||||
from unittest.mock import MagicMock, PropertyMock, patch
|
||||
|
||||
from bleak import BleakClient
|
||||
from bleak.backends.scanner import AdvertisementData, BLEDevice
|
||||
@ -53,7 +53,6 @@ ADVERTISEMENT_DATA_DEFAULTS = {
|
||||
|
||||
BLE_DEVICE_DEFAULTS = {
|
||||
"name": None,
|
||||
"rssi": -127,
|
||||
"details": None,
|
||||
}
|
||||
|
||||
@ -89,7 +88,6 @@ def generate_ble_device(
|
||||
address: str | None = None,
|
||||
name: str | None = None,
|
||||
details: Any | None = None,
|
||||
rssi: int | None = None,
|
||||
**kwargs: Any,
|
||||
) -> BLEDevice:
|
||||
"""Generate a BLEDevice with defaults."""
|
||||
@ -100,8 +98,6 @@ def generate_ble_device(
|
||||
new["name"] = name
|
||||
if details is not None:
|
||||
new["details"] = details
|
||||
if rssi is not None:
|
||||
new["rssi"] = rssi
|
||||
for key, value in BLE_DEVICE_DEFAULTS.items():
|
||||
new.setdefault(key, value)
|
||||
return BLEDevice(**new)
|
||||
@ -215,34 +211,35 @@ def inject_bluetooth_service_info(
|
||||
|
||||
|
||||
@contextmanager
|
||||
def patch_all_discovered_devices(mock_discovered: list[BLEDevice]) -> None:
|
||||
def patch_all_discovered_devices(mock_discovered: list[BLEDevice]) -> Generator[None]:
|
||||
"""Mock all the discovered devices from all the scanners."""
|
||||
manager = _get_manager()
|
||||
original_history = {}
|
||||
scanners = list(
|
||||
itertools.chain(
|
||||
manager._connectable_scanners, manager._non_connectable_scanners
|
||||
)
|
||||
)
|
||||
for scanner in scanners:
|
||||
data = scanner.discovered_devices_and_advertisement_data
|
||||
original_history[scanner] = data.copy()
|
||||
data.clear()
|
||||
if scanners:
|
||||
data = scanners[0].discovered_devices_and_advertisement_data
|
||||
data.clear()
|
||||
data.update(
|
||||
{device.address: (device, MagicMock()) for device in mock_discovered}
|
||||
)
|
||||
yield
|
||||
for scanner in scanners:
|
||||
data = scanner.discovered_devices_and_advertisement_data
|
||||
data.clear()
|
||||
data.update(original_history[scanner])
|
||||
if scanners and getattr(scanners[0], "scanner", None):
|
||||
with patch.object(
|
||||
scanners[0].scanner.__class__,
|
||||
"discovered_devices_and_advertisement_data",
|
||||
new=PropertyMock(
|
||||
side_effect=[
|
||||
{
|
||||
device.address: (device, MagicMock())
|
||||
for device in mock_discovered
|
||||
},
|
||||
]
|
||||
+ [{}] * (len(scanners))
|
||||
),
|
||||
):
|
||||
yield
|
||||
else:
|
||||
yield
|
||||
|
||||
|
||||
@contextmanager
|
||||
def patch_discovered_devices(mock_discovered: list[BLEDevice]) -> None:
|
||||
def patch_discovered_devices(mock_discovered: list[BLEDevice]) -> Generator[None]:
|
||||
"""Mock the combined best path to discovered devices from all the scanners."""
|
||||
manager = _get_manager()
|
||||
original_all_history = manager._all_history
|
||||
@ -305,6 +302,9 @@ class MockBleakClient(BleakClient):
|
||||
"""Mock clear_cache."""
|
||||
return True
|
||||
|
||||
def set_disconnected_callback(self, callback, **kwargs):
|
||||
"""Mock set_disconnected_callback."""
|
||||
|
||||
|
||||
class FakeScannerMixin:
|
||||
def get_discovered_device_advertisement_data(
|
||||
|
@ -82,7 +82,6 @@ async def test_async_scanner_devices_by_address_connectable(
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -116,7 +115,6 @@ async def test_async_scanner_devices_by_address_non_connectable(
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
|
@ -54,7 +54,6 @@ async def test_remote_scanner(hass: HomeAssistant, name_2: str | None) -> None:
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -67,7 +66,6 @@ async def test_remote_scanner(hass: HomeAssistant, name_2: str | None) -> None:
|
||||
"44:44:33:11:23:45",
|
||||
name_2,
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv_2 = generate_advertisement_data(
|
||||
local_name=name_2,
|
||||
@ -80,7 +78,6 @@ async def test_remote_scanner(hass: HomeAssistant, name_2: str | None) -> None:
|
||||
"44:44:33:11:23:45",
|
||||
"wohandlonger",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv_3 = generate_advertisement_data(
|
||||
local_name="wohandlonger",
|
||||
@ -146,7 +143,6 @@ async def test_remote_scanner_expires_connectable(hass: HomeAssistant) -> None:
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -199,7 +195,6 @@ async def test_remote_scanner_expires_non_connectable(hass: HomeAssistant) -> No
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -272,7 +267,6 @@ async def test_base_scanner_connecting_behavior(hass: HomeAssistant) -> None:
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -376,7 +370,6 @@ async def test_device_with_ten_minute_advertising_interval(hass: HomeAssistant)
|
||||
"44:44:33:11:23:45",
|
||||
"bparasite",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
bparasite_device_adv = generate_advertisement_data(
|
||||
local_name="bparasite",
|
||||
@ -501,7 +494,6 @@ async def test_scanner_stops_responding(hass: HomeAssistant) -> None:
|
||||
"44:44:33:11:23:45",
|
||||
"bparasite",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
bparasite_device_adv = generate_advertisement_data(
|
||||
local_name="bparasite",
|
||||
@ -545,7 +537,6 @@ async def test_remote_scanner_bluetooth_config_entry(
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
|
@ -37,7 +37,7 @@ class FakeHaScanner(FakeScannerMixin, HaScanner):
|
||||
"""Return the discovered devices and advertisement data."""
|
||||
return {
|
||||
"44:44:33:11:23:45": (
|
||||
generate_ble_device(name="x", rssi=-127, address="44:44:33:11:23:45"),
|
||||
generate_ble_device(name="x", address="44:44:33:11:23:45"),
|
||||
generate_advertisement_data(local_name="x"),
|
||||
)
|
||||
}
|
||||
|
@ -78,11 +78,9 @@ async def test_advertisements_do_not_switch_adapters_for_no_reason(
|
||||
|
||||
address = "44:44:33:11:23:12"
|
||||
|
||||
switchbot_device_signal_100 = generate_ble_device(
|
||||
address, "wohand_signal_100", rssi=-100
|
||||
)
|
||||
switchbot_device_signal_100 = generate_ble_device(address, "wohand_signal_100")
|
||||
switchbot_adv_signal_100 = generate_advertisement_data(
|
||||
local_name="wohand_signal_100", service_uuids=[]
|
||||
local_name="wohand_signal_100", service_uuids=[], rssi=-100
|
||||
)
|
||||
inject_advertisement_with_source(
|
||||
hass, switchbot_device_signal_100, switchbot_adv_signal_100, HCI0_SOURCE_ADDRESS
|
||||
@ -93,11 +91,9 @@ async def test_advertisements_do_not_switch_adapters_for_no_reason(
|
||||
is switchbot_device_signal_100
|
||||
)
|
||||
|
||||
switchbot_device_signal_99 = generate_ble_device(
|
||||
address, "wohand_signal_99", rssi=-99
|
||||
)
|
||||
switchbot_device_signal_99 = generate_ble_device(address, "wohand_signal_99")
|
||||
switchbot_adv_signal_99 = generate_advertisement_data(
|
||||
local_name="wohand_signal_99", service_uuids=[]
|
||||
local_name="wohand_signal_99", service_uuids=[], rssi=-99
|
||||
)
|
||||
inject_advertisement_with_source(
|
||||
hass, switchbot_device_signal_99, switchbot_adv_signal_99, HCI0_SOURCE_ADDRESS
|
||||
@ -108,11 +104,9 @@ async def test_advertisements_do_not_switch_adapters_for_no_reason(
|
||||
is switchbot_device_signal_99
|
||||
)
|
||||
|
||||
switchbot_device_signal_98 = generate_ble_device(
|
||||
address, "wohand_good_signal", rssi=-98
|
||||
)
|
||||
switchbot_device_signal_98 = generate_ble_device(address, "wohand_good_signal")
|
||||
switchbot_adv_signal_98 = generate_advertisement_data(
|
||||
local_name="wohand_good_signal", service_uuids=[]
|
||||
local_name="wohand_good_signal", service_uuids=[], rssi=-98
|
||||
)
|
||||
inject_advertisement_with_source(
|
||||
hass, switchbot_device_signal_98, switchbot_adv_signal_98, HCI1_SOURCE_ADDRESS
|
||||
@ -805,13 +799,11 @@ async def test_goes_unavailable_connectable_only_and_recovers(
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_non_connectable = generate_ble_device(
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -978,7 +970,6 @@ async def test_goes_unavailable_dismisses_discovery_and_makes_discoverable(
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -1394,7 +1385,6 @@ async def test_bluetooth_rediscover(
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -1571,7 +1561,6 @@ async def test_bluetooth_rediscover_no_match(
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -1693,11 +1682,9 @@ async def test_async_register_disappeared_callback(
|
||||
"""Test bluetooth async_register_disappeared_callback handles failures."""
|
||||
address = "44:44:33:11:23:12"
|
||||
|
||||
switchbot_device_signal_100 = generate_ble_device(
|
||||
address, "wohand_signal_100", rssi=-100
|
||||
)
|
||||
switchbot_device_signal_100 = generate_ble_device(address, "wohand_signal_100")
|
||||
switchbot_adv_signal_100 = generate_advertisement_data(
|
||||
local_name="wohand_signal_100", service_uuids=[]
|
||||
local_name="wohand_signal_100", service_uuids=[], rssi=-100
|
||||
)
|
||||
inject_advertisement_with_source(
|
||||
hass, switchbot_device_signal_100, switchbot_adv_signal_100, "hci0"
|
||||
|
@ -124,7 +124,7 @@ async def test_wrapped_bleak_client_local_adapter_only(hass: HomeAssistant) -> N
|
||||
"bleak.backends.bluezdbus.client.BleakClientBlueZDBus.is_connected", True
|
||||
),
|
||||
):
|
||||
assert await client.connect() is True
|
||||
await client.connect()
|
||||
assert client.is_connected is True
|
||||
client.set_disconnected_callback(lambda client: None)
|
||||
await client.disconnect()
|
||||
@ -145,7 +145,6 @@ async def test_wrapped_bleak_client_set_disconnected_callback_after_connected(
|
||||
"source": "esp32_has_connection_slot",
|
||||
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
|
||||
},
|
||||
rssi=-40,
|
||||
)
|
||||
switchbot_proxy_device_adv_has_connection_slot = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -215,7 +214,7 @@ async def test_wrapped_bleak_client_set_disconnected_callback_after_connected(
|
||||
"bleak.backends.bluezdbus.client.BleakClientBlueZDBus.is_connected", True
|
||||
),
|
||||
):
|
||||
assert await client.connect() is True
|
||||
await client.connect()
|
||||
assert client.is_connected is True
|
||||
client.set_disconnected_callback(lambda client: None)
|
||||
await client.disconnect()
|
||||
@ -236,10 +235,9 @@ async def test_ble_device_with_proxy_client_out_of_connections_no_scanners(
|
||||
"source": "esp32",
|
||||
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
|
||||
},
|
||||
rssi=-30,
|
||||
)
|
||||
switchbot_adv = generate_advertisement_data(
|
||||
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}
|
||||
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}, rssi=-30
|
||||
)
|
||||
|
||||
inject_advertisement_with_source(
|
||||
@ -275,10 +273,9 @@ async def test_ble_device_with_proxy_client_out_of_connections(
|
||||
"source": "esp32",
|
||||
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
|
||||
},
|
||||
rssi=-30,
|
||||
)
|
||||
switchbot_adv = generate_advertisement_data(
|
||||
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}
|
||||
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}, rssi=-30
|
||||
)
|
||||
|
||||
class FakeScanner(FakeScannerMixin, BaseHaRemoteScanner):
|
||||
@ -340,10 +337,9 @@ async def test_ble_device_with_proxy_clear_cache(hass: HomeAssistant) -> None:
|
||||
"source": "esp32",
|
||||
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
|
||||
},
|
||||
rssi=-30,
|
||||
)
|
||||
switchbot_adv = generate_advertisement_data(
|
||||
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}
|
||||
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}, rssi=-30
|
||||
)
|
||||
|
||||
class FakeScanner(FakeScannerMixin, BaseHaRemoteScanner):
|
||||
@ -417,7 +413,6 @@ async def test_ble_device_with_proxy_client_out_of_connections_uses_best_availab
|
||||
"source": "esp32_has_connection_slot",
|
||||
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
|
||||
},
|
||||
rssi=-40,
|
||||
)
|
||||
switchbot_proxy_device_adv_has_connection_slot = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -511,7 +506,6 @@ async def test_ble_device_with_proxy_client_out_of_connections_uses_best_availab
|
||||
"source": "esp32_no_connection_slot",
|
||||
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
|
||||
},
|
||||
rssi=-30,
|
||||
)
|
||||
switchbot_proxy_device_no_connection_slot_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
@ -538,7 +532,6 @@ async def test_ble_device_with_proxy_client_out_of_connections_uses_best_availab
|
||||
"44:44:33:11:23:45",
|
||||
"wohand",
|
||||
{},
|
||||
rssi=-100,
|
||||
)
|
||||
switchbot_device_adv = generate_advertisement_data(
|
||||
local_name="wohand",
|
||||
|
@ -17,9 +17,7 @@ from . import generate_ble_device
|
||||
MOCK_BLE_DEVICE = generate_ble_device(
|
||||
"00:00:00:00:00:00",
|
||||
"any",
|
||||
delegate="",
|
||||
details={"path": "/dev/hci0/device"},
|
||||
rssi=-127,
|
||||
)
|
||||
|
||||
|
||||
|
@ -38,11 +38,9 @@ async def test_subscribe_advertisements(
|
||||
"""Test bluetooth subscribe_advertisements."""
|
||||
address = "44:44:33:11:23:12"
|
||||
|
||||
switchbot_device_signal_100 = generate_ble_device(
|
||||
address, "wohand_signal_100", rssi=-100
|
||||
)
|
||||
switchbot_device_signal_100 = generate_ble_device(address, "wohand_signal_100")
|
||||
switchbot_adv_signal_100 = generate_advertisement_data(
|
||||
local_name="wohand_signal_100", service_uuids=[]
|
||||
local_name="wohand_signal_100", service_uuids=[], rssi=-100
|
||||
)
|
||||
inject_advertisement_with_source(
|
||||
hass, switchbot_device_signal_100, switchbot_adv_signal_100, HCI0_SOURCE_ADDRESS
|
||||
@ -68,7 +66,7 @@ async def test_subscribe_advertisements(
|
||||
"connectable": True,
|
||||
"manufacturer_data": {},
|
||||
"name": "wohand_signal_100",
|
||||
"rssi": -127,
|
||||
"rssi": -100,
|
||||
"service_data": {},
|
||||
"service_uuids": [],
|
||||
"source": HCI0_SOURCE_ADDRESS,
|
||||
@ -134,11 +132,9 @@ async def test_subscribe_connection_allocations(
|
||||
"""Test bluetooth subscribe_connection_allocations."""
|
||||
address = "44:44:33:11:23:12"
|
||||
|
||||
switchbot_device_signal_100 = generate_ble_device(
|
||||
address, "wohand_signal_100", rssi=-100
|
||||
)
|
||||
switchbot_device_signal_100 = generate_ble_device(address, "wohand_signal_100")
|
||||
switchbot_adv_signal_100 = generate_advertisement_data(
|
||||
local_name="wohand_signal_100", service_uuids=[]
|
||||
local_name="wohand_signal_100", service_uuids=[], rssi=-100
|
||||
)
|
||||
inject_advertisement_with_source(
|
||||
hass, switchbot_device_signal_100, switchbot_adv_signal_100, HCI0_SOURCE_ADDRESS
|
||||
|
@ -92,17 +92,13 @@ class FakeBleakClient(BaseFakeBleakClient):
|
||||
|
||||
async def connect(self, *args, **kwargs):
|
||||
"""Connect."""
|
||||
|
||||
@property
|
||||
def is_connected(self):
|
||||
"""Connected."""
|
||||
return True
|
||||
|
||||
|
||||
class FakeBleakClientFailsToConnect(BaseFakeBleakClient):
|
||||
"""Fake bleak client that fails to connect."""
|
||||
|
||||
async def connect(self, *args, **kwargs):
|
||||
"""Connect."""
|
||||
return False
|
||||
|
||||
|
||||
class FakeBleakClientRaisesOnConnect(BaseFakeBleakClient):
|
||||
"""Fake bleak client that raises on connect."""
|
||||
|
||||
@ -110,6 +106,11 @@ class FakeBleakClientRaisesOnConnect(BaseFakeBleakClient):
|
||||
"""Connect."""
|
||||
raise ConnectionError("Test exception")
|
||||
|
||||
@property
|
||||
def is_connected(self):
|
||||
"""Not connected."""
|
||||
return False
|
||||
|
||||
|
||||
def _generate_ble_device_and_adv_data(
|
||||
interface: str, mac: str, rssi: int
|
||||
@ -119,7 +120,6 @@ def _generate_ble_device_and_adv_data(
|
||||
generate_ble_device(
|
||||
mac,
|
||||
"any",
|
||||
delegate="",
|
||||
details={"path": f"/org/bluez/{interface}/dev_{mac}"},
|
||||
),
|
||||
generate_advertisement_data(rssi=rssi),
|
||||
@ -144,16 +144,6 @@ def mock_platform_client_fixture():
|
||||
yield
|
||||
|
||||
|
||||
@pytest.fixture(name="mock_platform_client_that_fails_to_connect")
|
||||
def mock_platform_client_that_fails_to_connect_fixture():
|
||||
"""Fixture that mocks the platform client that fails to connect."""
|
||||
with patch(
|
||||
"habluetooth.wrappers.get_platform_client_backend_type",
|
||||
return_value=FakeBleakClientFailsToConnect,
|
||||
):
|
||||
yield
|
||||
|
||||
|
||||
@pytest.fixture(name="mock_platform_client_that_raises_on_connect")
|
||||
def mock_platform_client_that_raises_on_connect_fixture():
|
||||
"""Fixture that mocks the platform client that fails to connect."""
|
||||
@ -219,7 +209,8 @@ async def test_test_switch_adapters_when_out_of_slots(
|
||||
):
|
||||
ble_device = hci0_device_advs["00:00:00:00:00:01"][0]
|
||||
client = bleak.BleakClient(ble_device)
|
||||
assert await client.connect() is True
|
||||
await client.connect()
|
||||
assert client.is_connected is True
|
||||
assert allocate_slot_mock.call_count == 1
|
||||
assert release_slot_mock.call_count == 0
|
||||
|
||||
@ -251,7 +242,8 @@ async def test_test_switch_adapters_when_out_of_slots(
|
||||
):
|
||||
ble_device = hci0_device_advs["00:00:00:00:00:03"][0]
|
||||
client = bleak.BleakClient(ble_device)
|
||||
assert await client.connect() is True
|
||||
await client.connect()
|
||||
assert client.is_connected is True
|
||||
assert release_slot_mock.call_count == 0
|
||||
|
||||
cancel_hci0()
|
||||
@ -262,7 +254,7 @@ async def test_test_switch_adapters_when_out_of_slots(
|
||||
async def test_release_slot_on_connect_failure(
|
||||
hass: HomeAssistant,
|
||||
install_bleak_catcher,
|
||||
mock_platform_client_that_fails_to_connect,
|
||||
mock_platform_client_that_raises_on_connect,
|
||||
) -> None:
|
||||
"""Ensure the slot gets released on connection failure."""
|
||||
manager = _get_manager()
|
||||
@ -278,7 +270,9 @@ async def test_release_slot_on_connect_failure(
|
||||
):
|
||||
ble_device = hci0_device_advs["00:00:00:00:00:01"][0]
|
||||
client = bleak.BleakClient(ble_device)
|
||||
assert await client.connect() is False
|
||||
with pytest.raises(ConnectionError):
|
||||
await client.connect()
|
||||
assert client.is_connected is False
|
||||
assert allocate_slot_mock.call_count == 1
|
||||
assert release_slot_mock.call_count == 1
|
||||
|
||||
@ -335,13 +329,18 @@ async def test_passing_subclassed_str_as_address(
|
||||
|
||||
async def connect(self, *args, **kwargs):
|
||||
"""Connect."""
|
||||
|
||||
@property
|
||||
def is_connected(self):
|
||||
"""Connected."""
|
||||
return True
|
||||
|
||||
with patch(
|
||||
"habluetooth.wrappers.get_platform_client_backend_type",
|
||||
return_value=FakeBleakClient,
|
||||
):
|
||||
assert await client.connect() is True
|
||||
await client.connect()
|
||||
assert client.is_connected is True
|
||||
|
||||
cancel_hci0()
|
||||
cancel_hci1()
|
||||
|
@ -55,4 +55,4 @@ async def test_client_usage_while_not_connected(client_data: ESPHomeClientData)
|
||||
with pytest.raises(
|
||||
BleakError, match=f"{ESP_NAME}.*{ESP_MAC_ADDRESS}.*not connected"
|
||||
):
|
||||
assert await client.write_gatt_char("test", b"test") is False
|
||||
assert await client.write_gatt_char("test", b"test", False) is False
|
||||
|
Loading…
x
Reference in New Issue
Block a user