Browse Source

fix: add guard to parse_advertisement_data for empty data (#73)

J. Nick Koston 1 year ago
parent
commit
da189e6651
2 changed files with 14 additions and 1 deletions
  1. 2 0
      switchbot/adv_parser.py
  2. 12 1
      tests/test_adv_parser.py

+ 2 - 0
switchbot/adv_parser.py

@@ -80,6 +80,8 @@ def parse_advertisement_data(
     if not _services:
         return None
     _service_data = _services[0]
+    if not _service_data:
+        return None
     _mfr_data = _mgr_datas[0] if _mgr_datas else None
     _model = chr(_service_data[0] & 0b01111111)
 

+ 12 - 1
tests/test_adv_parser.py

@@ -29,8 +29,19 @@ def test_parse_advertisement_data_curtain():
             },
             "isEncrypted": False,
             "model": "c",
-            "model_friendly_name": "Curtain",
+            "modelFriendlyName": "Curtain",
             "modelName": "WoCurtain",
         },
         device=ble_device,
     )
+
+
+def test_parse_advertisement_data_empty():
+    """Test parse_advertisement_data with empty data does not blow up."""
+    ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
+    adv_data = AdvertisementData(
+        manufacturer_data={2409: b"\xe7\xabF\xac\x8f\x92|\x0f\x00\x11\x04"},
+        service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b""},
+    )
+    result = parse_advertisement_data(ble_device, adv_data)
+    assert result is None