penguin/homekey-go

homekey-go

internal/blegateway/discovery_test.go

raw ยท 1853 bytes

package blegateway

import (
	"github.com/godbus/dbus/v5"
	"testing"
)

func TestDiscoveryFiltersReadersAndFindsAdapters(t *testing.T) {
	props := func(values map[string]any) map[string]dbus.Variant {
		p := map[string]dbus.Variant{}
		for k, v := range values {
			p[k] = dbus.MakeVariant(v)
		}
		return p
	}
	o := objects{
		"/org/bluez/hci1":                {"org.bluez.Adapter1": props(map[string]any{"Alias": "USB Bluetooth", "Address": "AA:00:00:00:00:01", "Powered": true})},
		"/org/bluez/hci0":                {"org.bluez.Adapter1": props(map[string]any{"Alias": "Internal", "Powered": false})},
		"/org/bluez/hci1/dev_reader":     {"org.bluez.Device1": props(map[string]any{"Name": "Test reader", "Address": "70:af:09:16:42:5a", "Adapter": dbus.ObjectPath("/org/bluez/hci1"), "UUIDs": []string{ServiceUUID}})},
		"/org/bluez/hci1/dev_headphones": {"org.bluez.Device1": props(map[string]any{"Name": "Headphones", "Address": "11:22:33:44:55:66", "Adapter": dbus.ObjectPath("/org/bluez/hci1")})},
		"/org/bluez/hci1/dev_known":      {"org.bluez.Device1": props(map[string]any{"Alias": "Configured reader", "Address": "AA:BB:CC:DD:EE:FF", "Adapter": dbus.ObjectPath("/org/bluez/hci1")})},
	}
	d := discoverySnapshot(o, map[string]bool{"AA:BB:CC:DD:EE:FF": true})
	if len(d.Adapters) != 2 || d.Adapters[0].ID != "hci0" || !d.Adapters[1].Powered {
		t.Fatalf("bad adapters: %+v", d.Adapters)
	}
	if len(d.Readers) != 2 || d.Readers[0].Address != "70:AF:09:16:42:5A" || d.Readers[0].Adapter != "hci1" {
		t.Fatalf("bad readers: %+v", d.Readers)
	}
	o["/org/bluez/hci1/service"] = map[string]map[string]dbus.Variant{"org.bluez.GattService1": props(map[string]any{"UUID": ServiceUUID, "Device": dbus.ObjectPath("/org/bluez/hci1/dev_known")})}
	if d := discoverySnapshot(o, nil); len(d.Readers) != 2 {
		t.Fatal("known GATT service not detected")
	}
}