--- /dev/null
+package mdns
+
+import (
+ "testing"
+
+ "github.com/davecgh/go-spew/spew"
+ "net"
+ "reflect"
+ "time"
+)
+
+var wantEvents = []LANPeerEvent{
+ {IP: []net.IP{net.IPv4(1, 2, 3, 4)}, Port: 1024},
+ {IP: []net.IP{net.IPv4(1, 2, 3, 4), net.IPv4(5, 6, 7, 8)}, Port: 1024},
+}
+
+type mockProtocol struct {
+ entries chan *LANPeerEvent
+}
+
+func newMockProtocol() *mockProtocol {
+ return &mockProtocol{
+ entries: make(chan *LANPeerEvent, 1024),
+ }
+}
+func (m *mockProtocol) registerService(port int) error {
+ return nil
+}
+
+func (m *mockProtocol) registerResolver(event chan LANPeerEvent) error {
+ for _, peerEvent := range wantEvents {
+ event <- peerEvent
+ }
+ return nil
+}
+
+func (m *mockProtocol) stopService() {
+
+}
+
+func (m *mockProtocol) stopResolver() {
+
+}
+
+func TestLanDiscover(t *testing.T) {
+ lanDiscv := NewLANDiscover(newMockProtocol(), 12345)
+ defer lanDiscv.Stop()
+
+ lanPeerMsgSub, err := lanDiscv.Subscribe()
+ if err != nil {
+ t.Fatal("subscribe lan peer msg err")
+ }
+
+ var gotevents = []LANPeerEvent{}
+ timeout := time.After(1 * time.Second)
+ for {
+ select {
+ case obj, ok := <-lanPeerMsgSub.Chan():
+ if !ok {
+ t.Fatal("subscription channel closed")
+ return
+ }
+
+ ev, ok := obj.Data.(LANPeerEvent)
+ if !ok {
+ t.Fatal("event type error")
+ continue
+ }
+ gotevents = append(gotevents, ev)
+ case <-timeout:
+ if !reflect.DeepEqual(gotevents, wantEvents) {
+ t.Fatalf("mismatch for test lan discover got %s want %s", spew.Sdump(gotevents), spew.Sdump(wantEvents))
+ }
+ return
+ }
+ }
+}