func TestContainer(t *testing.T) { acc1 := accessory.New(info) info.Name = "Accessory2" acc2 := accessory.New(info) if is, want := acc1.GetID(), model.InvalidID; is != want { t.Fatalf("is=%v want=%v", is, want) } if is, want := acc2.GetID(), model.InvalidID; is != want { t.Fatalf("is=%v want=%v", is, want) } c := NewContainer() c.AddAccessory(acc1) c.AddAccessory(acc2) if is, want := len(c.Accessories), 2; is != want { t.Fatalf("is=%v want=%v", is, want) } if x := acc1.GetID(); x == model.InvalidID { t.Fatal(x) } if x := acc2.GetID(); x == model.InvalidID { t.Fatal(x) } if acc1.GetID() == acc2.GetID() { t.Fatal("equal ids not allowed") } c.RemoveAccessory(acc2) if is, want := len(c.Accessories), 1; is != want { t.Fatalf("is=%v want=%v", is, want) } }
func TestGetAccessories(t *testing.T) { info := model.Info{ Name: "My Accessory", SerialNumber: "001", Manufacturer: "Google", Model: "Accessory", } a := accessory.New(info) m := container.NewContainer() m.AddAccessory(a) controller := NewContainerController(m) var b bytes.Buffer r, err := controller.HandleGetAccessories(&b) if err != nil { t.Fatal(err) } if r == nil { t.Fatal("no response") } bytes, _ := ioutil.ReadAll(r) var returnedContainer container.Container if err := json.Unmarshal(bytes, &returnedContainer); err != nil { t.Fatal(err) } if returnedContainer.Equal(m) == false { t.Fatal("containers not the same") } }
func TestAccessoryCount(t *testing.T) { accessory := accessory.New(info) c := NewContainer() c.AddAccessory(accessory) if is, want := len(c.Accessories), 1; is != want { t.Fatalf("is=%v want=%v", is, want) } c.RemoveAccessory(accessory) if is, want := len(c.Accessories), 0; is != want { t.Fatalf("is=%v want=%v", is, want) } }
func TestCharacteristicNotification(t *testing.T) { a := accessory.New(info) c := container.NewContainer() c.AddAccessory(a) buffer, err := Body(a, a.Info.Name.Characteristic) if err != nil { t.Fatal(err) } bytes, err := ioutil.ReadAll(buffer) if err != nil { t.Fatal(err) } if is, want := string(bytes), `{"characteristics":[{"aid":1,"iid":2,"value":"My Bridge"}]}`; is != want { t.Fatalf("is=%v want=%v", is, want) } }
func TestGetCharacteristic(t *testing.T) { info := model.Info{ Name: "My Bridge", SerialNumber: "001", Manufacturer: "Google", Model: "Bridge", } a := accessory.New(info) m := container.NewContainer() m.AddAccessory(a) aid := a.GetID() cid := a.Info.Name.GetID() values := idsString(aid, cid) controller := NewCharacteristicController(m) res, err := controller.HandleGetCharacteristics(values) if err != nil { t.Fatal(err) } b, err := ioutil.ReadAll(res) if err != nil { t.Fatal(err) } var chars data.Characteristics err = json.Unmarshal(b, &chars) if err != nil { t.Fatal(err) } if is, want := len(chars.Characteristics), 1; is != want { t.Fatalf("is=%v want=%v", is, want) } if x := chars.Characteristics[0].Value; x != "My Bridge" { t.Fatal(x) } }
func TestCharacteristicNotificationResponse(t *testing.T) { a := accessory.New(info) resp, err := New(a, a.Info.Name.Characteristic) if err != nil { t.Fatal(err) } var buffer = new(bytes.Buffer) resp.Write(buffer) bytes, err := ioutil.ReadAll(buffer) if err != nil { t.Fatal(err) } bytes = FixProtocolSpecifier(bytes) if x := string(bytes); strings.HasPrefix(x, "EVENT/1.0 200 OK") == false { t.Fatal(x) } }
// This app can connect to the UVR1611 data bus and provide the sensor values to HomeKit clients // // Optimizations: To improve the performance on a Raspberry Pi B+, the interrupt handler of the // gpio pin is removed every time after successfully decoding a packet. This allows other goroutines // (e.g. HAP server) to do their job more quickly. func main() { var ( pin = flag.String("pin", "", "Accessory pin required for pairing") mode = flag.String("conn", "mock", "Connection type; mock, gpio, replay") file = flag.String("file", "", "Log file from which to replay packets") port = flag.String("port", "P8_07", "GPIO port; default P8_07") timeout = flag.Int("timeout", 120, "Timeout in seconds until accessories are not reachable") ) flag.Parse() sensors = map[string]*hkuvr1611.Sensor{} info := InfoForAccessoryName("UVR1611") uvrAccessory = accessory.New(info, accessory.TypeBridge) timer_duration := time.Duration(*timeout) * time.Second timer = time.AfterFunc(timer_duration, func() { log.Println("[INFO] Not Reachable") if transport != nil { sensors = map[string]*hkuvr1611.Sensor{} transport.Stop() transport = nil } }) var conn Connection callback := func(packet uvr1611.Packet) { sensors := HandlePacket(packet) if transport == nil { config := hap.Config{Pin: *pin} if t, err := hap.NewIPTransport(config, uvrAccessory, sensors...); err != nil { log.Fatal(err) } else { go func() { t.Start() }() transport = t } } timer.Reset(timer_duration) } switch *mode { case "mock": conn = mock.NewConnection(callback) case "replay": conn = mock.NewReplayConnection(*file, callback) case "gpio": conn = gpio.NewConnection(*port, callback) default: log.Fatal("Incorrect -conn flag") } hap.OnTermination(func() { if transport != nil { transport.Stop() } conn.Close() timer.Stop() os.Exit(1) }) select {} }